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
Szevasztok!
Problémám támadt. Most kezdtem el kísérletezgetni AVR-ekkel komolyabban és az outputokig minden szépen és jól ment... villogtak a LEDek és jó volt De most, hogy összedobtam egy inputos kapcsolást az ATMega8-16PU-hoz, felprogramoztam, nem áll szóba a géppel (AVR device not responding.). A kapcsolásomat csatolom, ehhez még hozzá jön persze a rendre rákötött stk200-as programozó (bocs a tré képért). A program pedig ez volt: #include #include int main(void) { DDRB = 0b11111101; for ( ; 1==1 ; ) // loop while 1 equals 1 { if(PINB == 0b00000010) { PORTB = 0b11111101; } else { PORTB = 0b00000000; } } return 1; } Ennek elvben ugyebár világítania kellett volna aztán amíg a gomb le van nyomva elaludnia... Ehelyett hibátlanul felprogramozódott és nem csinált semmit egy két random villogáson kívül Vissza lehet még hozni a chipet?
1.A rajz szerint a PB0-n van a gomb, a kódban ezt kimenetnek definiáltad!
2.Az egész port állását hasonlítottad össze egy adott értékkel, beleértve a kimeneteket is... Egy adott pin kivizsgálása így történik:
Gondolom a kapcsoló a testre van kötve?!
Felhúzó ellenállást tegyél rá vagy kapcsold be a belsőt.
A vizsgálat résznél azért érdemes beírni az 1= részt, mert találkoztam olyan esettel, hogy enélkül nem hajtotta végre a vizsgálatot. Habár ez egy ritka jelenség, már többen is írták itt.
Nem akarom megkérdőjelezni az állításodat. De annak az "1 =" résznek semmi értelme. Egy konstansnak, ami a példádban 1, nem lehet értéket adni. Gondolj bele, ha a kifejezés másik része hamis, akkor ez lesz a kifejezés:
Ami teljesen értelmetlen. Hiszen az 1-et nem tudod egyenlővé tenni a nullával.
Igazad van. A kod lefordul de értelmetlen.
1 db = jel: értékadás, 2db egyenlőség vizsgálat. (C-ben kb akármi lefordul, ez kezdöknek nemjó, de aki már jól nyomja annak viszont nagyon jó, sokat lehet vele optimálni)
Vágom..
De azt nem értem minek bonyolítani ezt az egészet többszörös negálással 1-hez hasonlítással stb.. Tegyük fel a led PB0-n van, a kapcsoló PB1en, akkor így a legegyszerűbb:
Ebben a formában ha a gomb meg van nyomva a LED világít, amúgy nem. Edgár Idézet: Csak nem ebben az esetben „Ebben a formában ha a gomb meg van nyomva a LED világít, amúgy nem.”
Sziasztok!
Atmega88-at használok AD mérésre. Az AVcc-t használom referenciának külső kondival az AREF pin-en, és nem értem, hogy az órajel különböző leosztásainál miért mér mást. Melyik osztást használjam a pontosabb méréshez? Köszönöm a választ előre is!
Úgy valóban nem jó, így akart kinézni:
1== részt leírtam miért érdemes beletenni... egyáltalán nem muszáj. Negálást azért tettem bele, mert a kapcsoló a földre van kötve.
Köszi szépen ez így visszanézve tényleg elég tré...
De okozhatja azt, hogy letiltódjon vagy megsüljön a chip? Mert most már azokat a programokat sem tudom beleégetni amik régen működtek
PB0 kimenetnek volt állítva, amit te rövidrezártál.
Igaz nem programozó láb... de talán ez okozhatja?!
Szerintem vagy a konfig biteket szurtad el, vagy pl az 5kOhm-os felhuzas a reset agon nekem tul erosnek tunik -- olyan 10-20k kornyeken jobb lenne. Azonkivul a 100nF hidegito kondi egyreszt ne elektrolit vagy talantal legyen hanem keramia, masreszrol nem az RB0-GND koze kellene hanem a Vcc-GND koze...
Azonkivul szerintem toltsd le az Eagle ingyenes valtozatat es azzal rajzolj, es probaldd meg mar most ideje-koran megszokni, hogy hogyan lehet szepen es erthetoen rajzolni (pl tipikusan a fold vonal mindig lefele megy, vagy egy eros fold vonalat szokas rajzolni a megfelelo jelolessel, hogy az a fold, vagy akar tobb helyre is be lehet tenni a foldeles jelzest ha az egyszerusiti a rajzot tehat pl nem keresztezi a tobbi vonalat... -- Vcc pedig tipikusan felfele nez, hasonlo szabalyokkal, mint a foldnel...). Kapcsolonal is illik ugy elrendezni, hogy lathato legyen mi tortenik, mi a szerepe az ellenallasnak ill a kapcsolonak... Ha a rajz atlathato, akkor Te magad is konyebben rajossz ha veletlen valamit elrajzoltal, azonkivul mikor kerdezel is a valaszolok hamarabb fogjak tudni latni mi a problema... Ja es az ellenallas nem szokott teli lenni, avagy zig-zag az amerikai jeloles szerint. Most hirtelen ezt az oldalt talaltam a jelolesi modokrol, de vannak ennel jobbak is, csak keresgelni kell
Hmmm... van benne valami...
Akkor megint Hestore
A rajzodon a PB0-n van a nyomógomb, amit előtte kimenetnek deklaráltál (szép magyar szó tudom), ezen a lábon a "0" nem is okozna gondot, de amikor "1" kerül ki, akkor a nyomógombon keresztül 5V-ot testeltél, amit a mikrovezérlő nagyon nem tolerál hosszabb ideig!
De a kódod szerint csak akkor kerülhetett ki rá "1", ha a PB1 valami módon (pl. külső zavar hatására) átbillen "1"-be. Elképzelhető, hogy mesült az AVR, de próbáld meg figyelmesen átnézni még egyszer, lehet, hogy csak valami kis elkötés van a dologban. Egy kis tipp a bekötéshez: Az AGND, AREF és AVCC lábakat érdemes bekötni függetlenül attól, hogy használva van-e az ADC vagy sem.
Jogos köszönöm amúgy ez alapján a tutorial alapján csináltam a kapcsolás részét:
http://www.avrtutor.com/tutorial/thermo/ioports.php a kondi természetesen kerámia volt csak rosszul jelöltem.
Ok, valóban nem olyan bekötésben.
Amúgy meg az ==1 az szerintem totál nem kell, mert a C úgy fodít, ha feltételvizsgálat van, hogy minden ami nem 0 értékü az igaz. (ok, talán a NaN egy érdekes kérdés..)
En tisztaban vagyok vele, hogy ugy fordit, de azzal is, hogy voltak valos sz^vasok az if(!..) miatt.
Idézet: „Az AGND, AREF és AVCC lábakat érdemes bekötni függetlenül attól, hogy használva van-e az ADC vagy sem.” Igazad van énis jártam már igy, hogy nem kötöttem be és elhalt az AVR! :yes:
Jobbnak látom megkérdezni.... egy ilyen egyszerű esetben mint pl led villogás ezeket hova kellene kötnöm? Pl. mehetne ugyanúgy USB +5-re az AVCC meg az AREF az AGND meg ahova a GND?
Pontosan :yes:
De viszont ha az ADC-t szeretnéd majd használni, akkor az AVCC-t és az AREF-t egy aluláteresztő szűrőn (lásd: adatlapban) keresztül kell a VCC-re kötni. Az AGND ebben az esetben is mehet a GND-re.
Sziasztok! Készítettem egy NYÁK-ot ATMEGA16-os mikrovezérlővel, aminek minden "lábát" kivezettem a programozás gyakorlására. A lefordított HEX fájlt Ponnyprog nevű programmal viszem fel. Nos itt egy résznél elakadtam! Megpróbáltam változtatni az órajel frekvenciáján a "Security and Configuration bits" menüpont alatt és azóta sem írni, sem olvasni nem tudok a kontrollerből! Ez ügyben kérnék segítséget valaki nálam okosabb embertől! Egyébként ISP programozóm van LPT porton.
Sziasztok!
Az avr-gcc-ben hogyan lehet a stack maximális méretét beállítani? Egyáltalán mennyi az alapértéke? |
Bejelentkezés
Hirdetés |