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
Helló!
DDRD=0b0001111; Így lesz output a PORTD 0-3 pinekből.
nagyon gáz de már zsong az agyam a bitektől, köszi
Ha azt szeretnéd, hogy a PORTD-n ezek a lábak (PD0-PD3) legyenek rákötve a belső felhúzóellenállásokra, akkor a PORTD=0b1110000; bitjeit is meg kell fordítanod:
PORTD=0b0000111;
(PD0-PD3) outputok - nem kell felhúzni,
az inputok PD4-PD6 huznám fel PORTD=0b1110000;
0b1110000 = 0b01110000 szerintem de ha fontos a syntaxis akkor kiírom inkább.
Ennek szerintem működnie kellene.
Leírom egybe, hogy egy helyen legyenek DDRD=0b0001111; //PD0-PD3 pinek kimenetek, a többi bemenet PORTD=0b1110000; //PD0-PD3 pinek alacsony logikai szinten, a többi magason
Nem fontos, pont jo ugy, ahogy irtad. Stilisztikailag sokszor jobban mutat, ha ilyen esetekben kiirod mind a 8 szamjegyet, de egyeb jelentosege nincs. Viszont, ha decimalis szam ele irsz 'feleslegesen' egy nullat, akkor az oktalis szam lesz a C nyelvben:
33 = az decimalis (tizes szamrendszer) harmincharom 033 = az oktális (nyolcas szamrendszer) 33, ami decimalis 27.
Ha a CKDIV8 be van kapcsolva akkor - előosztás nélkül - 1 us az oszcillátor jele, amit 65.536-tal osztva 65.536us, azaz 65,534 ms adódik, akkor jó a 60ms körüli megszakítás hívás, amit mérsz, még sincs vele gond.
A tegnap esti 22:42-e hozzászólásodban azt írtad, hogy ki van kapcsolva a CKDIV8.
Azt csak késöbb vettem észre, mert eddig a beállitásokkal nem csináltam semmit, minden beállitás gyári állapotban van kivéve az eepromot.
Az a 60 ms nekem nagyon lassunak tünik. Kapcsoljam ki a ckdiv8-t? A hozzászólás módosítva: Márc 23, 2014
következő kérdésem: szeretném egy 2 bytos változoba összerakni az input biteket alábbi módon:
változó=PD6,PD5,PD4,PA1,PA0,PB7,PB6,PB5,PB4,PB3,PB2,PB1,PB0 az én megoldásom: változó= PINB + ((PINA & 0x03)<<8)+((PIND&0b1110000)<<6); szerintetek igy jó van-e elegánsabb megoldás?
Átkapcsoltam. Felgyorsult, de még mindig nem értem ezt az interrupt nyavaját. A fenti kodban megirtam, hogy mikor szakitsa meg a progit.
Egy másik helyen elkezdtem irni az megszakitások parancsait:
A progi ha léptetem szépen megy és azt teszi amit kell, ha betöltöm a chipbe akkor egyik másik gomb azt teszi amit kellene a többi meg összezavarja az LCD kiirását.
Azt hiszem egy hibát megtaláltam. Most már ugy ahogy megy a szerkezet, még itt -ott csinál valami váratlant, ( nem oda ugrik, ahova kellene) de alapjában véve most már sokkal jobb, mint eddig valaha volt. Ha gyorsitom akkor zavarodik, lassitani meg már nem lehet, mert a változás kb. 2 mp után jelenik meg a kijelzön. Ezen még gyorsitani kell, mert igy zavaro lehet.
Max. annyit csinalnek maskepp, hogy nem + hanem |, mivel nem osszeadni akarod oket, hanem csak orolni. Igy garantaltan nem fordit 16 bites osszeadast, akarmilyen C forditod is legyen. De osszeadassal is teljesen jo, csak orral talan szebb. Ezen felul meg annyival lehet szebbre (elegansabbra) megirni, hogy ugy irod oket sorba, ahogy a helyiertekek is adjak, azaz nagyjabol ugy, ahogy felul is irtad: valtozo = ((PIND&0b1110000)<<6) | ((PINA & 0x03)<<8) | PINB;
Össze kellene számolni a lépések idötartalmát az irq hurokban, mert csak 2 instrukcio okoz némi zavart a másik 4 nem?
Szia !
Alapszabály, hogy megszakításban nem csinálunk semmi időigényes dolgot, csak pl. megnézzük egy portláb állapotát, ennek függvényében beállítunk egy változót 1-re vagy 0-ra, és ezt a változót figyelve a főprogramban végezzük el, mondjuk az LCD frissítést, nyomógomb megnyomásra való reagálást, de előtte visszaállítjuk a változó értékét, azért, ha közben jön az új megszakítás, akkor arra is lehessen reagálni. Nem érdemes/szabad megszakításban delayt használni, LCD-t frissíteni, számítás (gépidő igényes műveletet végezni) erre ott a főprogram. Más logikát kíván a megszakítások használata, mint a "polling" használata, de érdemes vele foglalkozni és megérteni a működését, mert sokkal flexibilisebb programot lehet írni.
Delay nincs benne, az LCD-t még megnézem de szerintem az ki van hagyva. Persze a gombok ne egészen vannak igy kezelve, lehet, hogy ott kéne valamit müvészkednem. Most a nyomogomb lekérdezö hurokbol kiugrok az adott gombnál a subrutinba elvégezni a feladatokat.
Eljátszottam a szerkezettel.
Ha ovatosan nyomkodom a gombokat, adok idöt a belsö processzeknek, akkor hibátlanul müködik. Akkor zavarodik meg, ha nem adok idöt a belsö lépések ( matematikai formulák, display frissitése stb), azaz a gomb megnyomása által elinditott folyamat eredménye még nem jelent meg az LCD-n (1-3 sec). Ha kivárom, akkor jol megy. Ezen még el kell rágodnom
Sziasztok ! Érettségi előtt vagyok, és munkámnak 1 itt megtalálható atmega16-os mikrovezérlővel vezérelt propeller kijelzőt választottam. Meg is rendeltem ezt a hozzá ajánlott programozót :
http://www.hestore.hu/prod_10024859.html Olyan gondom van , hogy az AVR Studio 4-el nem tudom csatlakoztatni a gépemhez a programozót és ez miatt nem tudom rátölteni az IC-re a programot. Valaki nem tudna segiteni ? SÜRGŐS LENNE. Előre is köszönöm !
Miért nincs USB-d?Akkor másik gép kell....
Vagy van USB és nem ismeri fel?Akkor szerintem a mikrokontrollerel való csatlakozás a gond, próbáld végig multiméterrel a MISO, MOSi, SCK,RESET, GND,VCC lábakat ha nincs szakadás akkor menni kell azonnal felugrik az ablak ahol már tudsz dolgozni.
Sziasztok
Vettem Ebay-en egy USB JTAG ICE programozót. AVR JTAG ICE Az első nagy probléma a driver volt amit nagynehezen találtam egy kínai fórumon. Most viszont hogy összeraktam és egy atmega 16 -ost szeretnék programozni csak egy hibaüzit kapok. A neten található rajzok alapján kötöttem össze őket. A JTAG-et így kötöttem be. TCK->SCK TDO->MISO TMS->PB1(T1) VSUPP->5V TDI->MOSI a két GND lábat ->GND VTREF->5V Az atmega 16-os kap 5V ot a VCC(10),AREF(32),AVCC(30) keresztül. GND-k 11 és 31 es láb. Reset lábat egy 10k ellenállással felkötöttem tápra és vele párhuzamosan egy kapcsolóval GND-re. XTAL1-2(12,13) közé tettem egy 16MHz-es kvarcot és a lábait 100nF-os kondikkal földre kötöttem. Elvilekben mennie kéne. A hibaüzi amit kapok:
Szia!
Ha valóban úgy kötötted a 16MHz-es kvarcot 100nF kondival ahogy írod, akkor az egy igazi csoda lenne, ha működne. Jelenleg a processzorod tetszhalott. A megfelelő kondenzátor értékek: 12pF - 22pF. (kéretik adatlapot olvasni!)
És a Fusebit K-t: Ext Crystal/Resonato High Freq-re állítottad?
Különben alapból belső 8MHz -ról megy.
Itt egy bekötési rajz így kötöttem be a kvarcot csak nem volt itthon 22pF.
kép
Alapesetben belső órajelről megy, vagy már első használatkor várja a kvarcot ?
Csak mert elég sokáig nélküle próbálkoztam és ugyanez volt a hiba. Hol tudom állítani a fuse biteket ?
Szia!
Ha szűz M16-ról van szó, akkor alapból belső 1MHz-ról akar indulni (nem vagyok biztos a 8MHz-ben). Tehát ha nem állítottál fuse biteket, akkor még mindig arról jár. Csatlakozásokat ellenőrizd. Banális kérdés: a kapcsolód alapból zárt vagy nyitott? Mert ha zárt, akkor resetben tartod a procit és azért nem indul. Mérj rá multival a reset lábra, ha 5V van, akkor lehet tovább gondolkodni.
Ez így jó is. A 22pF-al kellene működnie. Ha viszont még nem állítottad a biztosíték biteket, akkor a belső órajellel működnie kellene, mint ahogy kapu48 is említette.
A kapcsolóm alapból nyitott. És alapesetben 5V van a reset lábon.
A jelenlegi helyzet:
Video
Nekem is voltak ilyen gondjaim a mega644-el. A gyári fejlesztömodulon simán ment a JTAG (azt hiszem ugyanez volt az üzenet). Az általam csinált raszternyákon bedrotozott NYAK-on meg sem nyikkant a JTAG - pedig vagy 100x átmértem. Amikor átraktam ugyanazt az IC-t a fehér duggaszolos protoboardra, azon akkor ment, ha jol emlékszem a TCK lábat, leterheltem. Elég volt kézzel hozzáérni. Késöbb 1 MOhm-s ellenállás is megtette.
Mai napig nem tudtam kideriteni mi a kinja. Igy most a DRAGONban vagy a gyári fejlesztömodulon programozom, majd átdugom a másik NYÁKba. (az általam épitett NYÁKon a JTAG nem ismeri fel). |
Bejelentkezés
Hirdetés |