|
www.elektronik.si Forum o elektrotehniki in računalništvu
|
Poglej prejšnjo temo :: Poglej naslednjo temo |
Avtor |
Sporočilo |
drVrh Član
Pridružen-a: Sre 20 Feb 2008 20:17 Prispevkov: 918 Aktiv.: 4.66 Kraj: Slovenija-Koroska-Prevalje-Lese
|
Objavljeno: Sre Jun 10, 2015 11:30 am Naslov sporočila: Atmega 640 in PWM |
|
|
Pozdravljeni,
zanima me glede inicializacije PWM za Atmego640, nekako sem poskušal nastaviti tako:
Koda: |
void PWM_Init(){
TCCR2A |= (7<<WGM21)|(1<<COM2A1);
TCCR2B |= (1<<CS20);
DDRB |= (1<<PB4);
lcd_puts("inicializirano");
|
}
Nimam pa sreče z delovanjem, mi lahko kdo kako pomaga.
Na Atmego bom priklopil 8 ventilatorjev torej rabim v bistvu 8 PWM kanalov. Zgoraj je primer za ventilator priklopljen na PB4.
Koda: |
void NastaviPWMIzhod(uint8_t duty_cikel){
OCR2A = duty_cikel;
}
|
V main programu pa kličem:
Koda: |
PWM_Init();
while(1)
{
for(svetlost = 0; svetlost < 255; svetlost++){
NastaviPWMIzhod(svetlost);
//lcd_puts("+");
//_delay_ms(100);
}
for(svetlost = 255; svetlost > 0; svetlost--){
NastaviPWMIzhod(svetlost);
//lcd_puts("-");
//_delay_ms(100);
}
} |
Hvala za odgovore.
_________________ Iz dneva v dan sem se spraševal kaj je to elektrika, vendar nisem našel odgovora ... in še vedno si postavljam to vprašanje
LP
Grega |
|
Nazaj na vrh |
|
|
Riven Član
Pridružen-a: Ned 16 Dec 2012 18:33 Prispevkov: 194 Aktiv.: 1.40 Kraj: Vojnik
|
Objavljeno: Sre Jun 10, 2015 6:36 pm Naslov sporočila: |
|
|
Probaj najprej samo z toggle output pin. In ročno spreminjaj OCR1A.
Nato šele dodaj funkcije... Koda sicer izgleda OK.
Zakaj imaš tole? Tista 7 me moti.
Koda: |
TCCR2A |= (7<<WGM21)|(1<<COM2A1); |
Spremeni v
Koda: |
TCCR2A = (1<<WGM21)|(1<<COM2A0); //CTC; toggle output pin |
Če "nastavljaš" registre ne delaj "OR" ampak jih enostavno nastavi, kot je narejeno zgoraj.
Posušaj tudi spremeiti uro; Clk/64
Koda: |
TCCR2B = (1<<CS22); |
[/quote]
Torej nekaj takšnega
Koda: |
PWM_Init(){
DDRB |= (1<<PB4); //PB4 output <---- tole prestavi višje v programu, najbolje kar na začetek. Pin mora biti izhod pred začetkom štetja timerja.
OCR2A = 0; //tukaj spreminjaj OCR2A
TCCR2A = (1<<WGM21)|(1<<COM2A0); //CTC; toggle output pin
TCCR2B = (1<<CS22); //clk/64
lcd_puts("inicializirano");
}
|
|
|
Nazaj na vrh |
|
|
drVrh Član
Pridružen-a: Sre 20 Feb 2008 20:17 Prispevkov: 918 Aktiv.: 4.66 Kraj: Slovenija-Koroska-Prevalje-Lese
|
Objavljeno: Čet Jun 11, 2015 5:18 pm Naslov sporočila: |
|
|
Hvala;
glede tiste 7 sem se zatipkal zgleda pri kopiranju kode na forum.
Sedaj sem nastavil takole:
Koda: |
void PWM_Init(){
DDRB |= (1<<PB4);
TCCR2A = (3<<WGM20) | (1<<COM2A1);
TCCR2B = (1<<CS20);
lcd_puts("inicializirano");
} |
Tako mi tudi dela.
Nikakor pa še vedno ne razumem kako so razloženi tisti registri v datasheetu.
Ni mi jasno kako naj napišem registre za drug pin. Ja shiftat pa to znam ni problem, ne vem pa kakšno številko naj napišem za kateri pin. Namreč nastaviti in spreminjati jih moram 8.
OC4B, OC4C, OC2B, OC2A, OC1A, OC1B IN OC0A.
Dejansko me zanima kje v datasheetu piše, na katero mesto moram dati številko.
Recimo za TCCR2A in 2B, kako vem da je 2 ravno za določen pin ipd. ter sploh WGM20 IN WGM21.
Hvala za odgovore.
_________________ Iz dneva v dan sem se spraševal kaj je to elektrika, vendar nisem našel odgovora ... in še vedno si postavljam to vprašanje
LP
Grega |
|
Nazaj na vrh |
|
|
Riven Član
Pridružen-a: Ned 16 Dec 2012 18:33 Prispevkov: 194 Aktiv.: 1.40 Kraj: Vojnik
|
Objavljeno: Čet Jun 11, 2015 6:50 pm Naslov sporočila: |
|
|
drVrh je napisal/a: |
Dejansko me zanima kje v datasheetu piše, na katero mesto moram dati številko.
Recimo za TCCR2A in 2B, kako vem da je 2 ravno za določen pin ipd. ter sploh WGM20 IN WGM21.
Hvala za odgovore. |
Poglej datasheet in sicer kjer ti prikazuje pine. Zraven pinov imaš zapisane OCnx, n predstavlja številko timerja, x pa A ali B. Torej imaš;
OC0A, OC0B;
OC1A, OC1B;...
Poišči ustrezne pine v dokumentu in nastavi port kot izhod, bo šlo? Malo preglej da ne prepišeš kakšnih pomembnih funkcij (seriske povezave, pinov za programiranje itd...).
Kakšno število daš kam je zapisano v datasheetu, vsak Timer(Timer0, Timer1, in Timer2 v tvojem primeru) ima registre katere moraš nastaviti.
PRIMER: Ko želiš nastaviti na primer OC0A in OC0B pina, se sklicuješ na port TCCR0A in TCCR0B. Pogledaš tista dva registra in ju nastaviš (lahko celo enako, samo OCR0A in OCR0B boš imel različen (dva različna PWM signala).
Nekako takole za Timer0 in pina OC0A in OC0B ; inicializiraš ju takole
Koda: |
void PWM_Init_TIMER0(){
DDRB |= (1<<PB7); //OC0A output
DDRG |= (1<<PG5); //OC0B output
TCCR0A = (1<<WGM01) | (1<<COM0A1); //CTC, Clear OC0A on Compare Match
TCCR0B = (1<<CS00); //clk/1
lcd_puts("inicializirano");
}
|
Pa imaš dodatno še dva PWM izhoda, funkciji bi bilo potrebno dodati še OCR0A in OCR0B vrednost. Predlagam da zapišeš funkcije za vsak PWM izhod posebej, katera sprejme OCRnx kot parameter (PWM). Torej nekaj takšnega.
Koda: |
//funkcija za spreminjanje PWM pina 0-255 del.
void PWM_change_PB7(byte pwm_change){
OC0A = pwm_change; //CHANGE PWM
}
void PWM_Init_TIMER0(){
DDRB |= (1<<PB7); //OC0A output
DDRG |= (1<<PG5); //OC0B output
TCCR0A = (1<<WGM01) | (1<<COM0A1); //CTC, Clear OC0A on Compare Match
TCCR0B = (1<<CS00); //clk/1
}
|
Vse je iz DATASHEETA!
Tako mimogrede, veš kaj pomeni (3<<WGM20)? Si se zopet zatipkal ali kaj?
|
|
Nazaj na vrh |
|
|
drVrh Član
Pridružen-a: Sre 20 Feb 2008 20:17 Prispevkov: 918 Aktiv.: 4.66 Kraj: Slovenija-Koroska-Prevalje-Lese
|
Objavljeno: Čet Jun 11, 2015 8:21 pm Naslov sporočila: |
|
|
Citiram: |
Poglej datasheet in sicer kjer ti prikazuje pine. Zraven pinov imaš zapisane OCnx, n predstavlja številko timerja, x pa A ali B. |
n in pa x tole nisem nikakor mogel deišifrirati. Saj se površno bral datasheet.
Kjer imam en register za določeno stvar mi gre ni problema razumem, problem se mi je pojavil pri tem kjer je bilo več registrov za en pin.
Ter tole:
pomeni 3 mode = FAST PWM.
Toda ne vem pa zakaj 20?
Torej če prav razumem je 2 zato ker je B register in pa 0 ker se nastavlja WGM0.
Če bi želel nastaviti WGM1 bi bilo WGM21 itd.
_________________ Iz dneva v dan sem se spraševal kaj je to elektrika, vendar nisem našel odgovora ... in še vedno si postavljam to vprašanje
LP
Grega |
|
Nazaj na vrh |
|
|
Riven Član
Pridružen-a: Ned 16 Dec 2012 18:33 Prispevkov: 194 Aktiv.: 1.40 Kraj: Vojnik
|
Objavljeno: Čet Jun 11, 2015 8:58 pm Naslov sporočila: |
|
|
NOPE
poglej register TCCR2A - Timer/Counter Register 2 -a; To je torej Timer 2. Če bi imel TCCR1A bi bil Timer 1 itd.
Register ima sledeče pine
COM2A1 | COM2A0 | COM2B1 | COM2B0 | - | - | WGM21 | WGM20
Ko narediš (3<< WGM20), narediš v bistvo to, da binarno število torej 0011 vneseš na mesto WGM20. Ker je WGM20 samo en BIT, se ostali trije biti prenesejo levo. Enako bi bilo če bi naredil tole:
Koda: |
TCCR2A = 3 << WGM20;
TCCR2A = 1 << WGM20 | 1 << WGM21;
|
Tile dve vrstici opravita isto postavitev bitov v registru TCCR2A.
TOREJ: V registru Timerja 2 port A postaviš bit "WGM21" na "1" in "WGM20" pa tudi "1". Kar predstavlja res Mode 3.
Pri WGM (Waveform generation mode) imaš 8 načinov, ki jih izbiraš z tremi biti. WGM2, WGM1, WGM0.
Ker imaš TIMER2 so v Registru TCCR2A biti WGM20, in WGM21. Kar pomeni Waveform generation mode timer 2 bit 0, drugi pa je WGM timer 2 bit 1. Če bi želel nastaviti mode od 4 naprej, kjer potrebuješ še bit 2 (WGM2, oz. v tvojem primeru WGM22 - timer 2, bit 2), bi moral postaviti še ta bit.
WGM2 pa ne najdeš v TCCRnA registrih ampak v TCCRnB. Ne vem zakaj so ločili bite ampak tako je.
PRIMER:
Če bi želel MODE 7, ki predstavlja FAST PWM bi moral nastaviti bite WGM0,WGM1 in WGM2 vse tri na "1".
Če uporablaš timer 2 narediš to tako:
Koda: |
TCCR2A |= (1 << WGM21) | (1 << WGM20); //FAST PWM mode
TCCR2B |= (1 << WGM22); //Tretji bit je v reguistru TCCR2B
|
Če uporabljaš Timer 1 narediš pa takole:
Koda: |
TCCR1A |=(1 << WGM11) | (1 << WGM10); //FAST PWM mode
TCCR1B |= (1 << WGM12); tretji bit je v registru TCCR1B
|
Timer 0 bi verjetno sedaj znal nastaviti sam?
WGMnx; n=Timer; x =bit;
WGM03=TImer0 bit 3
WGM20=Timer2 bit 0
WGM11=Timer1 bit 1...
p.s. Šele sedaj opazil. Mode 3 je FAST PWM kot si napisal, ki je navzgor omejen z 255 oz. 8 bitno vrednostno. Ker si navzgor omejen boš imel stalno enaki PWM.
Spreminjaš ga lahko seveda z tem da prepišeš števec z svojo vrednsotjo od katere začne šteti. Seveda pa pri velikih hitrostih tole ni priporočljivo ker izgubljaš "signale" oz prehode,...
Priporočam MODE 2 , kjer imaš CTC /clear timer on compare/, nasavzgor pa si omejen z vrednostjo v registru OCVRA (če spreminjaš to vrednost spreminjaš PWM posredno). Ko bo števec enak registru OCRA se avtomatsko izvede postavitev števca na 0 in ponovno štetje do OCRA. Za vse skrbi procesor sam.
|
|
Nazaj na vrh |
|
|
drVrh Član
Pridružen-a: Sre 20 Feb 2008 20:17 Prispevkov: 918 Aktiv.: 4.66 Kraj: Slovenija-Koroska-Prevalje-Lese
|
Objavljeno: Pet Jun 12, 2015 8:18 pm Naslov sporočila: |
|
|
Hvala za izčrpen opis vsega.
Sedaj me zanima kaj je za narediti, želel sem sprgoramirati še polega PWM USART komunikacijo, pa sem dodal kvarc 1.8432MHz.
Ko sem žele nastaviti v fuse bitih External clock, sem zgleda nekaj narobe nastavil in mi ne gre v programming mode.
Želel sem nastaviti Fuse bite po default nastavitvah kot je opisano v Datasheetu na strani 327. V poglavju Fuse bits.
Kjer je 1 pomeni da je nenastavljen, kjer je 0 pomeni da je nastavljen, pa mi nekako ne uspe spraviti Atmego k življenju, kaj je za storiti?
Fuse bite sem nastavil tako:
BODLEVEL = DISABLED
OCDEN = [ ]
JTAGEN = [X]
SPIEN = [X]
WDTON = [ ]
EESAVE = [ ]
BOOTSZ = 4096W_7000
BOOTRST = [ ]
CKDIV8 = [X]
CKOUT = [ ]
SUT_CKSEL = EXTCLK_6CK_0MS
Kaj delam narobe?
_________________ Iz dneva v dan sem se spraševal kaj je to elektrika, vendar nisem našel odgovora ... in še vedno si postavljam to vprašanje
LP
Grega |
|
Nazaj na vrh |
|
|
mucek Član
Pridružen-a: Tor 01 Avg 2006 10:47 Prispevkov: 5337 Aktiv.: 24.73 Kraj: Domzale
|
Objavljeno: Pet Jun 12, 2015 8:27 pm Naslov sporočila: |
|
|
Pa ti si zadnji fuse bit nastavil ne na eksterni kvarc temveč eksterni clock očitno ...
Zdaj moraš, da ti bo zadeva "speljala", na ustrezen pin (ne vem z glave kateri - pač xtal1 ali xtal2) pripeljati zunanji clock (funkcijski generator, za silo bo dober tudi NE555 ali drug kontroler ), frekvenca pa mora biti vsaj 4x višja od te, s katero boš programiral (npr. če imaš programator nastavljen na 250k mora biti clock vsaj 1M)
LP, g
Opis: |
|
Velikost datoteke: |
50.55 KB |
Pogledana: |
0 krat |
|
Opis: |
Kaj bi moral nastaviti (samo sekcija) |
|
Velikost datoteke: |
51.55 KB |
Pogledana: |
4 krat |
|
_________________ ...lahko pa se tudi motim ... |
|
Nazaj na vrh |
|
|
Riven Član
Pridružen-a: Ned 16 Dec 2012 18:33 Prispevkov: 194 Aktiv.: 1.40 Kraj: Vojnik
|
Objavljeno: Pet Jun 12, 2015 8:30 pm Naslov sporočila: |
|
|
Če si dodal zunanji kvarc, je potrebno progrmau povedati koliko je, za pravilno komunikacijo med PC in ploščo?
Drugače pa je lahko marsikaj; si pravilno povezal kristal, dodal kondenzatorje čimbližje plošči z zelo kratkimi žicami?
Mogoče si povozil kakšen port za komunikacijo?
|
|
Nazaj na vrh |
|
|
drVrh Član
Pridružen-a: Sre 20 Feb 2008 20:17 Prispevkov: 918 Aktiv.: 4.66 Kraj: Slovenija-Koroska-Prevalje-Lese
|
Objavljeno: Pet Jun 12, 2015 8:31 pm Naslov sporočila: |
|
|
A drugače je nemogoče spraviti Atmego k življenju?
Nima doma nič podobnega ne FG in ne NE555.
Kondenzatorji so 22pF. So najbližje kar se da.
_________________ Iz dneva v dan sem se spraševal kaj je to elektrika, vendar nisem našel odgovora ... in še vedno si postavljam to vprašanje
LP
Grega |
|
Nazaj na vrh |
|
|
mucek Član
Pridružen-a: Tor 01 Avg 2006 10:47 Prispevkov: 5337 Aktiv.: 24.73 Kraj: Domzale
|
Objavljeno: Pet Jun 12, 2015 8:38 pm Naslov sporočila: |
|
|
Če si nastavil, da rabi zunanji clock - potem jo bo samo to spravilo k sebi ...
Hmm, če imaš kakšen PC z LPT portom bi lahko tam dobil +5V pulzke ...
Drugače pa - če ti je kaj v tolažbo - nisi ne prvi ne zadnji, ki si je tako zaklenil procesor ... Imaš celo "AVR Doctor" projekt (http://www.instructables.com/id/AVR-Attiny-fusebit-doctor-HVSP/ - le eden izmed njih, je en kup izvedenk), kjer z enim procesorjem odkleneš drugega.
Lp, g
p.s. S katerim programom pa nastavljaš fuse bite in programiraš kontroler?
_________________ ...lahko pa se tudi motim ... |
|
Nazaj na vrh |
|
|
drVrh Član
Pridružen-a: Sre 20 Feb 2008 20:17 Prispevkov: 918 Aktiv.: 4.66 Kraj: Slovenija-Koroska-Prevalje-Lese
|
Objavljeno: Pet Jun 12, 2015 8:41 pm Naslov sporočila: |
|
|
Mi lahko kdo to posodi, pomaga, kar koli sedaj čez vikend bi bilo super?
_________________ Iz dneva v dan sem se spraševal kaj je to elektrika, vendar nisem našel odgovora ... in še vedno si postavljam to vprašanje
LP
Grega |
|
Nazaj na vrh |
|
|
mucek Član
Pridružen-a: Tor 01 Avg 2006 10:47 Prispevkov: 5337 Aktiv.: 24.73 Kraj: Domzale
|
Objavljeno: Pet Jun 12, 2015 8:41 pm Naslov sporočila: |
|
|
Proti Ljubljani verjetno ne boš hodil?
_________________ ...lahko pa se tudi motim ... |
|
Nazaj na vrh |
|
|
drVrh Član
Pridružen-a: Sre 20 Feb 2008 20:17 Prispevkov: 918 Aktiv.: 4.66 Kraj: Slovenija-Koroska-Prevalje-Lese
|
Objavljeno: Pet Jun 12, 2015 8:42 pm Naslov sporočila: |
|
|
Kolikor se mi mudi, bi tudi prišel.
_________________ Iz dneva v dan sem se spraševal kaj je to elektrika, vendar nisem našel odgovora ... in še vedno si postavljam to vprašanje
LP
Grega |
|
Nazaj na vrh |
|
|
int47 Član
Pridružen-a: Pon 15 Dec 2003 0:10 Prispevkov: 2066 Aktiv.: 9.27 Kraj: Ljubljana
|
Objavljeno: Sob Jun 13, 2015 9:38 am Naslov sporočila: |
|
|
drVrh je napisal/a: |
Nima doma nič podobnega ne FG in ne NE555. |
Oscilator lahko narediš z vsakim logičnim IC, ki je sposoben negacije: recimo: NOT, NOR, NAND, XOR, XNOR. Upoštevaj, da je izvedba oscilatorja odvisna od tipa IC-jev (CMOS, TTL...).
Dober bo tudi katerikoli delujoč uC, ki ga lahko sprogramiraš, ali vezje z dostopnim clk signalom.
Na programatorju nastavi najnižj ohitrost.
_________________ Kdor ni skregan, ni Slovenc ! |
|
Nazaj na vrh |
|
|
|
|
Ne, ne moreš dodajati novih tem v tem forumu Ne, ne moreš odgovarjati na teme v tem forumu Ne, ne moreš urejati svojih prispevkov v tem forumu Ne, ne moreš brisati svojih prispevkov v tem forumu Ne ne moreš glasovati v anketi v tem forumu Ne, ne moreš pripeti datotek v tem forumu Ne, ne moreš povleči datotek v tem forumu
|
Uptime: 74 dni
Powered by phpBB © 2001, 2005 phpBB Group
|