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   254 / 840
(#) echo11 hozzászólása Júl 27, 2010 /
 
Hello! Fizikushoz lenne pár kérdésem a legfrissebb cikkjével kapcsolatban...(igaz még csak attiny45-el szórakozok, de majd nem lenne rossz egy ilyet is megcsinálni) 1) azt a Bluetooth modult egy külföldi oldalról vetted valamivel olcsóbban, mint a hestore-on. Már kinézetre is különböznek. Ezek mennyire kompatibilisek egymással? (kivezetések, programok,stb.) 2) a 3,3 és 5 V-os átalakító panelt honnan vetted meg? 3) tudom, hogy igényesebb a feszültség átalakító panellal dolgozni, de a másik megoldás, miért nem olyan jó? Egyébként nagyon igényesen megcsináltad a cikket, és nagyon nagy tisztelet jár neked ezért, mert ez nem "csak" egy hétköznapi avr-programozás.(nem is tudom elképzelni, hogy honnan olvastad ezeket) :worship: :eek2:
(#) vagnerjazon válasza vagnerjazon hozzászólására (») Júl 27, 2010 /
 
Elnézést kérek, közben megoldódott (mindkét ciklust beletettem egy közös végtelenbe).
(#) Ricsi89 válasza vagnerjazon hozzászólására (») Júl 27, 2010 /
 
Az egészet bele kellene tenni egy végtelen ciklusba, mert ha nem teszed, akkor nem fog visszaugrani az elejére, hogy újra megcsinálja az első ciklust.
Szerk.: Gyorsabban jöttél rá, mint ahogy én beírtam.
(#) vagnerjazon válasza Ricsi89 hozzászólására (») Júl 27, 2010 /
 
Igen, de azért köszönöm, hogy válaszoltál.
(#) v alaki válasza Fizikus hozzászólására (») Júl 27, 2010 /
 
Hoops,
Elsőre valóban átsiklottam ezen, de újra átnézve az első cikk 2.táblája és a második cikkben leírt parancs (0001) szerintem nem egyezik. Jól gondolom?
Mellékletben a problémám.
Köszi.

kérdés.JPG
    
(#) killbill válasza v alaki hozzászólására (») Júl 27, 2010 / 1
 
hol van a cikkben 0001? Szerintem jo a cikk, azt irja, amit az angol doksi is. Eloszor 0011xxxx, ami 8 bitesre allitja, majd 0010xxxx, ami a 4bites uzemmod.
(#) (Felhasználó 4577) válasza vagnerjazon hozzászólására (») Júl 27, 2010 /
 
Fejlődőképes vagy.
A break; utasítással ki is lehet lépni a ciklusból.
(#) vagnerjazon válasza (Felhasználó 4577) hozzászólására (») Júl 27, 2010 /
 
Köszönöm. A break-et is, ezt eddig nem ismertem.
(#) (Felhasználó 4577) válasza vagnerjazon hozzászólására (») Júl 27, 2010 /
 
Mostmár ismered.
Szívesen!
(#) vagnerjazon hozzászólása Júl 27, 2010 /
 
Csináltam gyakorlásképpen egy egyszerű "kódzárat". Csak 2x2 nyomógomb van rajta, és nem állítható (legalábbis nem egyszerűen) a kód, viszont van rajta néhány "extra": gombnyomáskor sípol egy picit, háromszor lehet rossz kódot beütni, negyedikre nem enged ki a szirénából (addig is szirénáz, csak addig egy gombpárossal ki lehet lépni belőle, bár ha valaki nem azt a két gombot nyomja, már az első rossz kódnál szirénázva marad), jelzi három LED-del, hogy mennyi van még hátra, ha elütöttem a kódot, de még nincs meg a négy gombnyomás, akkor vissza lehet vonni az addig beírtat, ha belépek, akkor törlődik a próbálkozások száma. Lehet, hogy kihagytam valamit, ha érdekel valakit ez az egész, csinálok videót. Majd még annyit tervezek, hogy beírom eepromba a rossz próbálkozásokat, hogy ha közben kikapcsolódik, ugyanonnan folytatódjon, de egyenlőre elég ennyi. Szóval ha érdekel valakit bővvebben, szóljon, és csinálok videót.
(#) atya hozzászólása Júl 27, 2010 /
 
Sziasztok!

TSOP1736-al szeretnek taviranyitobol jeleket venni. Sajnos sehol nem talaltam leirast, a teljes jelmodulaciorol, igy gondoltam majd en kikiserletezem.

  1. ISR(TIMER1_COMPA_vect) {
  2.         if (!( PIND & (1<<PIND3)) ) {
  3.                 current = 1;
  4.         } else {
  5.                 current = 0;
  6.         }
  7.  
  8.         if((prev == 1) && (current==0)) { //H -> L atmenet
  9.                 state = L;
  10.         }
  11.  
  12.         if ((prev == 0) && (current == 0) && (state == L)) { // L szamolas
  13.                 ++time;
  14.         }
  15.  
  16.         if ((prev == 0) && (current == 1) && (state == L)) {    // L -> H
  17.                 if(time > maxtime) maxtime = time;
  18.                 if((time < mintime)&&(time > 10)) mintime = time;
  19.  
  20.                 PORTC = mintime;
  21.                 PORTA = maxtime;
  22.  
  23.                 state = H;
  24.                 time = 0;
  25.         }
  26.  
  27.         prev = current;
  28. }


Azert a portokra teszem, mert nincs mas eszkozom, amivel nezni tudnam. ( UART illesztot meg nem sikerult mukodesre birni, LCD-t meg nem vettem ).
Az A porton maximumnak 200 koruli ertek jelenik meg, C porton minimumnak 2. Itt mar szurve van a kod, csak 10nel nagyobbakat mutatja, igy 13-at kapok...
Ezekkel a beallitaskal megy a timer, belso 8MHzes orajelrol:
  1. TCCR1B |= (1<<WGM12);
  2. TIMSK |= (1<<OCIE1A);
  3. sei();
  4. OCR1A = 100;
  5. TCCR1B |= (1<<CS11);


Tudtok mondani valami konkret idozitest, amivel a jeleket dekodolni tudnam? Esetleg egy konkret IR leiras is megteszi.

Udv.:
Atya
(#) (Felhasználó 4577) válasza vagnerjazon hozzászólására (») Júl 27, 2010 /
 
Engem érdekel, jöhet a videó!
(#) vagnerjazon válasza (Felhasználó 4577) hozzászólására (») Júl 27, 2010 /
 
Ok, mindjárt.
(#) vagnerjazon válasza vagnerjazon hozzászólására (») Júl 27, 2010 /
 
Sajnos elég lassú lesz (youtube-ra teszem), mert elég nagy, de amint fent van, írok(kb.:egy és egynegyed óra).
(#) Fizikus válasza echo11 hozzászólására (») Júl 27, 2010 /
 
1) A HEstore-os BT modult nem nagyon tanulmanyoztam, de ugy tunik hogy mas parancsokat hasznal, ezert mashogy lehet beallitani. De egyebkent a hasznalatanak az elve ugyan az (BT-n keresztul egy virtualis soros portot hoz letre a Pc-kozott)
2) Innen rendeltem (jelenleg itt vagyok az also felteken) Logic Level Converter
3) elvileg az ellenallasokkal is ugyan olyan jo, csak ha mar vettem egy ilyet, akkor ki akartam probalni hogy mukodik-e.

Minden infot a neten talaltam (legtobbszor angolul), es megprobaltam megerteni hogyan mukodnek a dolgok. Utana megprobaltam megcsinalni magamtol es ha sikerult, akkor irtam rola cikket, mert akkor ert meg valamit igazan az ember, ha el is tudja azt masnak magyarazni. Ha hiszed, ha nem, csak kb 1 evvel ezelott kezdtem el elektronikaval foglalkozni.
A programozas nem az erossegem, egyetemi eveim alatt is csak egy felevig volt egy targy ami az alapokkal foglalkozott, ezert annak nagyon orulnek ha nekem is jol menne a "csak" hetkoznapi avr programozas.
(#) Fizikus válasza atya hozzászólására (») Júl 27, 2010 /
 
Idézet:
„Tudtok mondani valami konkret idozitest, amivel a jeleket dekodolni tudnam? Esetleg egy konkret IR leiras is megteszi. Udv.: Atya”


Szia!
Ezt nezted mar?: Távirányító jelének fogadása uC-vel
(#) atya válasza Fizikus hozzászólására (») Júl 27, 2010 /
 
Szia! Igen.

Regen El is felejtettem, hogy van ilyen cikk. Mint irtam, fogalmam sincs a jelekrol, scope-om pedig nincs.

A hangkartyara illesztes hogyan mukodik? Gondolom mikrofon oldalra, es valami grafikus hangmodulalo programmal ( Audacity, Windows hangrogzito? ). Az illesztesnek a mikentje erdekelne.

Gondoltam megszamolom a kuldott biteket, es csainaltam egy external interruptos programocskat. Kimenete szinten az egyik port. Porbaltam any change, rising, falling edge-re is beallitani, az eredmeny mindig ugyan az lett: Egy ideig novelte a port erteket, utana nem reagalt semmit. Probaltam vezetekkel birizgalni a labat, akkor sem volt semmi. Nem ertem
(#) novarobot válasza vagnerjazon hozzászólására (») Júl 27, 2010 /
 
Köszi, ez maradt ki, pedig első telepítéskor még eszembe volt.

Most az a baj, hogy a P2-es 450MHZ-s gépemen nem tudok égetni (XP alól), szerintem lassú neki a processzor, vagy nem tudom.

Le lehet valahogy lassítani az égetési sebességet, hogy esetleg azon a gépen is működjön a WIN-AVR?

Novarobot.
(#) vagnerjazon válasza novarobot hozzászólására (») Júl 27, 2010 /
 
Szívesen. A másik kérdésedre viszont sajnos nem tudok mit mondani.
(#) vagnerjazon válasza (Felhasználó 4577) hozzászólására (») Júl 27, 2010 /
 
Itt vannak: Első, második. Remélem, azért látni, hogy mi miért van és hogyan.
(#) v alaki válasza killbill hozzászólására (») Júl 27, 2010 /
 
Szia killbill
Szóval..... őőőőő.... igen.
Kösz.
(#) edison14 hozzászólása Júl 27, 2010 /
 
Hali.

Az LCD-nél az adat vonalakat hogyan tudom beállítani, hogy hova csatlakozzanak az AVR-hez? Ez így jó:
  1. #define LCD_D4 D       
  2. #define LCD_D4_POS      PB4
  3.  
  4. #define LCD_D5 D       
  5. #define LCD_D5_POS      PB5
  6.  
  7. #define LCD_D6 D       
  8. #define LCD_D6_POS      PB6
  9.  
  10. #define LCD_D7 D       
  11. #define LCD_D7_POS      PB7
(#) zsuscsinyo hozzászólása Júl 28, 2010 /
 
Sziasztok!

Érdekes problémával fordulok hozzátok, a megszakításkezelésnél az ISR rutin kétszer fut le egymás után miközben én egyszer hívom meg (1 lefutó jellel az INT0-án). Belépéskor rögtön tiltom a globális megszakítást,valamint "törlöm" a flaget. A másik, hogy a GIFR regisztert nem tudom írni, írás után rögtön kiolvastam de mindíg 0. A kérdésem, hogy is van ez? Atmega16-on kísérletezgetek.
(#) Topi válasza zsuscsinyo hozzászólására (») Júl 28, 2010 /
 
Ha interruptban vagy, akkor miért törlöd a flag-et?
Nézd meg azt is, hardveresen hogyan épül fel az interrupt mechanizmusa.

A GIFR regiszter nem olyan regiszter mint bármi más... Eleve a flag regiszterekre ez elmondható. Törölni is nem véletlen úgy törölsz, hogy az 1-re egyet írsz. Ezek "billegnek". Ez nem írható - olvashat oly módon, mint ahogy ezt más regiszternél megszokhattuk.
Ezek mögött nem D tárolók, hanem RS és JK FlipFlop-ok vannak.

Beeshet nála magasabb prioritású interrupt, hogy indokolt a letiltás?
Egyébként sokszor interruptban nem szabad használni a cli, sei párost. Többször tapasztaltam, hogy legfőképp magasabb prioritású interruptoknál a státusz regisztert hazavágja.
Ha mindenféleképpen szükséges tiltani más interruptokat (ami azért elég ritka, tipikus ismertető jele az "igénynek", hogy túl hosszú az ISR tartalma) akkor az alábbit szoktam csinálni. Működik, és sok optimalizálási miatti cifraságot gyógyít meg:
  1. SIGNAL(.....) {
  2.   unsigned char sreg;
  3.   sreg = SREG;
  4.   cli();
  5.   ...
  6.   ...
  7.   SREG = sreg;
  8. }


Ez akkor is hasznos, ha az SREG-ben mást is használsz. És akkor is hasznos, ha máshol direkt tiltod az interruptokat.
Ha nem így csinálod, és a végén sei-t hívsz, abból gond is lehet... Mert lehet hogy főprogramban valahol direkt tiltottad... Az ISR meg újra engedélyezi. A fentebbi megoldás erre is gyógymódot ad, mert azt teszi vissza ami volt előtte.

Ha az interrupt egyéb okán szükséged lenne mégis letiltásra, vagy azonnali cselekvésre, akkor NAKED ISR-t használj. Ott az történik, amit Te akarsz. Nem úgy indul, hogy stack-be teszi a GPR-eket... Konkrétan tök üres.
Gyorsaságot kapsz, cserébe rengeteg alacsony szintű kötelező játékért. ASM betétek, stack-ek kezelése (push - pop).
(#) edison14 hozzászólása Júl 28, 2010 /
 
Hello!

Az baj lenne, ha az alábbi képen látható 10uH induktivitás helyett 47uH-t tennék? Az adatlapban 10uH van csak ezért kérdem.

Kössz a választ.
(#) zsuscsinyo válasza Topi hozzászólására (») Júl 28, 2010 /
 
Köszönöm a választ! Amúgy azért próbálkoztam törölni, mivel egy infra jelsorozatot vételezek (RC5) és többszöri megszakítást idéz elő a PD2/INT0 lábon. Eddíg ezt a jelenséget nem tapasztaltam, többi mikrovezérlőn, többekközött az Atmega16-on is tökéletesen működött, ott sem kellett túlbonyolítsam, lehet hogy csak ez az egy példány viccel meg. Kipróbálom a kódot amit írtál, és jelzek mik a fejlemények.
(#) Topi válasza zsuscsinyo hozzászólására (») Júl 28, 2010 /
 
ICR-en vedd és ne INT0-án. Vagy ha INT0-án veszed, akkor NAKED ISR-el csak kapcsold be a timert, majd compare-nél olvass port állapotot.
Ha ICR-en veszed, akkor magától indítja a timert.
(#) kovacsj hozzászólása Júl 30, 2010 /
 
Sziasztok!

Most kezdem tanulni az avr programozást egy Atmega16-tal.

Van egy kódrészlet:
  1. ldi r16,low(ramend)
  2. out spl,r16
  3. ldi r16,high(ramend)
  4. out sph,r16
  5.  
  6. ldi r16,0x0
  7. out ddrb,r16
  8. ldi r18,0b00000001
  9.  
  10. program:
  11. in r17,pinb
  12. cp r17,r18
  13. breq megnyomva
  14. jmp program
  15.  
  16. megnyomva:
  17.  
  18. ldi r16,0xff
  19. out ddrc,r16
  20. ldi r16,0b00000001
  21. out portc,r16
  22. ret


A bajom ezzel az, hogy az AVR Studióban a ret után nem a jmp sorra ugrig vissza, hanem az ldi r16,low(ramend) -re.

Jól van ez így? És hogyan kellene a programba visszaugratni?

Köszönöm előre is!
(#) kovacsj válasza kovacsj hozzászólására (») Júl 30, 2010 /
 
Közben egy sorral kiegészítettem a programot, de nem vagyok biztos abban, hogy ez így nem gányolás.

  1. program:
  2. in r17,pinb
  3. cp r17,r18
  4. breq megnyomva
  5.  
  6. ide_vissza:
  7.  
  8. jmp program
  9.  
  10. megnyomva:
  11.  
  12. ldi r16,0xff
  13. out ddrc,r16
  14. ldi r16,0b00000001
  15. out portc,r16
  16. jmp ide_vissza


Már máskor is tapasztaltam, hogy a ret utasítás a legelejére küldi vissza a PC-t. Miért? Mit csinálok rosszul?
(#) zolee1209 válasza kovacsj hozzászólására (») Júl 30, 2010 /
 
Én így csinálnám:

  1. .org 0x000
  2. rjmp reset
  3.  
  4. portini:
  5. ldi r16,0
  6. out ddrb,r16 ;portb bemenet
  7. ldi r16,255
  8. out ddrc,r16 ;portc kimenet
  9. ldi r17,1
  10.  
  11. program:
  12. in r16,pinb
  13. cp r16,r17
  14. breq megnyomva
  15. jmp program
  16.  
  17. reset:
  18. ldi r16,low(ramend)
  19. out spl,r16
  20. ldi r16,high(ramend)
  21. out sph,r16
  22. rjmp portini
  23.  
  24. megnyomva:
  25. ; itt csinálsz, amit szeretnél
  26. ;esetleg
  27. ;inc r18
  28. ;out portc,r18
  29. ret



A "megnyomva" szubrutin számomra értelmetlen. Azonkívül, hogy ott állítod be a C port irányát, illetve mindig ugyanazt az értéket teszed ki, érdemileg nem változik semmi...
Következő: »»   254 / 840
Bejelentkezés

Belépés

Hirdetés
XDT.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