PWM mit Timer 0 und 2 geht, aber nicht mit Timer 1 (mega64)

Gast #366368
Lesenswert?
• ▲
▼
Hallo zusammen,

wenn ich mit dem Timer 0 oder dem Timer 1 eine LED über PWM ansteuern
möchte geht es problemlos.

Initialisierungscode für Register:

...
TCCR0 = (1 << WGM00) | (1<< COM01) | (1<< CS00);
TCCR2 = (1 << WGM20) | (1<< COM21) | (1<< CS20);
TCCR1A = (1 << WGM10) | (1<< WGM20) | (1<< COM1A1);

Aber bei Timer 1 (TCCR1A) geht nicht, laut Simulator wird das TCNT1L
Register nicht incrementiert.

Könnt Ihr mit vielleicht helfen und sagen, warum das so ist?

Danke und Grüße

popi
Gast #366370
Lesenswert?
• ▲
▼
Ach ja, wenn das Register nicht inkrementiert wird, läuft der Timer
wahrscheinlich gar nicht. Wenn das oben der komplette Code ist, wundert
mich das auch nicht. Es gibt da nämlich noch ein Register TCCR1B, dem
man auch die entsprechende Aufmerksamkeit schenken sollte. Da stehen
nämlich die CS..-Bits für Timer 1 drin!
Gast #366371
Lesenswert?
• ▲
▼
Okay, ich danke Euch zwei....

Er läuft.... aber nicht richtig.
Jetzt zählt es in 6er Schritte...

Ich werd noch irre mit dem Ding.

Habe es jetzt nach Eurer Anleitung richtig initialisiert?

   DDRB  = (1<< DDB4) | (1<< DDB5) | (1<< DDB6) | (1<< DDB7);
   PORTB = (1<< PB4) | (1<< PB5) | (1<< PB6) | (1<< PB7);
   OCR1A  = 0x00;
   TCCR1A = (1 << WGM10) | (1<< COM1A1);
   TCCR1B = (1<< CS10);

Oder warum zählt der so komisch?

Danke im Voraus und Grüße

popi
Gast #366372
Lesenswert?
• ▲
▼
> Okay, ich danke Euch zwei....

Naja, wenn Du schon doppelt siehst, ist es kein Wunder, dass das mit
dem Programmieren nicht mehr so klappt. Vielleicht erst mal nüchtern
werden...;-)

Im Simulator kann es schon mal passieren, dass die Bildschirmanzeige
Zustände nicht mitbekommt. Der Timer zählt sicher in Einzelschritten,
aber die Anzeige kommt nicht mit. Wenn Du im Einzelschritt-Modus
arbeitest, müsste eigentlich jeder Schritt sichtbar sein...
Gast #366373
Lesenswert?
• ▲
▼
okay, ich lege das Bier weg ;o)

Ich habe mal den Code gerade einfach mal auf den Controller gespielt,
und es geht. Wie auch immer, aber es geht ;o)

Nun hätte ich da ein organisatorische Problem:

Wie löst man den folgendes Problem im Code:
#include <avr/io.h>


unsigned char x = 2;
unsigned short i;

void main(void)
  {
   DDRB  = (1<< DDB4) | (1<< DDB5) | (1<< DDB6) | (1<< DDB7);
   PORTB = (1<< PB4) | (1<< PB5) | (1<< PB6) | (1<< PB7);
   OCR0,OCR1A,OCR2  = 0x00;
   TCCR0 = (1 << WGM00) | (1<< COM01) | (1<< CS00);
   TCCR2 = (1 << WGM20) | (1<< COM21) | (1<< CS20);
   TCCR1A = (1 << WGM10) | (1<< COM1A1);
   TCCR1B = (1<< CS10);

while(x==2)
{

while(OCR1A <= 0xA0) {for (i=0;i<1000;i++) asm volatile("NOP"); OCR1A
= OCR1A + 1;}
while(OCR1A >= 0x10)  {for (i=0;i<1000;i++) asm volatile("NOP");
OCR1A = OCR1A - 1;}



while(OCR0 <= 0x60) {for (i=0;i<300;i++) asm volatile("NOP"); OCR0 =
OCR0 + 1;}
while(OCR0 >= 0x40)  {for (i=0;i<100;i++) asm volatile("NOP"); OCR0 =
OCR0 - 1;}
}
}

Wie man sieht steuer Timer 0,1 und 2 jeweils eine LED.

Und sicherlich sehr Ihr auch den grausamen Änfängercode.
Wie macht man es richtig, wenn man die ersten zwei while-schleifen
PARALLEL mit den anderen 2 Schleifen laufen.

Danke nochmal und Güße

popi

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren