Fórum témák

» Több friss téma
Cikkek » Nyolc lábbal AVR II. rész
Nyolc lábbal AVR II. rész
Szerző: Topi, idő: Aug 26, 2008, Olvasva: 45979, Oldal olvasási idő: kb. 1 perc
Lapozás: OK   3 / 5

Itt használunk először igazi belső perifériát. Ez a Timer0 modul lesz.

Nincs mese, ahhoz hogy megértsd mi történik itt, elő kell venni az adatlapot. ATtiny45.pdf
Itt, sétáljunk el a 67. oldalra, melynek címe: "8-bit Timer/Counter0 with PWM". Tehát 8-bites időzítő és számláló modul PWM-el.

Nézzük meg, hogy is néz ki a timer. Nézzük meg a 11-3-as ábrát, hogy hogy is történik az előosztás. Olvassuk el a 11.7.3-as pontot, ami a "Fast PWM Mode"-ot részletezi.

A FastPWM-hez két regiszter kell. A TCNT0 (tehát a Timer CouNTer0) ami egy számláló. Ezt növeli egyel mindig a timer. És az OCR0A (Output Compare Register, Timer0 A csatorna)

A 11.9-es leírásban egyesével minden bit el van magyarázva, mire is való. Ezt is nézd meg, és legyen előtted mialatt a kódot tanulmányozod.

Eredmény a következő lesz:

A videó megtekintéséhez Flash lejátszó szükséges!

A kód pedig az alábbi:

  1. #include <avr/io.h>
  2. #include <util/delay.h>
  3.  
  4. //-------------------------------------
  5. void m_delay_10ms(unsigned long val) {
  6. //-------------------------------------
  7.     while(val--) _delay_ms(10);
  8. }
  9.  
  10. //-------------------------------------
  11. int main(void) {
  12. //-------------------------------------
  13. uint8_t    fel_le;
  14.  
  15.     DDRB = (1<<PINB0); //PB0 kimenet
  16.  
  17.     //timer inicializálás PWM módra
  18.     GTCCR = 0x00; //nincs TSM
  19.     TCCR0A = (1<<COM0A1)
  20.            | (1<<COM0A0)    //01 = set on comp. match
  21.            | (0<<WGM02)
  22.            | (1<<WGM01)
  23.            | (1<<WGM00);    //011 = Fast PWM mód
  24.     TCCR0B = (0<<CS02)
  25.            | (1<<CS01)
  26.            | (1<<CS00);        //011 = clk/64 előosztás
  27.  
  28.     TCNT0 = 0;    //countert nullázzuk
  29.     OCR0A = 0;  //komparálási szintet nullázzuk
  30.     fel_le = 1; //tehát fel
  31.     while(1) {
  32.         if(fel_le) {
  33.             if(OCR0A<255) OCR0A++; //addig növelem amíg nem max
  34.             else fel_le = !fel_le; //ha max, akkor lefelé
  35.         }
  36.         if(!fel_le) {
  37.             if(OCR0A) OCR0A--;   //addig csökkentem amíg >0
  38.             else fel_le = !fel_le; //ha min, akkor felfelé
  39.         }
  40.         m_delay_10ms(1);
  41.     }
  42.     return 0;
  43. }

Igyekeztem felkommentezni mindent, de az adatlap használatot nem váltja ki.

Nézzük a legutolsó áramkörünket....


A cikk még nem ért véget, lapozz!
Következő: »»   3 / 5
Értékeléshez bejelentkezés szükséges!
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