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   212 / 841
(#) labu01wx hozzászólása Ápr 21, 2010 /
 
Szia!
Az elmélettel én is tisztában vagyok. Én az első próbára nem csináltam ilyen teljeskörű vezérlést, de így sem működik.
Lenne egy másik kérdésem is: ATMega644-nél ha külső 20MHz-es kvarccal megy, akkor a timer a belső 8MHz-es vagy a 20MHz-es oszcilátorról megy?
(#) kopasz hozzászólása Ápr 21, 2010 /
 
Üdv!
Van egy atmega16-om, ami 16MHz-en ketyeg, és egy szervót szeretnék róla irányítani, de már az első lépéseknél megakadtam. Nézegettem a PWM-et, hogy mit hogyan, össze is raktam egy programot, leellenőriztem a biteket, hogy minden jó-e a fuse-ok is szerintem jól vannak beállítva az órajelhez, de valamiért nem működik, és nem áll össze miért. Ahogy bekapcsolom a szervó ugrik egy kicsit aztán ennyi....(a szervó egy sg51r)
Íme a kód:
  1. #include <avr/io.h>  
  2. #define F_CPU 16000000     //16MHz      
  3. #include <util/delay.h>          
  4.  
  5.  
  6. int main (void)
  7. {
  8.    DDRB = 0b00100000;                  // PortD5 kimenet, ez az OC1A
  9.    TCCR1A = 0b1010010;                             //              
  10.    TCCR1B = 0b00011010;                        // 14-es mód,gyors pwm, 8as leosztással
  11.    
  12.    
  13.    ICR1 = 40000;                       // 50 Hz - 20ms-os szélesség
  14.    
  15.       while(1)                    
  16.       {
  17.          OCR1A = 2000;                 // bal 1ms-os pulzus
  18.          _delay_ms(50);          
  19.  
  20.          OCR1A = 3000;                 // közép 1,5ms-os pulzus
  21.          _delay_ms(50);          
  22.  
  23.          OCR1A = 4000;                 // jobb 2ms-os
  24.          _delay_ms(50);          
  25.  
  26.        }
  27. }
[/OFF]

Hálásan megköszönném, ha valakinek lenne ötlete, mi nem jó, könnyen lehet, hogy banális problémáról van szó, mivel már 3 órája foglalkozok ezzel
(#) kopasz válasza kopasz hozzászólására (») Ápr 21, 2010 /
 
jajaja, bocs az ott a kódban nem 50 a késleltetésnél, hanem mondjuk 3000.
(#) labu01wx válasza kopasz hozzászólására (») Ápr 21, 2010 /
 
Én is ezzel a proglémával küzdök, igaz én már ott elakadtam, hogy a timer melyik órajelet használja.
Utánnaszámoltam és nekem is 20ms-es impulzus jött ki.
Te honnan tudod, hogy pontosan milyen hosszú impulzosok kellenek a szervónak?
(#) (Felhasználó 4577) válasza labu01wx hozzászólására (») Ápr 21, 2010 /
 
Praktikusan az is 20MHz-ről megy.
(#) kopasz válasza (Felhasználó 4577) hozzászólására (») Ápr 21, 2010 /
 
mi megy 20Mhz-ről???
(#) Sir-Nyeteg válasza kopasz hozzászólására (») Ápr 21, 2010 /
 
Ha már delay-eket használsz, akkor miért nem használsz mindenre delay-t?
(#) kopasz válasza Sir-Nyeteg hozzászólására (») Ápr 21, 2010 /
 
úgy érted miért nem úgy csinálok pwm-t?
mert mondjuk később nem csak nézegetni akarom ahogy forog, hanem majd vezérelni is. delayekkel lássuk be kicsit komplikáltabb és igénytelenebb is lenne.
ez csak egy demoprogram lenne, hogy lássam, hogy működik a szervó.
(#) Barbár válasza c4h10 hozzászólására (») Ápr 22, 2010 /
 
Hali!

Kicsit megkésve, bár de elkészítettem a kapcsrajzot amit privátban kértél, csal gondoltam felteszem inkább ide hátha másoknak is segítség...

FONTOS: a rajz nem teljes, a reléket én igy első ötletre vagy tranzisztorokkal vezérelném (h az AVR vezérli a tranyókat, azok meg a reléket), vagy valami ilyesmivel, de ez a rajzon nem szerepel...

Illetve még 1 apróság:

A GND, VCC, a poti, és a Reset gomb és a hozátartozó 10k-s ellenállás kivételével az összes többi az AVR-hez kapcsolódó dolognak mindegy, hogy melyik lábra vanak kötve, azért pont így csináltam, hogy átlátható legyen a rajz, de ha nyákon kényelmesebb lenne máshogy úgy is jó....


Üdv!

U.I: az AVR 1-es lábára kötött dolgok elhagyhatók...
(#) Barbár hozzászólása Ápr 22, 2010 /
 
Sziasztok!

Lenne egy apróbb kérdésem, talán nem is tartozik szervesen ide, de mivel AVR-es kapcsolás reménykedem, hogy itt segítséget kapok...


A következő lenne a kérdésem:

A nyolc láb cikksorozat 4. részében bemutatott NiMh töltőt építettem meg. 1 cellát szeretnék tölteni vele, viszont az a probléma, hogy nincsen stabil 12V-os tápom.

Ami van az kb 12,4V és 10,6V között ugrál, ezért arra gondoltam, hogyha a kapcsolás megfelelően működne mondjuk stabil 9V-ról is akkor egy 7809CV -vel előállított 9V-os feszültésgről hajtanám meg, viszont nemtudom, hogy ez így befojásolná-e a működését a dolognak...

Illetve, hogy a 7809CV (papíron 1,5A -t tud max) elbírna egy ilyen töltőt?

Előre is köszi a segítséget!

Üdv!
(#) kopasz válasza labu01wx hozzászólására (») Ápr 22, 2010 /
 
nem tudom pontosan olvastam, hogy elvileg 1,5ms-nél van minden szervó középen, aztán hogy a többi állapot hol van azt már ki kell kisérletezni, de az 1ms meg a 2ms nagyjából standard értékek, valahol ott kell lenniük a közelében, nyilván attól is függ, hogy mennyit tud fordulni a szervód.
(#) kopasz hozzászólása Ápr 22, 2010 /
 
Na tovább gyűrtem egy picit frissebb fejjel, és észrevettem, hogy pl elég frankón a b port 5ös lábát jelöltem kimenetnek és nem a d5-t.
Hogy megnézzem, jól van-e beállítva az órajel, elkezdtem villogtatni egy ledet 3mp-enként, ami működik szépen, de a szervó továbbra sem mozdul. Jelenleg annyira redukáltam az egész dolgot, hogy villogjon a led, meg be kellene húznia középre a szervót:
Íme a kód:

  1. #include <avr/io.h>  
  2. #define F_CPU 16000000     //16MHz      
  3. #include <util/delay.h>          
  4.  
  5. #define ON PORTB=0b00000000
  6. #define OFF PORTB=0b10000000
  7. int main (void)
  8. {
  9.    DDRD = 0b00100000;                  // PortD5 kimenet, ez az OC1A
  10.    DDRB = 0b10000000;
  11.    TCCR1A = 0b1010010;                             //              
  12.    TCCR1B = 0b00011010;                        // 14-es mód,gyors pwm, 8as leosztással
  13.    
  14.    
  15.    ICR1 = 40000;                       // 50 Hz - 20ms-os szélesség
  16.    
  17.       while(1)                    
  18.       {
  19.                 OCR1A = 3000;                 // közép 1,5ms-os pulzus      
  20.                 ON;
  21.              _delay_ms(3000);          
  22.                 OFF;
  23.              _delay_ms(3000);          
  24.  
  25.        }
  26. }
[OFF]

Ha valaki tudna érdemi választ mondani, hogy mi a rossz a kódban, esetleg elfelejtettem beállítani valamit megköszönném. Písz!
(#) ATtiny válasza kopasz hozzászólására (») Ápr 22, 2010 /
 
Csak egy tanács, amit aztán vagy megfogadsz vagy sem. A regiszterek értékadását jó lenne nem bináris szám formájában megoldani, hanem a következő módon:
  1. DDRB = (1<<DDB0)|(1<<DDB1)|(1<<DDB2)|(1<<DDB3)|(1<<DDB4)|(1<<DDB5)|(1<<DDB6)|(1<<DDB7);


Sokkal olvashatóbb a kód, nem kell hozzá adatlapot bújni, hogy kiderüljön, miket állítasz be. Mellesleg egyből látszik ha valamit véletlenül rossz. Én pl. elő nem veszem az adatlapot, hogy megfejtsem jól vannak-e beállítva a Timer regiszterek a kódodban. Egyszerűen a saját és mások életét könnyítenéd meg, ha használnád a példámban mutatott technikát.
(#) kopasz válasza ATtiny hozzászólására (») Ápr 22, 2010 /
 
jaja tudom, ha komolyabb programról lenne szó nyilván én is vagyolgatnám az 1-eseket meg éselném a 0-kat, de talán a portok kimenete még így átlátható, direkt inkább binárisban írtam mint hexaban.
a timer biteket valóban beírhattam volna legalább kommentbe.
íme:
  1. TCCR1A = 0b1010010;   // com1a1/com1a0/com1b1/com1b0/foc10/foc1b/wgm11/wgm10            
  2.    TCCR1B = 0b00011010;  // icnc1 /ices1 /   -  /wgm13 /wgm12/cs12 /cs22 /cs10
  3.                                                  // 14-es mód,nem invertált, gyors pwm, 8as leosztással
[OFF]
(#) kopasz válasza ATtiny hozzászólására (») Ápr 22, 2010 /
 
jé, gratulálok magamnak és a végletekig igazat adok neked, ahogy látszik is a tcr1a-ból hiányzik egy bit, így a elcsúszott a 7számjegyes bináris számom a regsizterben.
már áll is középen a szervó...
(#) Axel hozzászólása Ápr 22, 2010 /
 
Sziasztok!

Attiny45-höz szeretnék illeszteni olyan relét ami képes 230V AC-ről üzemelő készülékek kapcsolására. Mivel tudtommal az AVR-ek portja közvetlenül nem ad elég áramot a relék meghajtására ezért arra gondoltam, hogy egy optocsatolót kötnék a portra és evvel vezérelném a behúzómágnest. Amit azért tartanék jónak mert meg lenne oldva a galvanikus leválasztás is. Az optocsatoló után már köthetném közvetlenül a jelfogót?
Ha pl ezt a relét választanám akkor működne amit szeretnék?
Úgy tudom a relé által kapcsoláskor okozott induktív eredetű áramlökés által okozott zavart egy diódával kell megakadályozni. kérdésem, hogy ezt hová szükséges helyezni? (Vagy jelen esetben az optocsatoló miatt felesleges is?)

Köszönöm szépen!
(#) (Felhasználó 4577) válasza Axel hozzászólására (») Ápr 22, 2010 /
 
Nem értelek. Miért akarod leválasztani galvanikusan a relét? Tök felesleges.
Egy FET az AVR kimenetére, mondjuk egy BS170 meg egy dióda a relé lábai mellé és kész. A FET-hez nem kell ellenállás, semmi, közvetlenül mehet az AVR portjára.
(#) gabi20 hozzászólása Ápr 22, 2010 /
 
Sziasztok!
Azt olvastam, hogy ATmega8 - ban van egy chipre integrált óra. Valaki meg tudná mondani hogy ezt bascomból hogyan lehet elérni?
Találtam egy olyan utasítást hogy TIME de nem tudom hogy kell használni
(#) (Felhasználó 4577) válasza gabi20 hozzászólására (») Ápr 22, 2010 /
 
Timer-ek vannak benne. Javaslom a 16 biteset használni, pl 1Hz-re beállítva, külső kvarccal.
(#) NagyKrisz hozzászólása Ápr 22, 2010 /
 
ATmega16A 44es tqfp tokban, jtag port kivezetve a panelen, TCK TMS TDI TDO VCC GND, nem olvasható...
Van egy olyan beállítás, ami mindennemű olvasást tilt, még device id.t is?
(#) (Felhasználó 4577) válasza NagyKrisz hozzászólására (») Ápr 22, 2010 /
 
Persze, a Lock Bitek, de új AVR esetén minden ki van kapcsolva. Írni lehet? A beírt program fut benne?
Írás után automatikusan ellenőrzi is. Akkor nem ír hibát?
(#) NagyKrisz válasza (Felhasználó 4577) hozzászólására (») Ápr 22, 2010 /
 
JTAGEN ki van kapcsolva... Közben megtaláltam, elővettem egy másik mega16ost jtagen kerestül beleírtam, a biztosítékokat, JTAGEN disabled és ez se olvasható JTAGen keresztül, csak ISP..
(#) (Felhasználó 4577) válasza NagyKrisz hozzászólására (») Ápr 23, 2010 /
 
A JTAGEN-nek bekapcsolva kell lennie, hisz a nevében is benne van, EN, mint Enable.
(#) labu01wx hozzászólása Ápr 24, 2010 /
 
Sziasztok!
Elkezdtem programozni egy órát, de nem működik, mert az 1mp-enkénti interruptot nem hajtja végre.
Már használtam interruptot is, timert is, külön minden működött, de egybe valahogy nem megy.

ora.c
    
(#) ATtiny válasza labu01wx hozzászólására (») Ápr 24, 2010 /
 
Több hibát is látok. A legnagyobb probléma ez:
  1. //20MHz/64= 31250Hz;

Kicsit számoljál utánna ennek.

A következő probléma ez:
  1. ICR1=31250; //31250 a timer plafon ==> 1s-os jel

Itt meg elfelejted, hogy a nulla is szám. Azaz a számláló 0-ról indul! Tehát amit kiszámolsz ICR1 értéket, abból még 1-et vonjál le.

Erre meg van parancs:
  1. SREG|=1<<7;  //global interrupt enable


Így jobb lenne a azt használni:
  1. sei();    //globál megszakítás bekapcsolás
(#) TavIR-AVR válasza gabi20 hozzászólására (») Ápr 24, 2010 /
 
Lesd meg a Samples/DateTime alatt!

Röviden:
XTAL helyére a 32kHz órakvarc (kondi nem kell!)
A chip a belső 1/2/8 MHZről jár.
A mintaprogi kezeli az órafüggvényeket....
A Timer2-t lefoglalja!
(#) labu01wx válasza ATtiny hozzászólására (») Ápr 24, 2010 /
 
A 64-es leosztás elég durva elnézés volt részemről.
Mindent kijavítottam úgy, ahogy írtad, de még mindig nem jó.
(#) ATtiny válasza labu01wx hozzászólására (») Ápr 24, 2010 /
 
No és milyen osztást találtál ki? Mert 20Mhz-re nem nagyon jön ki egész számra az osztás. Én 16Mhz-es kvarcot használnék. Ha már választani kellene.
(#) labu01wx válasza ATtiny hozzászólására (») Ápr 24, 2010 /
 
20MHz/1024=19531,25.
Tudom, hogy nem pontos, de ez a legkisebb gondom, amíg a megszakítás nem működik.
(#) szoto válasza labu01wx hozzászólására (») Ápr 25, 2010 /
 
Az MR;SH;OUT; mire jó?

A megszakításban lévő:

  1. PORTB|=1<<PB4;


kóddal a PB4-et bekapcsolod, de ki sosem, ha az volt a célod, hogy villogjon a led másodpercenként akkor ez a hiba.
Következő: »»   212 / 841
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