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   258 / 840
(#) (Felhasználó 4577) hozzászólása Aug 9, 2010 /
 
Sziasztok!

Van egy perverz kérdésem.

Szeretném tesztelni az Atmega8-omban a Watchdog-ot, eddig még nem foglalkoztam vele, de most jó lenne, ha lenne a készülékemben.

Milyen C utasítással vehetem rá arra, hogy a watchdog reset-elje a processzort?
Arra gondoltam, hogy bekapcsolok egy LED-et, csinálok egy 5 másodperces delay-t, kikapcsolom, és lefagyasztom, ha újraindul az AVR, akkor látni fogom, hogy a LED 5 másodpercenként villog. Legalábbis ha jól gondolom.

Szóval milyen utasítással lehetne lefagyásra bírni az AVR-t? :hide:
(#) Topi válasza (Felhasználó 4577) hozzászólására (») Aug 9, 2010 /
 
Mivel a WDT Clear-t neked kell meghívni, így a teszt egyszerű.

Főciklusban:
1. törlöd a wdt-t.
2. Felkapcsolsz egy LED-et
3. Vársz pár ms-et.
4. LED kikapcs
5. while(gomb lenyomva);
6. Vissza az 1-es pontra

Ha nyomott gomb mellett újra-újra felvillan a LED, akkor a WDT oldotta meg a végtelen ciklust.
(#) (Felhasználó 4577) válasza Topi hozzászólására (») Aug 9, 2010 /
 
Köszönöm a választ!

Nem is tudtam, hogy a figelőkutya while-nél is reset-eli az AVR-t.

Még lesz egy olyan része a programomnak, amiben érzékeli ha a tápfesz megszűnt (= csökken), ment és leállítja a Timert, stb és egy végtelen ciklusba lép.
Ennél a végtelen ciklusnál is újraindítaná a processzort?

Akkor az hogy lehet, hogy a fő végtelen ciklusnál nem indítja újra?

Még nem írtam meg ezt a részét a programomnak, egyenlőre ismerkedek vele, próbálom megérteni ezt a részét.
Ha jól sejtem annyiból áll, hogy 1-be billentem az Atmega8-amban a WDTON Fuse bitet, inicializálom a Watchdog-ot és végzi is a dolgát, program közben nem kell vele foglalkozni, csak a fő ciklus elején beállítani. Javíts ki kérlek, ha tévedek.
(#) Topi válasza (Felhasználó 4577) hozzászólására (») Aug 10, 2010 /
 
A WDT-t úgy képzeld el, mint egy normál timert, de a számlálójának a carry vagy itt esetünkben overflow bitje nem egy flag regiszterben kap helyet, hanem fizikailag rá van huzalozva a reset áramkörre.

A WDT szépen számlál felfelé. Ha túlcsordul akkor meghúzza a resetet. Ahhoz, hogy ne csorduljon túl, neked kell nulláznod a wdt-t mindig, amikor csak ráérsz. Természetesen ha a direkt beragadó while-ban is hívod a wdt clear-t akkor ott sem fog túlcsordulás történni soha.

Ezt főciklusban szokás csak clear-elni, hogyha bármelyik task beakad, akkor a főciklusba ugye nem tér vissza, így nem nullázódik... tehát kis idő múlva overflow lesz.
(#) (Felhasználó 4577) válasza Topi hozzászólására (») Aug 10, 2010 /
 
Értem, köszönöm!

Megírtam Atmega8-hoz a Watchdog részt, nem tudom, hogy jól képzelem-e el:
  1. int main()
  2. {
  3.         WDTCR = (1<<WDE) | (1<<WDP0) | (1<<WDP1) | (1<<WDP2);
  4.         egyeb_inicializalas();
  5.        
  6.         while(1)
  7.         {
  8.                 teszem_a_dolgom();
  9.                 MCUCSR = (1<<WDRF); //Reset-elem a Watchdog-ot
  10.                 itt_csinalok_meg_valamit();
  11.                 MCUCSR = (1<<WDRF); //Újra reset-elem a Watchdog-ot
  12.         }
  13.  
  14.  
  15. }


Így rendben van?

Szerk.: És persze a WDTON-t bekapcsolom.
(#) Topi válasza (Felhasználó 4577) hozzászólására (») Aug 10, 2010 /
 
Hát task hívást nem így szoktunk végezni, de lényegében jó.
Valójában task kezelésnél a folyamatok prioritással vannak jelen.

Technikai szempontból a kódod így jó. Ha pl. teszem_a_dolgom(); fgv-ben villantod a LED-et, az itt_csinalok_meg_valamit() fgv-ben meg végtelen ciklussal "beragasztod", akkor érezni fogod majd a wdt-t.

Jobban jársz egyébként ha használod az avr/wdt.h -t.
(#) (Felhasználó 4577) válasza Topi hozzászólására (») Aug 10, 2010 /
 
Nézegettem a wdt.h-t.

Akkor ha azt használom, így, igaz?
  1. int main()
  2. {
  3.         wdt_enable();
  4.         WDTCR = (1<<WDP0) | (1<<WDP1) | (1<<WDP2);
  5.         egyeb_inicializalas();
  6.        
  7.         while(1)
  8.         {
  9.                 teszem_a_dolgom();
  10.                 wdt_reset(); //Reset-elem a Watchdog-ot
  11.                 itt_csinalok_meg_valamit();
  12.                 wdt_reset(); //Újra reset-elem a Watchdog-ot
  13.         }
  14.  
  15.  
  16. }


Az mit jelent, hogy a task hívást nem így szoktunk végezni?
Hogyan csináljam helyesen?
(#) Topi válasza (Felhasználó 4577) hozzászólására (») Aug 10, 2010 /
 
Helyesen ez úgy történik, hogy a main loop mindig csak a kívánt, vagy esetenként csak egy taskot hajt végre. A taskok meghívását egy státusz változó és számláló vezérli.
Ha státusz változót használsz:
A prioritási szintek kialakítása úgy történik, hogy van pl a gomb olvasás, ami rövid. Ez mindig a ciklusban lefut.
Minden további tasknak van egy számlálója. Ezen számlálók minden ciklusban dekrementálódnak.
Ha nullák, akkor a taskot futtatod, majd a prioritásuknak megfelelően a saját task1_counter, stb.. taskn_counter-be írod a számot, amivel "késlelteted".
Ezek a visszafelé számlálások fogják létrehozni magát a task prioritást.

Ettől eltérő módszer, amit már nagyobb mikrovezérlőkben használunk (pl. ARM, stb) hogy már fizikailag létezik erre egy timer. PIT (Periodic Interval Timer) ami maga az operációs rendszer ütemezőjévé válik.
Persze ez sok esetben nem közvetlen task irányítást végez, annál lassabb ütemezésű feladatokat.
(#) (Felhasználó 4577) válasza Topi hozzászólására (») Aug 10, 2010 /
 
El kellett párszor olvasni a hozzászólásod, hogy megértsem pontosan, elsőre azt hittem kicsit magas lesz nekem, de aztán utánanéztem a szakszónak is. Nem teljesen pont így, de anélkül hogy tudtam volna mi ez, használok ilyet.
Például a gombok prell mentesítését, a gomb lenyomás alatti folyamatos értékváltoztatást is így oldottam meg, hogy a program lefutásának az idejét használom időzítéshez.

Próbálkoztam ezzel a Watchdog-al.
  1. #include <util/delay.h>
  2. #include <string.h>
  3. #include <avr/pgmspace.h>
  4. #include <avr/interrupt.h>
  5. #include <stdio.h>
  6. #include <avr/eeprom.h>
  7. #include <inttypes.h>
  8. #include <avr/io.h>
  9. #include <avr/wdt.h>
  10.  
  11. int main()
  12. {
  13.         wdt_enable(WDTO_30MS);
  14.         WDTCR = (1<<WDP0) | (1<<WDP1) | (1<<WDP2);
  15.         DDRB = (1<<PB7);
  16.         PORTC |= (1<<PC4);
  17.  
  18.         while(1)
  19.         {
  20.                 wdt_reset();
  21.                 PORTB = (1<<PB7);
  22.                 _delay_ms(500);
  23.                 PORTB &= ~(1<<PB7);
  24.                 _delay_ms(500);
  25.                 while(!(PINC & (1<<PC4)));
  26.         }
  27.        
  28.  
  29.         return 0;
  30. }

A WDTON Fuse bitet bekapcsoltam és a PB7-nél a LED folyamatosan világít, ha kikapcsolom a WDTON-t és felkommentezem az összes Watchdog-os részt, akkor villog a LED és ha a gombot megnyomom, akkor nem villog.

Mit rontottam el?
(#) luxmanpower válasza (Felhasználó 4577) hozzászólására (») Aug 10, 2010 /
 
Azt hogy hamarabb resetel a watchdog minthogy újraindítanád a számlálóját
(#) (Felhasználó 4577) válasza luxmanpower hozzászólására (») Aug 10, 2010 /
 
Jé, tényleg, köszönöm! Picivel több, mint egy másodpercet kell beállítani, ha jól rémlik akkor 2 másodperc a következő.
Megfürdök és meg is nézem és kijavítom.
(#) (Felhasználó 4577) válasza luxmanpower hozzászólására (») Aug 10, 2010 /
 
Működik, nagyszerű! Köszönöm a segítséget, és neked is Topi!
(#) Zolorb hozzászólása Aug 10, 2010 /
 
Üdv!
Egy ATtiny45-ös programozásával lenne problémám.

Úgy kezdtem az elején, ahogy az itteni cikkekben le volt írva:
Vettem boltban "AVR-Doper, USB-s ISP programozó"-t, meg ATtiny45-ös processzort. Működött minden. Elég sok programot ki tudtam próbálni rajta.
Aztán ATmega8-assal is viszonylag sok dolgot is meg tudtam valósítani. Közben használtam ATtiny13-at.
Azt vettem észre, hogy amikor külső kvarc és belső RC oszcillátor között váltogatok, akkor csak akkor tudom visszaállítani a belső RC-re, ha rajta van a kvarc.
Eddig nem is volt semmi gond.

Most viszont megint az ATtiny45-öshöz nyúlnék, és sehogy sem tud belépni az AVR Studio programozó módba: "Entering Programming mode.. FAILED!"

Bármit csinálok bármelyik tab-en, - ISP frekvencia, FUSE bitek - semmit nem tudok állítani, mert nem tud programozó módba lépni. Próbáltam több féle értékű külső kvarccal, másik processzorral létrehozott (amit persze most is tudok programozni gond nélkül) külső órajellel is, de sehogy sem tud belépni.

Nem igazán értek a különböző programozási módokhoz, de az AVR Studio-ban lehet választani a PP/HVSP módot, evvel sem sikerült + információt kideríteni.

Van valami tippetek esetleg?
Előre is köszi.
Üdv: Zoli
(#) zombee válasza zsozsoX hozzászólására (») Aug 11, 2010 /
 
Hello!

A HVPP Fusebit Doctor biztosan segít, én azzal állítom vissza a balesetek következményeit.
De ha biztos vagy benne hogy külső órajelforrást állítottál be akkor fogsz egy AVR-t, írsz rá egy olyan programot ami az egyik portot billegeti, esetleg némelyiken van olyan FUSE bit hogy egy portlábon kiadja a kontroller órajelét. min. 1MHz kell.
(#) Zolorb válasza zombee hozzászólására (») Aug 11, 2010 /
 
Köszi!
Összerakom a Dokit, aztán majd kiderül.
(#) zsuscsinyo hozzászólása Aug 11, 2010 /
 
Sziasztok!

Az hogy lehetséges, hogy egy függvény hívása közben újraindul az ATmega128? A programot WinAVR-ben írom, már többször is előfordult ilyesmi, viszont most már nagyon érdekelne, mitől akadhat ki.
(#) zombee válasza zsuscsinyo hozzászólására (») Aug 11, 2010 /
 
/RESET láb: 10k - val kösd pozitívra.
WatchDog - kapcsold ki.
interruptok: mindegyikhez van ISR makró?
portok: nem-e zárlatos valamelyik?
(#) zsuscsinyo válasza zombee hozzászólására (») Aug 11, 2010 /
 
Ezek mind stimmelnek, gyanítom hogy a(z) s(n)printf(...) függvények játszanak velem, megnézem és jelzek, ha van változás.
(#) zsuscsinyo válasza zsuscsinyo hozzászólására (») Aug 11, 2010 /
 
Stimmt, jól éreztem. Kivettem mindet és már nem csinálja...

szerk: És az a poén, hogy még a függvény hívás előtt, és nem alatt fut le...
(#) Lucifer hozzászólása Aug 11, 2010 /
 
Üdv mindenkinek,

Egy kis közgazdasági jellegű kérdést szeretnék feltenni. Nem olyan régen volt valami brutális borulás az Atmel árakkal kapcsolatban.
Van egy projektem amiből előbb utóbb valószínűleg le kell gyártani pár jó darabot. Jelenleg Atmega8 DIP van benne.
Az mscnél régi áron van még kiírva a weblapon. A HQ-RET páros már ezres körül méri a terméket amennyiért számomra versenyképes a projektben a microchip temékekkel. Mit gondoltok lesz még rosszabb a helyzet, és nézzek valami 18F PIC-et és kezdjem portolni, vagy már tetőztek az árak?
(#) zolee1209 válasza Lucifer hozzászólására (») Aug 11, 2010 /
 
Nem akarok hülyeséget mondani, nem biztos, hogy minden bolt kínálatát megnéztem, de az elektrokonthában is alacsony árakon vannak az AVR-ek! :yes:
(#) Topi válasza Lucifer hozzászólására (») Aug 11, 2010 /
 
Az a kérdés, mikorra kell. Pont tegnap rendeltem több tálca mega48-at, rendkívül jó áron.

Teljesen friss gyártású atmega48-20au, 500 db nagyjából 380-400 Ft/db az USA-ban. És már több 48/88/168 is került a kezembe májusi gyártás kóddal.
Kisebb mennyiségben persze jóval drágábbak.

Egyszóval elkezdtek szállingózni a procik. Itthon még problémás a boltok raktárkészlete. De nem reménytelen már a helyzet.

Szóval a nagy kérdés, hogy mennyi kell és mikorra. A nagy proci válságban is voltak olyan típusok - sok - amiket lazán lehetett venni... És vettük is. Tálcával.
Szóval minden csak mennyiség kérdése.
(#) zombee válasza Lucifer hozzászólására (») Aug 12, 2010 /
 
Hello!
A legviccesebb az Árwill: 2700Ft/db !
2 hónapja a HQVideónál megvettem az utolsó 28 darabot, kb. 400/darab áron, bánom hogy SMD-ket nem vettem mert az még olcsóbb lett volna. Az eset után ők is durván megemelték.
Az Elektro-kontha most kb. 650 körül vesztegeti a DIP tokos ATMega8-at, az ATMega48 pedig 495.
Az MSC mindaddig a régi árakat írja, amíg meg nem érkezik a szállítmány(hónapok óta kifogytak). Őszre ígérik.

Keresgélni kell a boltok között, egyik terméket ez, a másikat amaz árulja olcsóbban. Sok helyen pár darab van, amit még jó olcsón el lehet vinni. Nem ártana ha ezek a boltok is felkerülnének a depo vagy árgép oldalaira...

Csak szólok: az ATMega8L-8PU elvileg csak 8MHz-et bír, de nekem 15MHz-en mind a 28 példány stabilan futott, egyszer játszottam 25MHz-en is, ott is jó volt...

A nagy hiány már apad, az árakkal együtt. Jönnek új gyártások, tartani kell a piacot a Microchip és a japán gyártók ellenében, hidd el, Moore törvénye nem csak a PC világában dolgozik!
Egyébként lehet hogy még 100 darabos rendelésnél sem éri meg egy USA-beli kört futni...
(#) Topi válasza zombee hozzászólására (») Aug 12, 2010 /
 
Igen, 100 db-nál még nem. De 500 körül már igen. Pár 10 darabot nem vesz az aki gyártással foglalkozik.
(#) zsozsoX válasza zombee hozzászólására (») Aug 12, 2010 /
 
Hello!
A Topi féle "pacemaker"-rel sikerült visszahozni, de azért köszi megnézem a HVPP Fusebit Doctor-t is sose lehet tudni.
(#) edison14 hozzászólása Aug 12, 2010 /
 
Hali.

Volna egypár kérdésem az AVR Doperrel kapcsolatban.
Az első az lenne, hogy valakinek van e kapcsolási rajza vagy valaki meg e építette az AVR Dopert a HVP funkcióval? Esetleg működik ez a funkció csakmert Topi említette a cikkben, hogy kivette belőle a HVP funkciót. Akinek esetleg megvan a hozzá való HEX fájl az legyen szíves feltenni.
Valamint az R10-es és R11-es feszültségosztó azért van beletervezve, hogy figyelje a processzoron levő feszültséget és ha nincs rajta feszültség akkor figyelmeztet?

Ezek lennének a kérdéseim. A válaszokat előre is köszönöm. Valamint felteszem a tesztpanel terveit, hogy megnézhessétek és esetleg kijavítsátok amit elrontottam. Ha esetleg van valami amit kifelejtettem róla vagy valami ami felesleges akkor írjatok.
(#) vaszil29 hozzászólása Aug 12, 2010 /
 
Sziastok!
Nagyon kezdő vagyok és építenék egy "SMD"-s kapcsolást. (ez lenne az első)
A kapcsolásom egy miniatűr multiméter lenne amit ,egy ATMEga8L hajtana.
Meg van a Hex is hozzá, csak az a kérdésem, hogy befórrasztás elött kéne felprogramozni, vagy utána is lehet?
Ezt a Microcontroller lehet e PicKit2 Klónnal programozni a megfelelő lábakon
(#) Hp41C válasza vaszil29 hozzászólására (») Aug 12, 2010 /
 
Szia!

Az AVR kontrollereket is lehet programozni PicKit2-vel...
(#) vaszil29 hozzászólása Aug 15, 2010 /
 
Sziasztok!
Szeretnék felprogramozni egy Atmega8L típusú bigyót
Pic kit2 klón segítségével.
Elvileg működik a dolog, csak kicsit elvéreztem mikor láttam a ic bekötési rajzát és a Pickit2 bekötési rajzát AVR-hez. mellékelem mind a 2 doksit ( Atmega8L)+(Avr programozás Pickit klónnal) és a kapcsolásom.
Az lenne a gondom, hogy akár hogyan is nézem a kapcsolásom és a ic adtlapját és a Pickites avr progamozási útmutatót nem nagyon stimmelnek a lábkiosztások.
Szeretném, ha valaki átnézné és megadná a pontos bekötést.
Pl: Pickit Atmega8L
1, Vpp - - 1-es láb

És kérnék némi segítséget a felprogramozáshoz is.
válaszokat előre is köszi
(#) vicsys válasza vaszil29 hozzászólására (») Aug 15, 2010 /
 
Nos a google fordítóval ezt hoztam össze. Egyébként itt az eredeti szöveg: Bővebben: Link
Azt mondja (ha jól értem), hogy az LCD csatijára kell a programozót tenni és kell még a panelnak tápfeszt is adni!
Következő: »»   258 / 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