Forum: Compiler & IDEs PWM mit Timer 0 und 2 geht, aber nicht mit Timer 1 (mega64)


von popi (Gast)


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

von johnny.m (Gast)


Lesenswert?

> ...(1<< WGM20)...

WGM20 steht ja auch nicht in TCCR1A sondern in TCCR2...

von johnny.m (Gast)


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!

von popi (Gast)


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

von johnny.m (Gast)


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

von popi (Gast)


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

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.