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
> ...(1<< WGM20)...
WGM20 steht ja auch nicht in TCCR1A sondern in TCCR2...
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!
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
> 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...
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.