Fórum témák
» Több friss téma |
WinAVR / GCC alapszabályok: 1. Ha ISR-ben használsz globális változót, az legyen "volatile" 2. Soha ne érjen véget a main() függvény 3. UART/USART hibák 99,9% a rossz órajel miatt van 4. Kerüld el a -O0 optimalizációs beállítást minden áron 5. Ha nem jó a _delay időzítése, akkor túllépted a 65ms-et, vagy rossz az optimalizációs beállítás 6. Ha a PORTC-n nem működik valami, kapcsold ki a JTAG-et Bővebben: AVR-libc FAQ
Hát olcsón meg lehetne oldani mert az adó és a vevő is egy ezres körül mozog. A kód picre ott van a kapcsolások között de abban olyan picek meg modulok vannak amik nincsenek mo-n. Szóval azt a kódot kéne átírni avr-re és annyival ki kéne bővíteni hogy a vevő több kódot kezeljen és minden kimenethez külön kód legyen. Szóval öt adó és öt led mindre 1-1.
Lenne még egy kérdésem:
AVR-t lehet rs 232-es proton más alkatrész nélkül programozni? Esetleg van még printer meg usb de azokat nem hiszem. Nincs most itt semmi olyan alkatrészem és attiny45-öt szeretnék programozni.
Persze , minden megoldható....
Számoljunk: alsó hangon 8-10 nap. Szorozzak órabérrel vagy inkább ne? Pénzes munkára én is vállkozom... ENC, AVR : nézd meg a Ethernet + AVR + arduino részt. Szerintem ennél egyszerűbbet nem találsz. Illetve a rádiós kapcsolathoz a jeelabs-t. Most mit vársz? 1 eft/db-ért valaki írja át, fejleszzse le, tesztelje? Esetleg dobozolva gyártsa is le? Programozásra: LPT (STK200 vagy SuperLowCost programmer). USB-re egyszerű nincs.
Hali!
Programozás/matematikai kérdéssel fordulnék hozzátok. Adott egy 16bites szám, aminek a 40%-ra lenne szükségem. ASM-ben programozok, törekedek a minél egyszerűbb felé. Megcsináltam, hogy a számot elosztom 10-el, (ami 10%) és ezt az értéket 4x összeadom. Ez szép és jó, csak nem minden esetben pontos. Matematikailag: (Z/10)x4 nem= Zx0,4 Sajnos. Van rá valami ötletetek, hogy hogyan lehet megoldani, hogy minél több értékes bitem megmaradjon. Elég csak a séma, le tudom programozni. Üdv Kiborg
Gondolom az nem megy(pl. túlcsordulhat) hogy először 4-szer összeadod aztán úgy osztod 10-el.
Kis logikával lehet pontosítani, pl. ha nem 10-el hanem 5-el osztasz és 2-vel szorzol(ez utóbbi egy balra shift). Talán már az esély is sokkal kisebb ha először 2x összeadod őket aztán 5-el leosztod. Ha ez elég sűrűn előfordul akkor elgondolkodnék a bitszám növelésén, az osztásokat pedig végére hagynám.
Össze akarom rakni a nyomtató portos avr programozót.
Ott elakadtam hogy mik a színei a pineknek? vagyis a kábelben mik a színek?
Fogj egy multimétert és mérd ki.
Vagy nézd meg az adatlapját az lpt kábelednek jobb esetben.
Mi volt amúgy az első kérdés?
Erre amúgy az a válasz, hogy igen. A dolgot bootloadernek hívják. Itt találsz ilyet :Bővebben: Link
Szia!
Gondolkodtam, illetve folytattam a programot és kell még két érték:89% és 111% is Szóval ha pontosan akarok számolni, akkor bitszám növelés, én is ide jutottam a magam kútfőjéből, pedig nagyon nincs kedvem 24 bites műveleteket végezni Igen, a túlcsordulás a fő probléma,mert fordulatszámot mérek, ezért a Timer1-t használom 16 biten.Innen származnak az értékeim. (ráadásul ezeket az értékeket 89 és 111 már olyan ésszerűen nem is lehet felbontani, mint a 40-et). Nem túl gyakran kell számolni, csak az a baj, hogy a bemenete is változó.(nem túl gyakran = percenként 3000-6000) Üdv Kiborg
Teljesen mindegy. A szintol fuggetlenul ugyan ugy folyik benne az aram.
Hááát, ezekkel valóban cumi van mert a 89 ráadásul prímszám. 24 biten ne próbáld, az újabb szívás!
De tessék, adok egy 64 bites teljes aritmetikát még a régi időkből amikor induktivitásmérőt akartam assemblerben leprogramozni. A 32 bit oda már nem volt elég, de neked igen. Osztásnál a maradékokat is megkapod! Csak a 8-asokat kell 4-esekre átírni és kész. Van benne sztringgé-konvertáló rész is! Használd egészséggel! Ja és az alapszabály: először mindig szorzunk és a legvégén osztunk. De ha jól kezeled a maradékokat akkor teljesen mindegy!
Köszi. Megpróbálom értelmezni és felhasználni.
Ez 64bit-et oszt/szoroz hány bittel ? Másik kérdés: a sok MACRO-ban a @-jel mit jelent ? Kiborg
Ez oszt,szoroz,kivon,összead,másol,shiftel(balra és jobbra 1-el), minden tényező és eredmény is 64 bites.
A tényezőket az SRAM-ba kell tárolni: mindegyik 8 bájtot foglal el, érdekes volna regiszterezni... Fontos, hogy egy művelet eredménye mindig a legelső(azaz 0.) tényezőbe kerül, ezért nem árt másolni "aritmetika_copy" ha utána még fel akarod használni azt az értéket! A @ jelek a "címe" operátort jelölik az SRAM-ban, azaz a számérték címét adod át a függvénynek! A 64 bites számokat a ".byte 8" makróval deklarálod az adatszegmensben(".dseg"), erre is találsz példát! Ezeket a makrók a függvényeket használd: aritmetika_osztas, aritmetika_szorzas, aritmetika_shift_R, aritmetika_shiftL, aritmetika_copy, aritmetika_minusz, aritmetika_plusz. Az "load_cseg"-el a kódszegmensből töltesz át konstansokat egy számértékbe. A "convert" egy 10-es számrendszerű számot (#0-végű-) sztringgé konvertál, a kimenet 12 bájtos legyen!
Illetve bocs, a @ jelek(+sorszám) a paramétereket jelölik. Nem címet, arra a "high" és "low" makrók valók.
Lenne egy kérdésem. Az Uart-nál az Rx_complete interruptot akarom használni atmega8-nál. UCSRB regiszterben 1-re állítottam az RXCIE bitet, főprogramban engedélyeztem az interruptokat sei() paranccsal. Kell még ezen kívül valamit csinálni, hogy működjön az interrupt?
Betettem egy egyszerű kódot, hogy ha jön valami az uart-on, akkor egy led kapcsoljon be, de semmi nem történik. Mi lehet a gond?
Közben rájöttem, hogy ha én küldök valamit a gsm modulnak és ő válaszol, akkor végrehajtódik az interrupt, világít a led. De ha nem küldök semmit, csak várok pl egy hívás jelre, ami azt jelenti, hogy küld a gsm modul egy "RING" szócskát az uart-on, akkor semmi sem történik. Na ez hogy van?
Biztos hogy rendesen elküldi a RING szócskát? Azért érdekes lenne, mert ha az interrupt nem fut le
akkor az interrupt flag sem állítódik be ami nagy baj mert így még interrupt nélkül se tudod megmondani, hogy most kaptál-e üzit vagy még várnod kell rá...
Múltkor néztem gépen direkt, hogy mi van akkor, ha csörgetem a modult és akkor kb 5s-onként küldte ezt. Most rendeltem egy usb-soros átalakítót, mert ezelőtt egy régebbi gépen néztem, ahol még volt soros port, de laptopon nincs. Így ha megjön az átalakító, akkor ránézek, de tuti, hogy adja a jelet csörgetéskor.
Biztos hogy adja? Nincs lehúzva valamelyik láb ami blokkolja az adást? Esetleg még megteheted,
hogy figyeled az Rx portot(talán a PIND-n van), hogy egyáltalán ad-e valamit, azaz cibálja-e a lábat. De nem is kell szoftver, rákötsz egy PNP tranzisztort egy 10k ellenállással, arra egy LED-et + 100 Ohm ellenállást.
A modul az AT
Vagy megvan az hogy fix sebesség beégetve a modulba?
A modul fix 4800 baud sebességgel kommunikál, semmit nem kell állítani.
Sziasztok! Van egy kütyüm, amin van egy SPI buszra fűzött SD kártya és egy Nokia 3310 LCD.
Az a problémám, hogyha áram alá helyezem, akkor az inicializálás során hibát jelez, de az első RESET után tökéletesen működik... Már egy elég nagy (több másodperces) DELAY-t tettem a MAIN elejére, de így is hibát jelez... Van-e valakinek ötlete a megoldásra, illetve hogy lehet szoftveresen RESETelni az AVR-t (atmega32)? Előre is köszi!
Erre ugyan konkrétan nincsen ötletem, de szoftveres resetet úgy érdemes csinálni, hogy a watchdog timert beállítod, majd nem piszkálgatod a watchdog timert. Ezzel kapsz egy teljes, mindenre vonatkozó resetet, akárcsak a reset gombbal csináltad volna.
Használd az avrlibc watchdog rutinját a watchdog bekapcsolására.
Szerintem illene már megtanulni hogy így soha nem javítunk hibát, előbb mindig az alapproblémát
kellene megkeresni! A hibát pontosabban hogy jelzi? Az SD-kártya véletlenül nem kap 5V-ot valamelyik lábon? A bekapcsolási RESET időtartamát tudod növelni(valamennyi órajel + ms-ban mért idővel) a FUSE biteknél, pontosabban a SUT_CKSEL résznél. Ha mégis RESET-et akarsz akkor vagy a Watchdog-al próbálkozol, vagy valami késleltetős dologgal aminek egy portlábról adhatsz jelet, közvetlenül nem köthető a RESET-re!
Hali
Atmega16A esetén a Timer/Counter 0 Phase Correct PWM funkciójában nem értek valamit. Ez ugye úgy működik, hogy beállítom a megfelelő biteket, majd engedélyezem a megszakítást és jelen funkcióban az OC0 lábon (PortB.3) jelentkezik a PWM jel A Fast PWM funkciót már beállítottam és az tökéletesen is megy. A Fast PWM és Phase COrrect között bár csak minimális beállításbeli különbség van, viszont: AZ adatlap azt írja, hogy Phase Correct PWM jel esetén a kimenő frekvencia: f = (f_clk I/O)/(N*510) Ahol a beállításaim szerint N=1, f_clk pedig 16MHz. Viszont azt az 510-et nem tudom hová tenni :| Maga a programrészlet így fest: (bs=bitset, bc=bitclear) bc(TCCR0,WGM01); //WGM00 és 01-ben különbözik a Fast PWM és a Phase Correct PWM bs(TCCR0,WGM00); bc(TCCR0,CS02); bc(TCCR0,CS01); bs(TCCR0,CS00); bs(TCCR0,COM01); bc(TCCR0,COM00); OCR0=130; bs(TIMSK,OCIE0); sei(); Ahogy látszik az OCR0 állítja a pulzuszélességet, de mégis a képlet szerint hogy lehet maximálisan 510-zel számolni, ha az OCR0 csak 8 bites?!?! Jelenleg ugye 130 van ott, és max 255 adható neki. Fast PWM esetén egyértelmű volt a dolog mert ott a képletben 510 helyett 256 volt, ami éppen megfelelt a 8 bitnek. De itt mi értelme a képletben az 510-nek? Azt odáig értem, hogy a számláló nem csak fentről lefelé, hanem lentről felfelé is számol. De ez akkor mit befolyásol? Vagy mi a különbség köztük? Phase Correct PWM-ben magyarán ha pl OCR0-nak 130-at adok, akkor azt a képletben 260-nak kell vennem?!?! És csak annyi az értelme, hogy Phase COrrect PWM-ben fele akkora frekvenciákat lehet előállítani (ugyanazon OCR0 értékkel) mint a Fast PWM-ben???? Remélem nagyjából érthető volt, hogy mit nem értek
Elsőnek hozzátenném, én kezdő vagyok...
Tapasztaltam olyat, hogy fastPWM-el nem tudtam levinni teljesen 0-ra az értéket, szkópon mindig jelzett egy kis tüskét. Lecserélve p.c.PWM-re már tökéletesen működött. (azóta már olvastam, hogy másnak is volt hasonló gondja) A p.c.PWM pont fele olyan gyors mint a fastPWM, gondolom ezért van megszorozva 2-vel az osztó (255*2=510). De az OCR0 beállítása csak 8 biten történik (0-255), ahogy írtad is. Amúgy fut a p.c.PWM?
"A p.c.PWM pont fele olyan gyors mint a fastPWM"
Hűű kössz pont erre voltam kiváncsi. Csak valahogy kacifántosan fogalmaztam. Kösz! Sajnos nincs scope-om szóval ezért voltam zavarban, mert maga a PC PWM működik, szépen tudom villogtatni vele a LED-et, viszont azt megnézni, hogy mennyiben különbözik a Fast PWM-től már nem. A fényerőcsökkenésből szemmel pedig semmit nem tudtam kihámozni. Kérdésedre válaszolva: fut, bár ugye szemmel láthatólag egy LED_del tesztelve az égvilágon semmi különbséget nem érzékelek a Fast PWM-hez képest. Azt hiszem lassan ideje lenne beszereznem egy scope-ot.... bár az sztem csillagászati összegeket verne
Megoldottam a problémát. Elfelejtettem a main-ba egy while ciklust tenni, így lefutott az a semmi a mainban és vége. Most betettem és megy is rendesen. Már kiírja a hívó fél telefonszámát a kijelzőre és utána megszakítja a hívást.
Egy logic analyzerrel egész jópofa dolgokat lehet csinálni. Főleg, hogyha csak bináris jeleket akarsz vizsgálni.
Ezt egész olcsó beszerezni: Saleae logic clone |
Bejelentkezés
Hirdetés |