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   153 / 840
(#) janyjozsef válasza trudnai hozzászólására (») Szept 26, 2009 /
 
Köszönöm a válaszodat a PIC-ről. Igazán érdekes, hogy hol és hogyan lehet műveleteket végezni, ill a regiszterkezelés.

Ha C-ben akarod írni a progit és GCC-t használsz, akkor nézz utánna a "módosító" kulcsszavaknak, mert ekkor a fordító valóban azt fogja fordítani amit akarsz.
Én már szívtam pl volatile kihagyása miatt.

Ha nagy tételben gondolkodunk, akkor tényleg fontos az ár.
(#) gtk hozzászólása Szept 26, 2009 /
 
Sziasztok !

Atmega8 - AVRen probalom a Phase/Freq-correct PWM -et osszehozni.
Az adatlap (es az en ertelmezesem) szerint a mellekletben lathato beallitasokkal Phase/Freq-correct PWM -et kapok.
A note[] tartalmazza a forrasban lathato makrokkal szamolt konstans TOP ertekeket.

A dolog mukodik, viszont az elso nehany ciklusban torzitva, jon a jel az OC1A labon, -- mintha rajta lenne meg egy alacsony frekvencias jel -- majd nehany ciklus utan beall es mukodik ahogy kell. A programban nincs semmi delay vagy egyeb processzor zabalo kod, ami bekavarhatna.
Ugy is probaltam, hogy a loopban nullazas elott leallitom a timert, majd a TOP ertek es a kitoltes beallitasa utan elinditom. Igy kicsit mas a hiba: akadozva , rovidebb kitoltessel megy nehany ciklust, aztan jo lesz. (kozben fut a timer0 es a timer2 is)
Mi lehet a problema oka?

Masodik kerdesem:
Az adatlap szerint ha a WGM10 bitet is beallitom, akkor a TOP erteket az OCR1A hararozza meg, es a kitoltesi tenyezo 50% kellene legyen. Ennek ellenere ez a valtozat nekem abszolute nem mukodott.
(#) zolee1209 válasza gtk hozzászólására (») Szept 26, 2009 /
 
Sajnos a C-hez minimálisan konyítok, de talán sokat segítene, ha tagolva lenne a szöveg, nem hiszem, hogy ilyen formában írtad, ahogy a txt-ben szerepel!
(#) levy_k válasza zolee1209 hozzászólására (») Szept 26, 2009 /
 
Ha TC-ben viewer-vel nyitod meg, tisztább lesz...
(#) gtk válasza levy_k hozzászólására (») Szept 26, 2009 /
 
Olvashato TC-ben? Linux , UTF-8 kodolasu szoveg..Nem gondoltam hogy gond lesz vele.
(#) zolee1209 válasza levy_k hozzászólására (») Szept 26, 2009 /
 
Ritkán használom, ilyenre pedig egyáltalán nem, de köszi a tippet!
(#) levy_k válasza gtk hozzászólására (») Szept 26, 2009 /
 
  1. #define X1 ( F_CPU / (NOTE_X1 * 2 * T1_PRESC) )
  2. #define X2 ( F_CPU / (NOTE_X2 * 2 * T1_PRESC) )
  3.  
  4. uint8_t
  5. enable_pwm ()
  6. {
  7.   TCCR1A = (1<<COM1A1)|(1<<COM1A0); // Set OC1A when upcounting, clear when downcounting, 96.old
  8.   TCCR1B = (1<<WGM13) ;              // Phase/Freq-correct PWM, top value = ICR1, 97.old
  9.   // Reset the 16 bit Counter
  10.   TCNT1 = 0;
  11.    // Turn on the Prescaler, 8
  12.   TCCR1B |= (1<<CS11);
  13.  
  14.   return 1;
  15. }
  16.  
  17. //disable pwm
  18. uint8_t
  19. disable_pwm ()
  20. {
  21.   TCCR1B &= ~(1<<CS11); // Turn off the Prescaler
  22.   TCCR1A &= ~ ((1<<COM1A1)|(1<<COM1A0));     //normal port operation
  23.   PORT_SOUND &= ~(1 << SOUND_PIN); //pin to low
  24.   return 0;
  25. }
  26.  
  27.  
  28. //main loop
  29.  
  30.     if(pwm_is_enabled){  
  31.         if(cnt6 > THRS_SONG) //
  32.         {
  33.           cnt6=0;  
  34.          if(note_indx >1) { note_indx = 0; }
  35.           TCNT1H = 0;
  36.           TCNT1L = 0;
  37.  
  38.           ICR1H = ( note[note_indx]  >> 8 );
  39.           ICR1L = note[note_indx];      
  40.           OCR1A = ((ICR1H << 8) | ICR1L) >> 2; // TOP/4, 25% -- bemerve
  41.          
  42.           note_indx ++;
  43.         }
  44.      }

Ez TC-ből kiollózva....
P.S. Sorry, de nem tudom hogyan kell C-sre formázni, mi a paramétere a "code"-nak
(#) bankimajki hozzászólása Szept 27, 2009 /
 
Sziasztok, esetleg tud valaki magyar nyelvű AVR assemblerről leírást feltenni, mert amit nekünk kiadtak a suliban az angol nyelvű, én pedig nem igazán értek angolul
(#) gtk válasza levy_k hozzászólására (») Szept 27, 2009 /
 
Nem ekertem hogy beszurd a kodot ide, csak azt kerdeztem olvashato-e TC-ben. Nem veletlenul csatoltam.
Ha mar megvan a [ code ] akkor mi lehetne mas, mint [ code = c ], persze szokozok nelkul. a [ / code ] -nal nem kell = c.
(#) levy_k válasza gtk hozzászólására (») Szept 27, 2009 /
 
zolee1209-nak lett volna címezve, csak félre ment.
(#) Topi válasza gtk hozzászólására (») Szept 27, 2009 /
 
Próbáld meg a 16Bites regisztereket egyben kezelni. "TCNT1", "ICR1" ként. Többször van az előbb íródik az alsó mint a felső, vagy fordítva. Erre a processzor érzékeny.
(#) gtk válasza Topi hozzászólására (») Szept 27, 2009 /
 
Koszonom a segitseged !

Probaltam ugy is, az eredmeny ugy tunik ugyanaz.
Kov. probalkozasom, hogy a timer ki -be kapcsolas csak a loop-ban tortenik, ahol a "hangjegyeket" cserelgeti. Igy sem jo.
  1. if(pwm_is_enabled){  
  2.         if(cnt6 > THRS_SONG) //
  3.         {
  4.           cnt6=0;  
  5.          TCCR1B &= ~(1<<CS11); // Turn off the Prescaler
  6.          if(note_indx >1) { note_indx = 0; }
  7.  
  8.           TCNT1 = 0;
  9.           ICR1 = note[note_indx];  
  10.           OCR1A = note[note_indx] >> 2; // 2: TOP/4, 25%    
  11.  
  12.           TCCR1B |= (1<<CS11); //Turn on the timer1
  13.           note_indx ++;
  14.         }
  15.       }


Probaltam a masik beallitassal, amikor a TOP az OCR1A regiszterben van. Ez sem jo. Egyet kattan, azzal kesz.
Kod a mellekletben. (az ilyenektol tudom tepni a hajam)
(#) Topi válasza gtk hozzászólására (») Szept 27, 2009 /
 
Timert nem szükséges kikapcsolni, ha OCR1A-t használsz TOP-ként, mert az kettős bufferelt.
Ezt a hibát helyileg HW-esen (LED bekapcs, érték ellenőrzés, stb) módszerrel lehetne kideríteni. Látszólag jónak tűnik.

Vedd ki a feltételt, vegyél ki mindent a ciklusból.
TCNT1, ICR1, OCR1A állítás, majd még a fő loop-od előtt egy for(;;

Tehát hogy ne fusson le garantáltan többször. Ellenőrizd, hogyha egyszer van csak megadva az érték, utánna a proci garantáltan be van szorítva egy loop-ba, akkor megy-e a fázis korrekt PWM.

(Egyébként hang generáláshoz CTC-t kényelmesebb használni)
(#) gtk válasza Topi hozzászólására (») Szept 27, 2009 /
 
Idézet:
„Vedd ki a feltételt, vegyél ki mindent a ciklusból.
TCNT1, ICR1, OCR1A állítás, majd még a fő loop-od előtt egy for(;;”


Igen, megy.

Az OCR1A = TOP valtozat igy sem indul, majd holnap ujra nezem.
(#) gtk válasza Topi hozzászólására (») Szept 27, 2009 /
 
Ez erdekes:

Ha egyben irom a TCCR1B regisztert, akkor jo. Nehanyszor ki be kapcsolgattam es ok.
A proba kedveert visszairtam, hogy VAGYolva allitsa be a CS11 -et, es a hiba ujra elojott.

  1. uint8_t
  2. enable_pwm ()
  3. {
  4.   TCCR1A = (1<<COM1A1)|(1<<COM1A0); // Set OC1A when upcounting, clear when downcounting, 96.old
  5.   TCCR1B = (1<<WGM13) | (1<<CS11);  // Phase/Freq-correct PWM, top value = ICR1, 97.old
  6.  
  7.   // Turn on the Prescaler, 8
  8.   //TCCR1B |= (1<<CS11); //fent beallitva, ugy ok
  9.  
  10.   return 1;
  11. }
(#) levy_k válasza gtk hozzászólására (») Szept 27, 2009 /
 
  1. TCCR1B |= (1<<WGM13) | (1<<CS11);

És ha így írnád?
(#) Topi válasza gtk hozzászólására (») Szept 27, 2009 /
 
Akkor a TCCRB olvasása okoz gondot. De hogy miért?! Pff. Ki tudja.
Azt már én is tapasztaltam, hogy waveform generátor esetén órajelet lekapcsolni zűrös. De nem igen találtam rá eddig magyarázatot. Ha egyben írom a teljes konfigot, akkor pedig jó.
Sőt. Nem csak az órajel lekapcsolása, de a COMxx biteket írni is gond.
(#) gtk válasza Topi hozzászólására (») Szept 28, 2009 /
 
Kiterhetnenek az adatlapban bovebben ezekre a dolgokra, ha mar ilyen problemas. Amugy, ha a TCCRB olvasassal van a baj, ugy sem ertem, hogy miert az elso nehany loop-ban van torzitott jel. A loopban nincs konfigolva sem TCCRA, sem TCCRB. (csak egy proba keppen volt egy ilyen valtozat is irva)
Tegyuk fel, hogy TCCRB VAGYolva van konfigolva, a loopban nincs allitgatva, es a hiba letezik. Ha egyben irom a 16 bites regisztereket, a torzitasnak ilyen formaja van: pl. ha megadok egy A1 hangot, az elso nehany loopban ugy szolal meg mintha hamis lenne, mintha a frekvencia ide oda maszkalna eleg gyorsan, de jol hallhatoan, aztan jo lesz.

Meg egyszer koszonom.
(#) P.Robi hozzászólása Szept 28, 2009 /
 
Sziasztok!

Most kezdtem el foglalkozni az AVR-ekkel és sajna elakadtam. A helyzet az, hogy egy atmega168-at szeretnék programozni, de amikor beállítom, hogy 8MHz-en dolgozzon, akkor a Waitms 1000 parancsra nem azt csinálja amit kéne. Kb 8 másodpercet vár, aztán hajtja végre a parancsot. Ha az órajelet átállítom 1MHz-re, akkor csinálja rendesen(mondjuk akkor sem 1msodpercet vár, de közel van hozzá). Hogy lehet ez? A Fuse bitek jól be vannak állítva, a panel jól van összerakva stb.
A rajzon lévő kvarc már nincs a panelban. Aki esetleg találkozott már hasonló problémával és tudja mi a megoldás, kérem írjon. Előre is köszönöm

Üdv.: P.Robi
(#) szoto hozzászólása Szept 28, 2009 /
 
Pocket pc -vel (win) fel lehet programozni valahogy az avr-eket?
Stk500-as USB-s programozót szeretném használni pda-n, de eddig csak PalmOS-re találtam progit.
(#) trudnai hozzászólása Szept 28, 2009 /
 
Valamit nagyon nem ertek a gcc-ben. Ha normal interruptot hasznalok, akkor a PORTB=0 jol fordul:
  1. ISR ( TIM0_OVF_vect )
  2. {
  3.   2c:   1f 92           push    r1
  4.   2e:   0f 92           push    r0
  5.   30:   0f b6           in      r0, 0x3f        ; 63
  6.   32:   0f 92           push    r0
  7.   34:   11 24           eor     r1, r1
  8.     PORTB = (uint8_t)0;
  9.   36:   18 ba           out     0x18, r1        ; 24
  10. }
  11.   38:   0f 90           pop     r0
  12.   3a:   0f be           out     0x3f, r0        ; 63
  13.   3c:   0f 90           pop     r0
  14.   3e:   1f 90           pop     r1
  15.   40:   18 95           reti


Nade ha naked-del kiserletezem, akkor valamiert az r1-et nem nullazza ki elotte, ami nekem nem tetszik, ill gyanus, hogy ez igy nem lenne jo. Mit ronthatok el? Vagy mit kellene csinalni, hogy jol forduljon?

  1. ISR ( TIM0_COMPA_vect, ISR_NAKED )
  2. {
  3.     PORTB = (uint8_t)0;
  4.   42:   18 ba           out     0x18, r1        ; 24
  5.         __asm__ __volatile__ ("reti" );
  6.   44:   18 95           reti
  7.  
  8. 00000046 <main>:
  9. }
(#) zolee1209 hozzászólása Szept 28, 2009 /
 
Sziasztok!
Lenne egy kérdésem, mert nem tudom rá a választ...
ATmega16-os proci az alany, a PORTA-t szeretném használni analóg és digitális mennyiség mérésére. Megtehetem ezt egyszerre? Például PA7 és PA6 analóg jelet fogad, a többi bemenet pedig digitális bemenet.
Ki kell kapcsolnom a felhúzó ellenállásokat az analóg bemenet miatt, és ahol szükséges, külső felhúzót alkalmazzak? Ilyen "vegyes" bemenetet még nem kezeltem, de szükségem lenne rá... Szerintem vannak részek, amiket rosszul gondolok, de épp ezért kérdezlek titeket, biztosan tudtok segíteni!

Közben még egyszer ránéztem az adatlapra...
Amikor a MUX-ban beállítom, melyik csatorna legyen aktív, akkor átvált az analóg bemenetre, ahol nincs felhúzó...
De mi van akkor, ha lekapcsolom az analóg bemenetet? Akkor visszavált digitális bemenetté, és ott lesz a felhúzó, ha nem kapcsolom ki, de az bezavarja a csatlakozó áramkört, nem?!

2 óra alvás után én is össze vagyok már zavarodva, de bízom benne, hogy értitek mire gondolok...
(#) TavIR-AVR válasza P.Robi hozzászólására (») Szept 28, 2009 /
 
DivCLK8 be van kapcsolva alapban. Tessék kikapcsolni.... (FuseBit)
(#) TavIR-AVR válasza szoto hozzászólására (») Szept 28, 2009 /
 
Nem. A PDA-n USBHostnak kell lennie....
E nélkül 2 slave nem tud beszélgetni (A STK500 az slave áramkör (FT232RL))
(#) TavIR-AVR válasza zolee1209 hozzászólására (») Szept 28, 2009 /
 
Simán.

Az adott n db ADC-t amikor konfigurálod, sima ki/bemenet lesz.

Ha az ADMUX-l ezt a lábat címzed, akkor kimenet esetén megmérheted rajta a tápfeszt vagy a GND-t .

A felhúzó alapban _ki van kapcsolva_ De ha te bekapcsolod, akkor AD méréskor ki kell kapcsolnod...
(#) szoto válasza TavIR-AVR hozzászólására (») Szept 28, 2009 /
 
Köszi!

Van már 1-2 Pda usb host-al, de az enyém még nem tudja.
(#) trudnai válasza szoto hozzászólására (») Szept 28, 2009 /
 
Ez kicsit off, de gyanitom, hogy azok nem igazi host-ok, csak usb-on-the-go -sok -- bar lehet tevedek. Amugy ha field engineering-re kell, akkor lehet jobban jarnal egy netbookkal.
(#) zolee1209 válasza TavIR-AVR hozzászólására (») Szept 28, 2009 /
 
A felhúzók alapból nem bekapcsolt állapotban vannak? :hide: Nekem eddig úgy tűnt...
Akkor a legegyszerűbb, ha tiltom a belső felhúzókat és oda teszek, ahova nekem kell...
Köszönöm szépen!
(#) P.Robi válasza TavIR-AVR hozzászólására (») Szept 29, 2009 /
 
Megoldódott a probléma...Köszönöm Mester
(#) Barbár hozzászólása Szept 30, 2009 /
 
Hali!

Korábban írtam már ezzel kapcsolatban, akkor aztírtátok h járjak utána... a dolognagyrész már működik is már csak az ADC -t nem tudom megoldani...

Valaki tudna segíteni, hogy az "init() függvénybe" mit kéne beleírnom, hogy be tudjak olvasni vagy az PC5 -ről vagy a PC3 -ról?

Illetve a beolvasas függvényt hogy kelle megcsinalnom, hogy az ADC-nek hasznat portrol a feszultseg fuggvenyben egy egesz szamot kapjak?


Tudom, hogy sok helyen van hozzá példaprogram, csak éppen amiket találtam példaprogikat az alapján amit írtam attól mindíg lefagy a fordító (WinAVR).


Előre is köszönöm a segítséget.

Üdv!


Andris
Következő: »»   153 / 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