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   488 / 840
(#) Reggie válasza blaci hozzászólására (») Okt 18, 2012 /
 
Most hulla faradt vagyok, igy ha nem ebredek fel ejjel, akkor reggel megnezem. Az utobbi leirasod alapjan elofordulhat(es szerintem ez a legvaloszinubb), hogy megis prellezik a kapcsolo es nem eleg neki ez a szures. esetleg probalj meg tovabbi szurest alkalmazni vagy csak a teszt kedveert egy RS tarolora kossel egy valtokapcsolot, mert az biztos nem prellezik.
(#) blaci válasza Reggie hozzászólására (») Okt 18, 2012 /
 
A móka kedvéért kipróbáltam, hogy kivettem az ic-t és átkötöttem a triggerek csatlakozóit.
Így jól működik, és számomra meglepő módon sehogy se tudtam hibát előidézni.
Ellenben nagyon kíváncsi lennék, hogy a beépített prell mentesítő kapcsolás miért hibázik?
(#) Adam329 válasza Reggie hozzászólására (») Okt 18, 2012 /
 
Az első lehetőségénél ha nullát adok meg kezdőértéknek akkor a ciklusban mindig nulla marad. Nem kéne inkrementálni?

  1. void fft(input[],output[],kezdopozicio) {
  2. ...
  3. for(i=0;i<TOMB_MERETt;i++) {
  4. ...
  5. ...input[(i+kezdopozicio)%TOMB_MERET]...;
  6. ...output[i]...;
  7. }
  8. ...
  9. }
(#) Reggie válasza Adam329 hozzászólására (») Okt 19, 2012 /
 
De, folyamatosan novelni kell, mig el nem ered a veget, es akkor megint 0-rol mehet.
(#) Reggie válasza blaci hozzászólására (») Okt 19, 2012 /
 
Rakjal a schmitt trigger IC taplabaira 100nF-os szurot. Lehet, hogy az a baj, hogy a nem hasznalt bemenetek nincsenek fixen tapra vagy foldre kotve es a lebego bemenetek miatt gerjed, valamint zajt kelt.

A prell mentesitest vegezheted szoftverbol is. A megszakitas letrejotte utan egy adott ideig(mondjuk 50 ms) tiltsad le az adott megszakitast.
A hozzászólás módosítva: Okt 19, 2012
(#) Sick-Bastard válasza blackdog hozzászólására (») Okt 19, 2012 /
 
Udv!

Nekem ez jutott eszembe.

Arra kell figyelni, hogy V+>Vbat legyen, ill. Vcc = V+-a dioda veszultseg esese (~0,65V) vagy Vbat-0,65V.

A kapott Vcc-t csak arra kosd amit meg szeretnel vedeni.
A hozzászólás módosítva: Okt 19, 2012

UPS.jpg
    
(#) fekete123 hozzászólása Okt 19, 2012 /
 
Sziasztok tegnap próbáltam ki egy ATmega32A-t ezzel a kóddal:

  1. #include <avr/io.h>
  2.  
  3. int main(void)
  4. {
  5.         DDRC = 0xff;
  6.         PORTC = 0xff;
  7.     while(1)
  8.     {
  9.     }
  10. }


És a próbapanelen rákötött 8 ledből csak az első 2 és az utolsó 2 világít. Ledek jók, szakadás nincs. Más porton ugyanez működik. Mitől lehet ez?

Előre is köszi!

szerk: Ó én balga nem olvastam el a fenti sárga részt. bocsánat. Most kipróbálom azt.
A hozzászólás módosítva: Okt 19, 2012
(#) blaci válasza Reggie hozzászólására (») Okt 19, 2012 /
 
Valahol errefelé lesz a megoldás.. Ha minden bemenetet testre kötök, akkor az egymástól távolabbi triggerek már használható eredményt produkálnak. Az egymás mellettiek meg talán rosszabbak mint enélkül. A tápok szűrése nem hozott változást.

A szoftveres prell mentesítést ismerem, és a készülék többi 5 gombjánál használom is, de ennél a kettőnél ki akartam próbálni a hardveres megoldást.
(#) pluto válasza blaci hozzászólására (») Okt 19, 2012 /
 
Szia!

Távol álljon tőlem, hogy beledumáljak az áramköröd felépítésébe, ugyanis csak egy lelkes amatőr vagyok, ami a HW-t illeti. Ezért engedd meg, hogy megosszam veled azt a HW-s prell-mentesítést amit én használok. Az előnyét ott látom, hogy szépen be lehet állítani a lenyomás idejét és az elengedés idejét is. Egy hozzáértő valamikor azt mondta, hogy a mérések szerint a nyomógomb elengedésekor tovább tart általában a prellezés. (Neki azért hiszek, mert a fejlesztésben dolgozott) Az értékek amit látsz 20ms-ra vannak belőve. Silányabb nyomógomb esetén az idő növelendő. A schmitt trigger kimeneten található 10K-s ellenállás pull-down. Azért kell, mert az AVR-ben csak pull-up van. A SW-ben természetesen a pull-up-t kikapcsolod és 1-re kérdezed le. Mivel a gombnyomásra Vcc kerül a megfelelő bemenetre.
1. kép Kapcsolási rajz részlet. Az X2-1 és -2 csatira megy a nyomógomb. A D1 azért kell, hogy egymástól függetlenül tudd állítani az időket. Sok kapcsolást láttam már, ahol nem volt dióda. Ott rém macerás a megfelelő idők beállítása, mert egymást befolyásolják. Az időket az R33 és R34 értékének változtatásával tudod beállítani. Itt mind a két idő 20ms.
2. kép Szimulátorban a gomb lenyomása.
3. kép Szimulátorban a gomb elengedése.
Ha duplájára szeretnéd növelni mind két idő intervallumot (40ms), úgy R33=33K, R34=40K. Nálam ez a megoldás eddig kitűnően bevált.
Ha van időd és kedved kipróbálni, légyszíves tudósítsd a közösséget az eredményről.

PS: A schmitt-trigger-nél a 100n-ost nem elfelejteni, mint ahogy azt feljebb írták. A szimulációban a sárga a schmitt-trigger bemenet, a kék a kimenet.

Üdv, Pluto
A hozzászólás módosítva: Okt 19, 2012
(#) blackdog hozzászólása Okt 19, 2012 /
 
Sziasztok!

Az AVR mennyire érzékeny arra, ha kapcsolóüzemű tápról megy?
Konkrétan: Méretek miatt már nem tudok mit kezdeni a táprésszel. Stab. IC-k még elférnek, de trafó egyenirányító stb. nem.
Arra gondoltam, hogy használnék mezei 12VDC dugasztápot. Ezt a 12 voltot kapnák a relék és ebből 7805-el adnék tápot az AVR-nek. Ez így lehet jó? Ami miatt bizonytalan vagyok az az,hogy 24 órában kell üzemelne.
(#) Massawa válasza blackdog hozzászólására (») Okt 19, 2012 /
 
Semennyire - az enyém már egy éve kint van a ház falán (esöben hoban), és a jól záro dobozban közvetlenül alatta van a nyitott 5 voltos kapcsoló táp. Eddig a legkisebb hiba sem fordul elö, pedig vagy 20 LED-et kapcsolgat naponta többször is.
(#) dB_Thunder válasza blackdog hozzászólására (») Okt 19, 2012 /
 
Igen sok AVR rendelkezik automotive minősítéssel. Azokat direkt mostoha körülmények közé szánják.
(#) blackdog válasza dB_Thunder hozzászólására (») Okt 19, 2012 /
 
ATMEGA324PA-AU erről van szó. A körülmények nem lesznek "mostohák" csak biztosan kell üzemelnie a nap 24 órájában és itt a kapcsolózüemű tápot látom a gyenge pontnak.
(#) dB_Thunder válasza blackdog hozzászólására (») Okt 19, 2012 /
 
Jól látod, kapcsitáp csak korrekt tervezéssel és kivitelezéssel lesz stabil. Nagyonsok kapcsitáp öli a kondijait.
(#) Sick-Bastard válasza Reggie hozzászólására (») Okt 19, 2012 /
 
Átírtam egy picit a kódot.
A legfontosabb módosítás a GIFR használata.
Most már meg tudom szakítani és folytatni tudom az avr programját.

2 hiba(bug) van benne:
- eleve áll a program, tehát az interrupt az indítás után már aktív(nem tudom miért?)
- a ki/bekapcs 1 gombnyomásra 1-2x ismétlődik (talán prell?)

  1. #include <avr/interrupt.h>
  2.  
  3. int stop;
  4.  
  5. int main(void)
  6. {
  7.         sei();
  8.         GICR |= (1<<INT0);
  9.         MCUCR |= (1<<ISC00)|(1<<ISC01);
  10.         DDRD &= ~(1<<PIND2);
  11.         PORTD &= ~(1<<PIND2);
  12. }
  13.  
  14. ISR (INT0_vect)
  15. {
  16.        
  17.         _delay_ms(100);
  18.         while(1)
  19.         {
  20.                 if (bit_is_set(PIND,2))
  21.                 {
  22.                         stop++;
  23.                 }
  24.                 else
  25.                 {
  26.                         _delay_ms(1);
  27.                 }
  28.                
  29.                 if(stop>=0x01)
  30.                 {
  31.                         stop=0x00;
  32.                         GIFR |= (1<<INTF0);
  33.                         _delay_ms(250);
  34.                         return;
  35.                 }
  36.                 else
  37.                 {
  38.                         _delay_ms(100);
  39.                 }
  40.         }
  41. }
(#) blaci válasza Sick-Bastard hozzászólására (») Okt 19, 2012 /
 
Idézet az oldal fölső sárga részéből:

"2. Soha ne érjen véget a main() függvény"

Első nekifutásként a "main" függvény végére tegyél egy ilyet:

while(1){
}

(#) blaci válasza pluto hozzászólására (») Okt 19, 2012 /
 
Ezt a kapcsolást is láttam, de valamiért az általam választott jobban tetszett. Valószínű, hogy a kevesebb alkatrész miatt A probléma az, hogy az általam kivitelezett kapcsolásnak is működnie kellene, (a kétcsatornás digitális szkópom szerint tökéletes is) viszont a valóságban csak akkor megy tökéletesen, ha kihagyom a trigger ic-t. Ettől függetlenül ki fogom próbálni a te javaslatodat is, de csak szerdán.
(#) Sick-Bastard válasza blaci hozzászólására (») Okt 19, 2012 /
 
Bocsi, még nem vagyok eléggé precíz

Természetesen van a main()-ben egy függvény, amit megszakítok az interrupttal.

Közben írtam egy lényegében leegyszerűsített interrupt rutint:

  1. ISR (INT0_vect)
  2. {
  3.         _delay_ms(500);
  4.         while(1)
  5.         {
  6.                 if (bit_is_set(PIND,2))
  7.                 {
  8.                         GIFR |= (1<<INTF0);
  9.                         _delay_ms(500);
  10.                         return;
  11.                 }
  12.                 else
  13.                 {
  14.                         _delay_ms(10);
  15.                 }
  16.         }
  17. }


Sajnos így is megmaradt a 2 fentebb említett hiba.
(#) Massawa válasza dB_Thunder hozzászólására (») Okt 19, 2012 /
 
Az alkatrészválasztás egy kérdés, ilyen szempontból bármi, bármikor tönkre mehet.
A régi házunkban az alacsonfeszültségü világitás 12 V standard trafoi mentek egymás után sorban tönkre. (eleve nem akartam kapcsolo tápot, mert az zavarta egyes berendezéseimet - a rádiokat).
Az uj házban ez már kevésbé volt gond, mindenhová kapcsolo tápokat raktam (több van 100W-n felül), egyik sem ment még tönkre, pedig sok közölük naponta van sokszor kapcsolva, meg olyan is van, ami egyfolytában megy (mint az említett AVR-es berendezés is).
(#) szdani hozzászólása Okt 20, 2012 /
 
sziazstok!

attiny 2313-al építettem egy termosztátot, párhuzamosan hajtla a 3 db hétszegmenses kijelzőt, nekem csak közös anódos volt ezért ULN2003-al vezérlem a szegmenseket de nem ír ki rendes számokat mintha egybefolynának. Hogyan tudnám változtatni hogy jó legyen? felrakom a komlet programot rajzal. Előre is köszi.
(#) szdani hozzászólása Okt 20, 2012 /
 
sziazstok!

attiny 2313-al építettem egy termosztátot, párhuzamosan hajtla a 3 db hétszegmenses kijelzőt, nekem csak közös anódos volt ezért ULN2003-al vezérlem a szegmenseket de nem ír ki rendes számokat mintha egybefolynának. Hogyan tudnám változtatni hogy jó legyen? felrakom a komlet programot rajzal. Előre is köszi.
(#) AxaGame hozzászólása Okt 20, 2012 /
 
Sziasztok!
Számomra érdekes problémába botlottam ezen az ünnepi hétvégén.
AtMega48 IC-vel próbáltam ismerkedni, dolgozni. Annak is a 16 bites Timer1 részével.
CTC üzemmódban dolgoztatnám és ehhez a OCR1Ax adná a felső értéket.
DE! Az Atmel szimáltorral lefuttatva, Timer1 nem hajlandó számolni és gyakorlatilag semmi memóriát nem tudok írni , ami Timer1-hez kötődik.
Van valakinek valami ötlete?
Én már kínomban az AVR Studio6-ot is letöltettem, de nem használt ez a dolog sem.
A beállítás részlete a csatolt file szerint.
Hát, várom a tippeket.
Köszönöm!
A hozzászólás módosítva: Okt 20, 2012
(#) Reggie válasza Reggie hozzászólására (») Okt 20, 2012 /
 
Az utolso egyenletet elirtam, helyesen: kt=2^((Tmax-Top)/10)
(#) zolee1209 válasza AxaGame hozzászólására (») Okt 20, 2012 /
 
Bemásolom a kódod...

  1. ldi  Areg, 0x0F                                                         ; 4msec-os időalap beállítása
  2.         ldi  Breg, 0x27
  3.         sts  OCR1AH, Breg
  4.         sts  OCR1AL, Areg
  5.        
  6.         ldi  Areg, 0x00                                                         ; fényerő szabályzás a 4msec-os időalapon belül
  7.         ldi  Breg, 0x10
  8.         sts  OCR1BH, Breg
  9.         sts  OCR1BL, Areg                                                       ; OCR1B / OCR1A arányban lesz bekapcsolva a fény
  10.        
  11.         ldi  Areg, (1<<OCIE1B|1<<TOIE1)
  12.         sts  TIMSK1, Areg                                                       ; Timer1 CompB és Overflow
  13.  
  14.         ldi  Areg, 0
  15.         sts  TCCR1A, Areg
  16.         ldi  Areg, (1<<WGM12|1<<CS11)                           ; CTC mód, Clk/8 osztó
  17.         sts  TCCR1B, Areg


A beállításokat nem néztem meg, hogy helyesek-e, csak a kommentekre reagálnék első körben.

A fényerőszabályzás miért A és B csatorna arányában történik? Mármint fizikailag ezzel mit szeretnél elérni? Fényerő/ teljesítmény vezérlése PWM jellel lehetséges alapesetben, ha egyenáramról megy a fogyasztó, ezt sem írtad. Szóval a CTC mód nem alkalmas erre, azzal változtatható frekvenciájú kimenetet kaphatunk. Az interruptos részt sem tudom, szükséges-e... De, ha mégis kellene, akkor timer1 nem adhat szerintem elviekben comapreB-re és overflow-ra is interruptot. CTC módban, ha TCNT eléri OCR értékét, akkor nullázódik, és nem csordul túl, amire az overflow interrupt aktiválódna.

Nekem szimulátorban működik a 16 bites timer, igaz, mega64-et nyúzok mostanában...
(#) zolee1209 válasza zolee1209 hozzászólására (») Okt 20, 2012 /
 
Ezeket a regisztereket szükséges beállítani, amennyiben 16bit-es FAST PWM módra van szükséged...
Itt csak egy csatorna van használva.

  1. timer3_ini:                                     ; PWM mód
  2.  
  3.  
  4.         .equ    PWM     =       32768                   ; Kitöltés értéke...
  5.  
  6.                 ser     datreg1                                          
  7.                 sts     icr3h,datreg1   ; ICR regiszter beállítása
  8.                 sts     icr3l,datreg1   ; maximumra --> 16 bites számláló
  9.  
  10.  
  11.                 ldi     datreg1,high(PWM)       ; OCRH regiszter feltöltése
  12.                 sts     ocr3ah,datreg1  ;PWM felső bájttal                                   
  13.                 ldi     datreg1,low(PWM)        ; OCRL regiszter feltöltése
  14.                 sts     ocr3al,datreg1  ;PWM alsó bájttal
  15.  
  16.  
  17.                 ldi     datreg1,0b10000010      ; Kimenet és timer            
  18.                 sts     tccr3a,datreg1  ;üzemmód beállítása
  19.                 ldi     datreg1,0b00011001      ; Üzemmód és timer
  20.                 sts     tccr3b,datreg1  ;előosztó beállítása





szerk.: Neked természetesen timer1 regiszterneveit kell használni. (3 helyett 1-et írni... )
A hozzászólás módosítva: Okt 20, 2012
(#) AxaGame válasza zolee1209 hozzászólására (») Okt 20, 2012 /
 
Köszi Zolee!
Legfontosabb infó, hogy neked mega64 üzemel. Ezt fogom kipróbálni és lépkedni egy-egy fokot.
Gyenge angol fordításommal eddig úgy értelmeztem a gyári leírást, hogy CTC üzemmódban OCR1Ax érték adja a TOP értéket, ameddig a számláló mehet. Abban igazad van, hogy OVF interrupt nem generálódik. De ezt könnyen tudom javítani.
Ez egy egyszerű LED fényerőszabályzás, amit az időzítő másodlagosan le tud vezérelni. B ideig be lesz kapcsolva a kijelző, és (A-B) ideig off lesz. A kapcsolást az interruptok vezérlik, mert egy tök általános panelt csináltam.

Most kipróbálom a mega64-et....
Köszi mégegyszer!
(#) AxaGame válasza AxaGame hozzászólására (») Okt 20, 2012 /
 
Kedves Zolee!
A problémát megoldottam, én voltam a tudatlan.
Mivel közben a progit átalakítottam, módosítottam, nem teljesen tudom visszaállítani a problémát. De a tippem az, hogy egy jól irányzott mozdulattal és egy rossz helyfoglalással a PRR regisztert fejbe írtam és valószínűleg letiltottam Timer1 működését. Ez most tipp, de még ellenőrzöm, mert nem is gondolnám, hogy ilyenkor még a Timer1-hez tartozó memóriát sem lehet módosítani.
Na, de ez már csak holnapra marad.
Köszönöm fáradozásod!

(#) zombee válasza szdani hozzászólására (») Okt 20, 2012 /
 
Nem néztem meg se a rajzod, se a programot.
A hiba abból áll, hogy amíg átkapcsolsz a következő számjegyre, a szegmensek még az előző
számjegyen állnak. Először MINDENT le kell kapcsolni, majd VÁRAKOZNI (100-300us ideig).
(#) szdani válasza zombee hozzászólására (») Okt 21, 2012 /
 
Rendben köszi szépen.
(#) Jáger László hozzászólása Okt 21, 2012 /
 
Helló mindenki! Segítséget szeretnék kérni. Nem értek az Atmelekhez. Adott egy program amit AT90S2313 -ra írtak. Kérdésem, hogy ez használható e Attiny2313- ba egy az egybe, vagy nem. Előre is bocs, ha hülyeséget írtam. A fájlt mellékelem. Csak azért kérdezem, mert Attiny2313-am van.
Következő: »»   488 / 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