www.elektronik.si Seznam forumov www.elektronik.si
Forum o elektrotehniki in računalništvu
 
 PomočPomoč  IščiIšči  Seznam članovSeznam članov  SkupineSkupine  StatisticsStatistika  AlbumAlbum  DatotekeFilemanager DokumentacijaDocDB LinksPovezave   Registriraj seRegistriraj se 
  PravilaPravila  LinksBolha  PriponkePriponke  KoledarKoledar  ZapiskiZapiski Tvoj profilTvoj profil Prijava za pregled zasebnih sporočilPrijava za pregled zasebnih sporočil PrijavaPrijava 

Atmega 640 in PWM

 
Objavi novo temo   Odgovori na to temo   Printer-friendly version    www.elektronik.si Seznam forumov -> AVR, LPC900, x51
Poglej prejšnjo temo :: Poglej naslednjo temo  
Avtor Sporočilo
drVrh
Član
Član



Pridružen-a: Sre 20 Feb 2008 20:17
Prispevkov: 918
Aktiv.: 4.67
Kraj: Slovenija-Koroska-Prevalje-Lese

PrispevekObjavljeno: Sre Jun 10, 2015 11:30 am    Naslov sporočila:  Atmega 640 in PWM Odgovori s citatom

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
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo MSN Messenger - naslov
Riven
Član
Član



Pridružen-a: Ned 16 Dec 2012 18:33
Prispevkov: 194
Aktiv.: 1.41
Kraj: Vojnik

PrispevekObjavljeno: Sre Jun 10, 2015 6:36 pm    Naslov sporočila:   Odgovori s citatom

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
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
drVrh
Član
Član



Pridružen-a: Sre 20 Feb 2008 20:17
Prispevkov: 918
Aktiv.: 4.67
Kraj: Slovenija-Koroska-Prevalje-Lese

PrispevekObjavljeno: Čet Jun 11, 2015 5:18 pm    Naslov sporočila:   Odgovori s citatom

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
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo MSN Messenger - naslov
Riven
Član
Član



Pridružen-a: Ned 16 Dec 2012 18:33
Prispevkov: 194
Aktiv.: 1.41
Kraj: Vojnik

PrispevekObjavljeno: Čet Jun 11, 2015 6:50 pm    Naslov sporočila:   Odgovori s citatom

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
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
drVrh
Član
Član



Pridružen-a: Sre 20 Feb 2008 20:17
Prispevkov: 918
Aktiv.: 4.67
Kraj: Slovenija-Koroska-Prevalje-Lese

PrispevekObjavljeno: Čet Jun 11, 2015 8:21 pm    Naslov sporočila:   Odgovori s citatom

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:

Citiram:
(3<<WGM20)


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
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo MSN Messenger - naslov
Riven
Član
Član



Pridružen-a: Ned 16 Dec 2012 18:33
Prispevkov: 194
Aktiv.: 1.41
Kraj: Vojnik

PrispevekObjavljeno: Čet Jun 11, 2015 8:58 pm    Naslov sporočila:   Odgovori s citatom

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
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
drVrh
Član
Član



Pridružen-a: Sre 20 Feb 2008 20:17
Prispevkov: 918
Aktiv.: 4.67
Kraj: Slovenija-Koroska-Prevalje-Lese

PrispevekObjavljeno: Pet Jun 12, 2015 8:18 pm    Naslov sporočila:   Odgovori s citatom

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
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo MSN Messenger - naslov
mucek
Član
Član



Pridružen-a: Tor 01 Avg 2006 10:47
Prispevkov: 5332
Aktiv.: 24.73
Kraj: Domzale

PrispevekObjavljeno: Pet Jun 12, 2015 8:27 pm    Naslov sporočila:   Odgovori s citatom

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 Wink ), 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



avr.png
 Opis:
Kaj si verjetno nastavil
 Velikost datoteke:  50.55 KB
 Pogledana:  0 krat

avr.png



avr1.png
 Opis:
Kaj bi moral nastaviti (samo sekcija)
 Velikost datoteke:  51.55 KB
 Pogledana:  4 krat

avr1.png



_________________
...lahko pa se tudi motim ...
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
Riven
Član
Član



Pridružen-a: Ned 16 Dec 2012 18:33
Prispevkov: 194
Aktiv.: 1.41
Kraj: Vojnik

PrispevekObjavljeno: Pet Jun 12, 2015 8:30 pm    Naslov sporočila:   Odgovori s citatom

Č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
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
drVrh
Član
Član



Pridružen-a: Sre 20 Feb 2008 20:17
Prispevkov: 918
Aktiv.: 4.67
Kraj: Slovenija-Koroska-Prevalje-Lese

PrispevekObjavljeno: Pet Jun 12, 2015 8:31 pm    Naslov sporočila:   Odgovori s citatom

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
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo MSN Messenger - naslov
mucek
Član
Član



Pridružen-a: Tor 01 Avg 2006 10:47
Prispevkov: 5332
Aktiv.: 24.73
Kraj: Domzale

PrispevekObjavljeno: Pet Jun 12, 2015 8:38 pm    Naslov sporočila:   Odgovori s citatom

Č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 ... Wink

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
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
drVrh
Član
Član



Pridružen-a: Sre 20 Feb 2008 20:17
Prispevkov: 918
Aktiv.: 4.67
Kraj: Slovenija-Koroska-Prevalje-Lese

PrispevekObjavljeno: Pet Jun 12, 2015 8:41 pm    Naslov sporočila:   Odgovori s citatom

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
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo MSN Messenger - naslov
mucek
Član
Član



Pridružen-a: Tor 01 Avg 2006 10:47
Prispevkov: 5332
Aktiv.: 24.73
Kraj: Domzale

PrispevekObjavljeno: Pet Jun 12, 2015 8:41 pm    Naslov sporočila:   Odgovori s citatom

Proti Ljubljani verjetno ne boš hodil?
_________________
...lahko pa se tudi motim ...
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
drVrh
Član
Član



Pridružen-a: Sre 20 Feb 2008 20:17
Prispevkov: 918
Aktiv.: 4.67
Kraj: Slovenija-Koroska-Prevalje-Lese

PrispevekObjavljeno: Pet Jun 12, 2015 8:42 pm    Naslov sporočila:   Odgovori s citatom

Kolikor se mi mudi, bi tudi prišel. Very Happy
_________________
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
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo MSN Messenger - naslov
int47
Član
Član



Pridružen-a: Pon 15 Dec 2003 0:10
Prispevkov: 2066
Aktiv.: 9.28
Kraj: Ljubljana

PrispevekObjavljeno: Sob Jun 13, 2015 9:38 am    Naslov sporočila:   Odgovori s citatom

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
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
Pokaži sporočila:   
Objavi novo temo   Odgovori na to temo   Printer-friendly version    www.elektronik.si Seznam forumov -> AVR, LPC900, x51 Časovni pas GMT + 2 uri, srednjeevropski - poletni čas
Stran 1 od 1

 
Pojdi na:  
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: 66 dni


Powered by phpBB © 2001, 2005 phpBB Group