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   593 / 839
(#) Szabi1 hozzászólása Márc 10, 2014 /
 
Ha jól emlékszem itt hobbin volt egy cikk ahol valaki avr rel és lcd vel épített karórát ami andoridos telóval kommunikált, nem tudná valaki a linket elküldeni?
(#) Istvanpisti válasza Szabi1 hozzászólására (») Márc 10, 2014 /
 
(#) Sihu12 hozzászólása Márc 11, 2014 /
 
Szeretnék elkezdeni komolyabban foglalkozni Avrekkel. Az lenne a kerdesem, hogy milyen programozo\debuggert ajanlotok lehetoleg nem tul dragan??? Avr dragonnal van valakinek tapasztalata???
(#) esemve válasza Sihu12 hozzászólására (») Márc 11, 2014 /
 
Én ezt használom, szerintem teljesen jó: Bővebben: Link

Bár bevallom férfiasan én megvettem mert előbb kezdtek el érdekelni az AVR-ek mint maga az elektronika... Ha meg össze akarod rakni még cikk is van belőle.
(#) Sihu12 válasza esemve hozzászólására (») Márc 11, 2014 /
 
És ez működik atmel studio 6-al? valamint van rendes debug??
(#) zombee válasza Sihu12 hozzászólására (») Márc 11, 2014 /
 
Studio6-al csak JTAGICE MK2/3 illetve AVR Dragon tud debuggolni. Studio4 alól JTAG ICE (MK1) is.
De nem értem miért a debuggal kezd valaki programozni? Én sok-sok éve AVR-ezek
de igazából nem volt debugra szükségem, csak az egyetemen erőltették (de hiába).
(#) Massawa válasza zombee hozzászólására (») Márc 12, 2014 /
 
Csak meg tudom erösiteni a szavaid. Én is Dragonnal dolgozok, de csak az AVR Studio4-el, jobban tetszik, egyszerübb és a barátom (immár 50 éve profi programozo) is ezt ajánlotta és használja, igy könnyebb vele szot érteni és a segitségét kérni.......
Debuggerre nekünk sem volt eddig tul gyakran szükségünk, igy ez aligha lehet döntö a használathoz.
(#) HöTö hozzászólása Márc 14, 2014 /
 
Helló!!
A következő problémával fordulnék hozzátok.
Van egy OV7670 típusú kameramodulom, nem olyan amin rajta van a FIFO és az oszcillátor. Ezen nincs semmi. A kérdésem az lenne hogy mi az az eszköz amit például a mellékletben lévő rajzon is bekötöttek oszcillátor ként mert típus az nincs rajta és biztos hogy nem egy sima kvarc. 24MHz-es oszcillátor kell az üzemeltetéséhez. Valamint érdekelnének mások tapasztalatai akik már használták ezt az eszközt. Én ugyan egy Stelaris panellal akarom meghajtani ami 3,3V-os de a kamara maximum csak 3V-ot fogad a digitális bemenetein az adatlap szerint így jól jönne néhány szintillesztési tanács stb.

Az általam használt modulról is teszek fel egy képet.

A segítséget előre is köszönöm.
(#) Massawa hozzászólása Márc 16, 2014 /
 
Nekem is némi segitség kellene.
Van egy nagy táblázatom (10x4), amiben 3 minden esetben változik a negyedik azonban mindössze 3 konstans értéket vehet fel.
Kb igy néz ki:
  1. .dw mez1
  2. .dw mez2
  3. .db mez3
  4. .db x
  5. .dw mez1
  6. .dw mez2
  7. .db mez3
  8. .db xx
  9. .dw mez1
  10. .dw mez2
  11. .db mez3
  12. .db xxx
  13. ......


Ahol az x csak egy a három konstans értéket veheti fel x,xx,xxx. ( az egyik sajnos nagyobb, mint 255, igy egy byte-l nem lehet ( vagy nem tudom, de szeretném) elintézni.
Van valakinek ötlete, hogyan kezeljem. ( az elsö 3 változoval mez1,2,3 a program már megy, csak a 4. Változot is be kell valahogyan rakni.
Az volna a legjobb, ha az x,xx,xxx egy-egy tárhelyre mutatna, ahol az odavágo érték van, igy talán nem kellene erre az értékre 2 byte-t elpazarolní és talán egyszerübb lenne a kod.

Kösz
(#) TavIR-AVR válasza (Felhasználó 15355) hozzászólására (») Márc 16, 2014 /
 
Timer 0 : Arduinoban _kötött_. Nem átírható.
(#) kapu48 válasza (Felhasználó 15355) hozzászólására (») Márc 16, 2014 /
 
Rengeteg ilyen programot találsz, csak kicsit kellene keresgélned!

Pl.: AVRCalc

Ha beállítgatod az értékeidet! Megmutatja a 8 és16 bites számláló regisztereibe szükséges értékeket.
(#) kapu48 válasza (Felhasználó 15355) hozzászólására (») Márc 16, 2014 /
 
Akkor keress adatlapot!

ATmega328P
http://www.atmel.com/Images/Atmel-8271-8-bit-AVR-Microcontroller-AT...et.pdf

16. 16-bit Timer/Counter1 with PWM
16.11.5 OCR1AH and OCR1AL – Output Compare Register 1 A

Jól láthatóan itt 2 bytes regiszterek vannak.
(#) Istvanpisti válasza (Felhasználó 15355) hozzászólására (») Márc 16, 2014 / 1
 
Szia!
A TIMER1 az 16 bites, a TIMER0 pedig 8 bites. A beállítható üzemmódok kódjai is mások, ezért ad a TIMER1 - a TIMER0-hoz hasonló beállítással - PWM jelet.
Ha 20MHz-es jelből szeretnél 1 Hz-es interruptot, akkor 1024-es előosztás kell, és OCR1A-ra pedig 19530-at kell beállítani. A CTC üzemmód beállítását nem a TCCR1A, hanem a TCCR1B regiszterben kell végezni.
  1. OCR1A = 19350;
  2. TCCR1B = (1<<WGM12)|(1<<CS12)|(1<<CS10);  //1024-es előosztás, időzítő indul!CTC mód(OCR1A elérésekor lenulláz)
  3. TIMSK1|=(1<<OCIE1A);            //enable interrupt(OCR1A elérésekor)
  4.  sei();
(#) kapu48 válasza (Felhasználó 15355) hozzászólására (») Márc 16, 2014 /
 
Régen rossz, neked, ha kioktatásnak veted a tanácsaimat!

Istvanpisti-töl megkaptad a sült galambot!
„nem értem a működésüket!” Így soha nem is fogod megérteni!
(#) kapu48 válasza (Felhasználó 15355) hozzászólására (») Márc 16, 2014 /
 
Közel sem vagyok vérprofi!
Csak ha érdekel valami, én próbálom meg keresni a megoldást.

Mert úgy jobban megmarad a fejemben, mint ha valaki más meg teszi helyettem.

(#) zombee válasza (Felhasználó 15355) hozzászólására (») Márc 16, 2014 / 2
 
Szia!
Látom én kellek ide. Alvin koncert után kicsit nehéz a koránkelés...

ATMega328: az időzítők pontosan úgy működnek ahogy a kisebb testvéreiben, de még a vele lábkompatíbilis ATMega8-ban is. Egyedül ASM-ben kell odafigyelni az interrupt címekre, de látom C-ben vagy. Szóval: 20MHz az IC, ebből 1MHz megszakítás kell. Sajnos a legnagyobb előosztó(1024) nem jó mert nem egész osztója 20M-nak. Marad a 256: 20000000/256=78125. Sajnos ez meg már nagyobb mint 65536(ennyit tud max. a 16 bites timer), ezért a kódban némi kompromisszumot kell kötni. Ettől még lesz 1Hz-es megszakításod, ne félj! Ehhez a programkódban egy segédváltozót(utóosztó) kell bevezetni, amit a megszakításban növelsz. Az utóosztó egész osztója lesz a 78125-nek, és fontos hogy az így kapott érték 65536 alatti legyen. Ezért legyen 5. Ha az utóosztó elérte a maximumát, akkor lenullázza és továbblépsz az 1Hz-es megszakítás kódra. Valahogy így:
  1. int main(void)
  2. {
  3.   TCCR1B = (1<<WGM12) | (1<<CS12); //CTC mód ICR1 plafonnal, előosztó:256
  4.   TCCR1A = 0; //itt (is) állíthatsz PWM módot, ill PWM esetén a kimeneti lábak funkcióját.
  5.   OCR1A = 15624; // (78125/5)-1
  6.   TIMSK1 = 1<<OCIE1A;
  7.   sei();
  8. }
  9.  
  10. uint8_t u = 0;
  11. ISR(TIMER1_COMPA_vect)
  12. {
  13.   if(++u == 4)
  14.   {
  15.     u=0;
  16.     //(...) ide jöhet az 1Hz-es kód...
  17.   }
  18. }


Az utóosztó egyébként 8 bites időzítőknél is használatos. Az "u"-t (mivel nem volatile)
ne próbáld meg elérni más függvényekből, az kizárólag a megszakításból használható.
A hozzászólás módosítva: Márc 16, 2014
(#) zombee válasza zombee hozzászólására (») Márc 16, 2014 /
 
Ha hardveres PWM jelet akarsz 1Hz-es jellel akkor további trükköket kell bevetni. Egy nem használt időzítővel(pl. Timer2) előállítasz egy hardveresen előosztott jelet, majd ezt rávezeted az 1-es timer "T1" lábára ami már a beállított értékre leosztja és PWM-et generál neked. Ha szimmetrikus 1Hz-es négyszögjel kell akkor a T1-re kötött frekinek alapból páros Hz-nek kell lennie. Most csak az elméletet írom le: Timer2-vel előosztó 64: 20000000/64=312500; Az OCR2A értéke 124 lesz (125-tel oszt: 312500/125=2500). Az OCR2B-t pedig beállítod "valahol" a felére(ezt nem kell pontosan), majd az OC2B kimenetre beállítod hogy PWM kimenet legyen, így az időzítő is természetesen PWM módba lesz. Az OC2B-t összekötöd a T1-el, így a 16 bites Timer1 egy 2500Hz-es jellel fog dolgozni. Sajnos előosztót ilyenkor nem tud, de nem is annyira lényeges, mert a 2500 már bőven 65536 alatt van. Most annyi a változás hogy az ICR1-et 2499-re kell állítani, az OCR1A (vagy OCR1B) értékét PONTOSAN (2500/2)-1=1249 értékre! A megfelelő lábat(OC1A vagy OC1B) pedig beállítod PWM-es kimenetnek...
(#) zombee válasza Massawa hozzászólására (») Márc 16, 2014 /
 
A ".db" és ".dw" az a kódszegmensbe ír, az adatok fixen vannak. Te az adatszegmensbe
akarsz írni, ne keverd a kettőt! Most kiragadok egy példát egy régi kódomból:
  1. .cseg
  2. .org $003A
  3. lcd_message:    .DB             'z','o','m','b','e','e',' ','L','C','D',' ','d','r','i','v','e','r',0
  4.  
  5. .dseg
  6. ;delta_time  :  .byte 8    ;eltelt idő kiszámítva
  7. ;meas_cnt    :  .byte 8    ;számláló értéke
  8. _ccal             :  .byte 8    ;kalibráló kondi
  9. _Lm              :  .byte 8    ;mérő tekercs
  10. _Cm             :  .byte 8    ;mérő kondi
  11. _4mpi2        :  .byte 8    ;4 millió pi négyzet
  12. _1mrd         :  .byte 8    ;1 milliárd
  13. _null            :  .byte 8    ;0 ^-^

Utóbbiak mind 64 bitesek, ezért a "byte 8"!!!
A hozzászólás módosítva: Márc 16, 2014
(#) Massawa válasza zombee hozzászólására (») Márc 16, 2014 /
 
Kösz, de nekem más a problémám:
A mez1,2,3 egy-egy adatot ( mez1) ad a mez2-höz, és ezt a mez3 helyre irja.
Ez eddig megy, a mez1,2,3 adatoknak 10-10-10 értékük van ( azaz egy algoritmusban olvasom be a 3 egymással összefüggö adatot - 6 byte - fenti táblázat alapján.
Ebbe az algoritmusba most be kellene vinnem még egy összehasonlitást a mez1 és a mez2 eredményéhez viszonyitva, azaz amennyiben a mez1+mez2 > mint x,xx vagy xxx, attol függ, hogy éppen, hogy mit tartalmaz a mez1 ill mez2, de az x-k csak 3 konstans értéket vehetnek fel (3599,200 ill.1), és amennyiben a mez1+mez2>x, akkor ne történjen semmi. Beirhatnám minden táblázati blokkba az x valos értékét, de akkor oda is egy 2 bytes register kellene, azaz a 6 helyett 8.
(#) zombee válasza Massawa hozzászólására (») Márc 16, 2014 /
 
Az egyszerű dolgokból születnek a nagyszerű dolgok, a bonyolultakból meg csak káosz. Amit itt leírtál, az nekem nagyon érthetetlenül hangzik. Ne próbáld meg még jobban elmagyarázni, úgyse fogja érteni senki. A konkrét problémát kellene leírni, fogadok hogy 2-3 sorba belefér.
(#) Massawa válasza zombee hozzászólására (») Márc 16, 2014 /
 
Talan meg egyszer, ( többet már nem foglak strapalni )

A feladat:
A+B= Z
Ha Z>X. akkor nem történik semmi
Z beirni a C helyre


Az A,B,C változok (10 különbözö csomag), ezeket olvasom be a táblázatból, és ezt kéne kiegésziteni az X-l.
Az X is változo, de csak 3 különbözö konstans ( az érték a C függvénye)

Képzelj egy C fiokot aminek a rekeszeibe 1,2 ill 3 jegyü számot lehet berakni, azaz az adott müvelethez mindig tartozik egy X hely, amit változtatni kell a C függvényében. ( a C-nek 10 értéke van az X-nek csak 3.)
(#) Massawa válasza Massawa hozzászólására (») Márc 16, 2014 /
 
Már megoldottam.
(#) AMD hozzászólása Márc 16, 2014 /
 
Sziasztok!
A Topi féle dallamcsengőt szeretném reprodukálni kevés sikerrel. Dugdosós panelon össze van rakva ATmega8 avr-rel. Sajnos nem tudom lefordítani a forráskódot. A "Nyolc lábbal" cikkben lévő villogót, a csipogót és a közlekedési lámpát simán le tudtam fordítani és működik is. A dallamcsengővel nem boldogulok. A WinAVR mindig hibát ír. Tudna valaki segíteni?
Előre is köszönöm!
A hozzászólás módosítva: Márc 16, 2014
(#) zombee válasza AMD hozzászólására (») Márc 16, 2014 /
 
Ahogy elnézem a kódot és a hibaüzenetet(AVR Studio 4 - ből), a PCIE-vel lesz a gond.
Úgy néz ki hogy Topi nagyon kedveli a "Pin Change" interruptos cuccokat.
Ez sajnos az ATMega8-ban nincs meg, de az ATMega48/88/168/328 vonalon igen.
Szintén az ATMega8 ellen szól, hogy a Timer0 (amit Topi használ) csak nagyon minimális
funkcionalitással bír az ATMega8-ban, azaz nem alkalmas PWM jel generálására.
Ez a része kicsit bonyolultabb mint a nyomógomb érzékelés, egy teljesen más progi kéne hozzá.
Ha nem akarsz éjszakákon át kísérletezni vagy új programot írni, jobb lesz ha veszel egy 8 lábút...
A hozzászólás módosítva: Márc 16, 2014
(#) holex hozzászólása Márc 18, 2014 /
 
Sziasztok. Az AVR közvetlenül a kazán mellett üzemel, a tápegység is ott van bedugva. Amikor a kazán be- vagy kikapcsol, hajlamos hülyeségeket írni az LCD-re, vagy épp elállítódni a kurzor, de volt már olyan is, hogy egy változó értéke szállt el. Nyilván kap valami zavart a kazán kapcsolásánál, mert máskor sosem jelentkezik a hiba. Hogy lehetne ezt elkerülni? Nem értek az elektronikához, de gondolom valami kondenzátor kellene az AVR táplábai közé. Jól sejtem? Ha igen, mekkora értékű?
A hozzászólás módosítva: Márc 18, 2014
(#) Szabi1 válasza holex hozzászólására (») Márc 18, 2014 /
 
A kazán keverőszivattyúját kapcsolja, relén keresztűl? Lehet ajánlatos egy árnyékolt dobozba szerelni, vagy kéne valami hálózati zavarszűrőt alkalmazni az AVR tápegység primerjénél. (Mint ami van a PC tápegységek primer részénél, (a kinaiból sajnos kihagyják manapság) )
Ha akkor sem szűnik akkor, opto-s megoldással kéne kapcsolgatni a keverő-szivattyút.(pl. optotriac szilárdtest relé)
A hozzászólás módosítva: Márc 18, 2014
(#) holex válasza Szabi1 hozzászólására (») Márc 18, 2014 /
 
Nem, nem, semmi köze a kazánhoz, egy keltetőt vezérel, csak épp a kazánnál került elhelyezésre Amúgy egy sima mezei 1,5V-12V-os állítható univerzális tápegységről működik, (persze az AVR előtt van van egy MC33269D-5.0 feszültségstabilizátor). Akkor az univerzális tápegység elé kell tennem valamit? Tudsz hozzá adni egy kapcs. rajzot? Mert most hirtelen felindulásból az AVR táplábai közé tettem egy 220 mikrós kondenzátort, úgy tűnik, hogy megszűnt a hiba, viszont akkor ezek szerint csak véletlen, nem itt van a kutya elásva.
(#) Ricsi89 válasza holex hozzászólására (») Márc 18, 2014 /
 
Szerintem az avr tápját kellene megszűrni rendesen, valami nagyobb értékű puffer a tápra, meg 100 nF-os kerámiakondi az avr táplábai közé a lehető legrövidebb bekötéssel.
(#) AMD válasza zombee hozzászólására (») Márc 18, 2014 /
 
Értem. Köszönöm a segítséget!
(#) prody hozzászólása Márc 19, 2014 /
 
Sziasztok,

Elég érdekes a problémám, és már feladtam, hogy tovább agyaljak rajta, mert egyszerűen nem áll össze mi lehet a probléma. Több témakört is megjelöltem mivel nagy valószínűséggel én vagyok tudatlan és valamilyen alapvető elektronikai jelenséggel nem vagyok csak tisztában.

Szóval a problémám az adott: a csatolt áramkör.

Nagyon egyszerű, a feladata az, hogy 1 percig engedje rá direktbe a tápfeszültséget az akkumulátorra, azaz egy egyszerű bikázó.
5V a tápfesz, az akkumulátor kapcsaira a tranzisztor vesztesége miatt kb. 4V kerül, ami pont ideális egy 4,2V-os akkumulátor bikázására.

Amíg nem teszek rá terhelést, azaz az akkumulátor nincs rajta a tranzisztor kollektorán, minden tökéletesen működik, viszont ha rajta van a terhelés az 1 perc letelte után, amikor az adott IO pint amivel vezérelem a tranzisztort átbillentem 0-ba a mikrokontroller újraindul... De fogalmam sincs hogy miért.
Próbáltam már az adott lábat bemenetnek állítani mielőtt lenullázom, engedi bemenetnek állítani, majd visszaállítom kimenetnek, lenullázom és azonnal újra is indul a programsor. Terhelés nélkül viszont semmi baj.
Remélem érthetően írtam le a dolgot.
Ami biztos a terhelés nem nagy, nem akkora, hogy a feszültség leessen annyira, hogy a mikrokontroller újrainduljon.
Valamiféle visszahatása lehet a tranzisztornak terhelt állapotban az áramkörre, de fogalmam sincs hogy mi.
Valami ötlet?

bikazo.png
    
Következő: »»   593 / 839
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