Fórum témák

» Több friss téma
Fórum » AVR - Miértek hogyanok
 
Témaindító: pakibec, idő: Márc 11, 2006
Témakörök:
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
Lapozás: OK   350 / 837
(#) xenon válasza xenon hozzászólására (») Aug 15, 2011 /
 
Megpróbáltam külső oszcillátorral életre kelteni.... ééééés működik! :nyes: Végre
(#) xenon válasza xenon hozzászólására (») Aug 15, 2011 /
 
Úgy tűnik mégse az oszcillátor volt a megoldás, a villogó program rátöltődött, azóta is villog (bár 200ms helyett 8s a led áll.váltásának ideje, 8MHz volt a Makefile-ban, nem tudom ez hogy jön ki), de megint ugyanaz a hiba, se írni, se olvasni nem lehet. Mindenesetre fut a program, szóval belső órajel van. A kábelt kicseréltem csatlakozóba dugott drótokra, így se jó. :bummafejbe:
(#) edison14 válasza xenon hozzászólására (») Aug 15, 2011 /
 
ha van soros portod akkor esetleg megpróbálhatod EZT a kapcsolást. Egyszerű és működik. Igaz hogy PonyProg alól kell vele programozni de szerintem megteszi. Ha jobban szeretnél foglalkozni az AVR programozással akkor pedig mindenképp megéri építeni egy USB-s programozót. De visszatérve. Jó portot állítottál be a programban a programozónak? Biztos hogy nem egy másik porton van? Elő szokott fordulni hogy két LPT portot tesznek az alaplapra csak az egyik nincsen kivezetve(régi alaplapoknál). Használsz valamilyen átalakítót (soros portól párhuzamos portra)?
(#) xenon válasza edison14 hozzászólására (») Aug 15, 2011 /
 
Fejlemények: Egyik kimeneten volt egy led, amit villogtatott. Kivettem a ledet, erre a "drótos" programozóval (a csatlakozóba dugdosott drótok) sikerült programozni. Leddel nem akart működni. Visszatettem a programozómat, megint nem ment. Megint visszatettem a drótokat, most már leddel is működik. Logikát nem látok benne, de ha működik, akkor mindegy. Beállítottam az órajelet 1MHz-re, most már jó az időzítés is. USB-s-sel lehet, hogy jobban jártam volna, csak kicsit drágább
Szóval vagy a csatlakozó érintkezőivel van kontakthiba, vagy az ellenállásokat kell kivenni, érdekes.
Fuse biteket is elkezdtem közben nézegetni, az avrdude gui-n nem sikerült elmenni, akármit akarok beolvastatni, mindig egy 6 számjegyű hex adatot dob ki, amit akárhogy nézek, sehogy se egyezik az 1MHz INT RC oszc. beállítással. PonyProgban a configuration bitek viszont jónak tűnnek, ezzel néztem egyébként, a Manual fuse bits configuration táblázat ugyanúgy néz ki, mint pony-ban. Sok helyen hallottam, hogy könnyű vele elállítani az avr-t, de ha a linkelt kalkulátor jól működik, akkor azalapján remélem nem lesz gond, egyelőre azért nem próbálkozok.
(#) edison14 válasza xenon hozzászólására (») Aug 15, 2011 /
 
Szerintem abszolút megéri építeni egy USB-s programozót mivel ott megkíméled magad a sok kínlódástól. Valamint az AVR studio is támogatja tehát az alól is tudsz vele programozni és nem kell semmilyen más szoftver hozzá. Mindenesetre örülök hogy működik és remélem nem lesz vele több gond. Ha tudod akkor a csatit cseréld ki és kifogástalanul fog működni esetleg kiderítheted programozás közben mozgatással hogy melyik tüske a hibás.
(#) Ricsi89 válasza xenon hozzászólására (») Aug 15, 2011 /
 
Szerintem ott lehetett a gond, hogy az a led az egyik programozó által is használt lábon volt. Így a led leterhelte azt a szálat(amúgy sem tud túl nagy áramerősséget a nyomtatóport), meg ellenállás is volt ott és így az avr lábára már nem jutott elég feszültség. Ez a leglogikusabb válasz a jelenségre.
(#) xenon válasza Ricsi89 hozzászólására (») Aug 15, 2011 /
 
Nem azon volt, a komplett D port kimenetre van állítva, annak az egyik bitjére van kötve, ráadásul utána meg már működött azzal is. Egyébként egyszer a villogás is leállt, fesz. mérővel rámértem egy másik kivezetésére (D port másik bitje), amint hozzáértem, megint elindult... vannak itt érdekességek.
Közben lepucoltam a csatlakozót, de továbbra sem működik, úgyhogy úgy néz ki az ellenállások okozzák a problémát, pedig csak 220 ohm-osak.
(#) edison14 hozzászólása Aug 15, 2011 /
 
Helló. Azt szeretném megkérdezni, hogy hogyan tudom egy láb állapotát lekérdezni úgy, hogy az utasítás akkor teljesüljön ha a láb 0-ra van húzva?
(#) zombee válasza xenon hozzászólására (») Aug 15, 2011 /
 
Hello!

NEM! Idézek:
Idézet:
„amint hozzáértem, megint elindult”


Még mindig kvarckristályról megy? Ha igen, akkor ez a kettő mindenképp kell:
- Van kondi a tápfeszlábakon?
- A tápfeszlábak össze vannak kötve a másik oldalon lévő párjukkal(VCC-AVCC; GND-AGND)?

Ezek nélkül nem csoda, ha "érintésre" elindul, illetve bizonytalan időnként(de főleg programozás alatt) meghülyül a rendszer!
Tapasztalat: ha egy panelre épített cuccnál odanyúlok a kristálykivezetésekre, pontosan ilyenek történnek! És ez természetesen az időzítéseknek is betesz, képes az órajel lelassulni, ha pedig odaszorítom az ujjamat akkor szinte meg is tudom állítani...
(#) xenon válasza zombee hozzászólására (») Aug 15, 2011 /
 
Ez egyszer fordult elő, azóta szerencsére nem volt vele ilyen gond, amúgy a belső RC oszcillátorról működik (eddig is erről ment, csak mivel nem adott életjelet ezt nem tudtam biztosan, és próbálkoztam). A gond a programozással volt, ami megoldódott: bedugtam a szabvány 25 pólusú D-SUB aljzatba a szabvány dugót, és egész egyszerűen nem érintkeztek rendesen -mint utólag kiderült. Egy csavarhúzóval kicsit elhajlítgattam a csatlakozó tűit, és azóta működik. Elég bosszantó, hogy ilyen apróság miatt másfél napot szívtam vele, remélem több baj nem lesz vele.
AVCC-re amúgy nincs a tápfesz rákötve, annak nem az ADC-nél van szerepe? A blokkdiagramon legalábbis ezt látom, de még nem tanulmányoztam át részletesen a lelki világát.
(#) zombee válasza xenon hozzászólására (») Aug 15, 2011 /
 
Idézet:
„annak nem az ADC-nél van szerepe?”

Igen, de attól az még az egy ugyanolyan tápláb mint a VCC.
AVR-eknél az AVCC egyben az analóg kivezetésekkel bíró portnak is a tápfeszültsége nem csak ADC, hanem I/O módban is. Ha nincs bekötve, akkor egy belső diódán keresztül kap a VCC-ről tápot, ez magyarázza hogy bizonyos esetekben a port által leadható áramerősség kisebb mint a többié. Én anno a legelső Knight Rider villogómnál jöttem rá, ugyanis a PORTC-n(ATMega48) lógó nagyonerős flux LED-ek picivel halványabban világítottak...

Szóval: ha nem használsz ADC-t akkor érdemes az AVCC-t is bekötni a tápfeszre. Nem kötelező, csak ajánlott.
(#) sikolymester válasza edison14 hozzászólására (») Aug 15, 2011 /
 
Ha pl. A PORTA 2-es lába a kérdés, akkor pl így:
  1. if ( PINA & (1 << PINA2) )
  2. {
  3.   //kod
  4. }


Javaslom olvasd el az adatlap ide vonatkozó részét.
(#) zombee válasza sikolymester hozzászólására (») Aug 15, 2011 /
 
Gondolom negálva gondoltad ezt Te is, lemaradt egy felkiáltójel...
(#) edison14 válasza zombee hozzászólására (») Aug 16, 2011 /
 
Ige a felkiáltójel kimaradt.
  1. if(!(PIND & (1<<PIND0)))        kalibracio();

Pedig gondolhattam volna arra a felkiáltójelre.
(#) Reggie válasza zombee hozzászólására (») Aug 16, 2011 /
 
Kotelezo az AVCC-t bekotni, akkor is, ha nem hasznalod az ADC-t.
(#) tomi936 hozzászólása Aug 16, 2011 /
 
Sziasztok !

Én próbálkoznék egy kis ISPvel egy ATmega8-cal meg egy 74HC595-ös shiftregiszterrel de nem nagyon jön össze a dolog
SPI használata AVR-rel c. cikk első részét próbálnám reprodukálni de a futófény helyett teljesen más sikerül pedig a kódot másoltam

Az elején elindul de a harmadik vagy a negyedik váltás után az összes LED kigyullad és semmi nem lesz az egészből.

Remélem tudtok valami okosat mondani, hogy hol rontottam el valamit

köszi

u.i. megpróbálok egy videót mellékelni a működéséről
Video
(#) sikolymester válasza tomi936 hozzászólására (») Aug 16, 2011 /
 
Az órajelet helyesen állítottad be a fuse bitekkel?
Illetve a ckdiv8 fuse nincsen beégetve?
Ez jól jöhet ilyenkor: Fuse Calculator
(#) tomi936 válasza sikolymester hozzászólására (») Aug 16, 2011 /
 
Hát nem vagyok benne biztos számomra még elég szűz ez a terep .
De itt vannak a beállítások: (képen)

AVRHIBA.jpg
    
(#) edison14 hozzászólása Aug 17, 2011 /
 
Hali. Támadt egy kis gondom a switch-case utasításokkal. Próbáltam mindenképpen de sehogy sem akart menni. A kód a következő:
  1. while(1)
  2. {
  3.     if((PIND & (1<<PD1)))       i++;
  4.                
  5.     switch(i)
  6.     {
  7.         case 0 : lcd_putstr("A aram kalibralas", 0x01);
  8.                      _delay_ms(500);
  9.  
  10.         case 1 : lcd_putstr("A fesz kalibralas", 0x01);
  11.                      _delay_ms(500);
  12.                        
  13.         case 2 : lcd_putstr("B aram kalibralas", 0x01);
  14.                      _delay_ms(500);
  15.  
  16.         case 3 : lcd_putstr("B fesz kalibralas", 0x01);
  17.                      _delay_ms(500);
  18.  
  19.         default : i=0;
  20.     }
  21. }

Az a gond, hogy az egész switch lejátszódik tehát nem választja ki azt az utasítást a case amit neki kellene. Az i váltózót static unsigned char-ként hoztam létre de próbáltam a static nélkül is. A case utasításokban a számokat próbáltam szimpla idézőjelek ('0') közé tenni de úgy sem volt jó. Nem tudom hogy mi lehet a baja olyan mint ha az i automatikusan növekedne eggyel pedig csak akkor szabadna ha a gombot megnyomom.
A másik kérdésem hogy az EEPROM memóriába kellene elmentenem egy 4 számjegyű számot mint pl a 6549. De szét kell választanom két-két számjegyre mert nem fér el egy címen. A szétválasztást már megoldottam de az összeállítását már nem tudom hogyan megoldani. Valakinek van valami ötlete hogy miképp tudnám ezt megoldani?
(#) vilmosd válasza edison14 hozzászólására (») Aug 17, 2011 /
 
Hianyzik a "break" utasitas. Minden ag vegere, ahol ki akarsz lepni, tedd be. kb igy:
  1. void W_dy(int d, char *w_s)
  2. {
  3.    switch (d)
  4.    {
  5.            case 0:      strcpy(w_s,"SUN");
  6.                                 break;
  7.            case 1:  strcpy(w_s,"MON");
  8.                                 break;
  9.            case 2:  strcpy(w_s,"TUE");
  10.                                 break;
  11.            case 3:  strcpy(w_s,"WED");
  12.                                 break;
  13.            case 4:  strcpy(w_s,"THU");
  14.                                 break;
  15.            case 5:  strcpy(w_s,"FRI");
  16.                                 break;
  17.            case 6:  strcpy(w_s,"SAT");
  18.                                 break;
  19.            default: strcpy(w_s,"???");
  20.         }
  21.  
  22. }
(#) edison14 válasza vilmosd hozzászólására (») Aug 17, 2011 /
 
A break az ott volt csak és elfelejtettem odaírni. Azzal sem működik.
(#) sikolymester válasza tomi936 hozzászólására (») Aug 17, 2011 /
 
A fuse bitek jónak tűnnek. Már ami azt illeti, neked 8MHz-en jár az AVRed, a cikknél 7,3728 MHz -en. Nos nem néztem meg a shift regiszter adatlapját, de azt javaslom, hogy állítsd át az órajeled belső 4Mhz-re.

erre: Int. RC Osc 4Mhz...

Lehet, hogy a shift regiszternek túl nagy sebesség az amit kap (bár erre kicsi az esély). Ha ez így van, akkor 4Mhz-en tuti helyesen kellene mennie.
(#) sikolymester válasza edison14 hozzászólására (») Aug 17, 2011 /
 
Szerintem eloptimalizálja a kódod a fordító. Szimulátorban nézd meg, hogy tudsz-e breakpointot betenni a lcd_putstr sorába. Ha nem, akkor az a sor nem is kerül be a programodba.
(#) edison14 válasza sikolymester hozzászólására (») Aug 17, 2011 /
 
Helló. Próbáltam tenni breakpoint-ot de nem sikerült. Mit jelent az hogy eloptimalizálja valamit nem úgy fordít le ahogyan kéne? Ez ellen hogyan lehet fellépni?
(#) vilmosd válasza edison14 hozzászólására (») Aug 17, 2011 /
 
A break nelkul a vegrehajtast folytatja a kovetkezo erteknel, amig ki nem lep a vegen. Azert hasznalunk break utasitast, hogy csak az a case ag legyen vegrehajtva, amire eppen szukseg van. Ez nem AVR tulajdonsag, ez Ansi C tulajdonsag. Az AVR C-nek kovetnie kell(ene) az Ansi C szabvanyt. Az meg hogy kioptimalizal egy fvenyt, azt nem hiszem. Meg kellene nezni (ha lehet) az ASM kimenetet. Persze ha csinal a fordito.
(#) edison14 válasza vilmosd hozzászólására (») Aug 17, 2011 /
 
A break utasítás tudom mire szolgál és az ott is volt csak itt a fórumon nem írtam oda. Assembly kimenet nincs. Hogyan tudom megadni a fordítónak, hogy készítsen asm kimenetet?
(#) vilmosd válasza edison14 hozzászólására (») Aug 17, 2011 /
 
Nem tudom en csak PIC-eket programozok, viszont a C nyelvet ismerem.
(#) gtk válasza edison14 hozzászólására (») Aug 17, 2011 /
 
A gombnyomas milyen szintet hoz letre a PD1 labon ?
(#) zombee válasza edison14 hozzászólására (») Aug 17, 2011 /
 
Hello!

Hardver hibád lesz, az tuti! 74HC595-nél pár dologra oda kéne figyelni. Kb. 3 éve építettem először ilyen áramkört, akkor nekem is csak kb. 10-edikre ment és ha mostanság úgy dobok össze valamit akkor is sűrűn elszúrok valamit.

0. hibalehetőség: nyugalmi állapotban egyik bemeneti láb sem lóghat, kivéve a DATA!
1. hibalehetőség: /MR lábat tessék a tápra(VCC) kötni!
2. hibalehetőség: /OE lábat a földre(GND) kell kötni, kivéve ha az ST-vel kötöd össze.
3. hibalehetőség: ST lábat nyugalmi állapotban le kell húzni a földre(10k ellenállás)

Ajánlott lábtakarékos bekötés: az ST és a /OE lábakat össze kell kötni, és egy 10k ellenállással a tápra(VCC) húzni. Ez pont az ellentéte a 2-es és 3-as pontban leírtaknak, de a lábmegtakarítás mellett van egy olyan előnye hogy amikor az AVR inaktív vagy bekapcsoláskor éppen feléled, a kimenetek nagyimpedanciásak lesznek egészen addig, amíg az AVR a legelső bájtot át nem küldi a shift regiszternek. Ezáltal a /MR nyugodtan a tápra(VCC) köthető.
(#) Reggie válasza edison14 hozzászólására (») Aug 17, 2011 /
 
avr-objdump -w -d >

Ha van ra lehetoseged, akkor a switch-et rakd at kulon fuggvenybe, mert ugy konnyebb megtalalni a forrasban.

De szerintem a problema ott kezdodik, hogy a
  1. ((PIND & (1<<PD1)))
kifejezes mindig igaz, igy folyamatosan noveli az i erteket.
Velemenyem szerint eloszor azt probald meg, hogy a switchen kivulre, pl. a switch ele, rakjal egy ellenorzest, hogy ha az i erteke mondjuk eleri a 40-et, akkor irjon ki valamit. Ha ezt a valamit kiirja, akkor tuti nem a switch-el van baj, hanem az, hogy folyamatosan no az i erteke.
Következő: »»   350 / 837
Bejelentkezés

Belépés

Hirdetés
Lapoda.hu     XDT.hu     HEStore.hu
Az oldalon sütiket használunk a helyes működéshez. Bővebb információt az adatvédelmi szabályzatban olvashatsz. Megértettem