Hallo, ich befasse mich seit kurzem mit MC und möchte mich so Schritt für Schritt mit den verschiedenen Themen ausernandersetzten. Bin gerade mit den Timer beschäftigt. Timer-Interrupt habe ich durch und funktioniert auch einwandfrei. Doch beim PWM happerts. Das folgende Programm will und will nicht funzen, komme einfach nicht dahinter, warum die LED (PB2) nicht leuchtet. Hardware funktioniert, wenn ich PB2 ohne PWM auf 1 setzte, leuchtet die LED auch. Was ist da falsch? MC = Antiny 2313 Danke schon im Vorraus. LG Willi /* * Timer_2313__Fast_PWM.c * * Created: 29.01.2013 20:10:57 * Author: willi */ #define F_CPU 1000000UL #include <avr/io.h> #include <util/delay.h> int main(void) { uint8_t i; DDRB |= (1<<PB2); // PB2 auf Ausgang stellen. Dieser Pin trägt auch die Bezeichnung OC0 und ist der Pin an dem der Timer 0 seine PWM ausgibt OCR0A = 250; TCCR0A = (1<<WGM01) | (1<<WGM00); TCCR0B = (1<<CS01); // Vorteiler 8, Fast PWM 8 Bit TCCR0A = (1<<COM0A1); while(1) { OCR0A = 30; _delay_ms(1000); OCR0A =200; _delay_ms(1000); for (i=0; i < 255; ++i) { OCR0A = i; _delay_ms(10); } } }
Hallo Willi, Du initialisierst den Timer0 nicht richtig! Du beschreibst zwei mal das Register TCCR0A, damit geht der erste Schreibvorgang verloren. Entweder setzt Du alle 3 Bits (WGM00, WGM01 und COM0A1) in einer Anweisung oder Du setzt die Bits in zwei Befehlen, musst dann aber das Register TCCR0A damit verodern. so: TCCR0A = (1<<WGM01) | (1<<WGM00) | (1<<COM0A1); oder so: TCCR0A |= (1<<WGM01) | (1<<WGM00); TCCR0A |= (1<<COM0A1); Grüße, Nico
Nico ... schrieb: > so: TCCR0A = (1<<WGM01) | (1<<WGM00) | (1<<COM0A1); > oder so: TCCR0A |= (1<<WGM01) | (1<<WGM00); > TCCR0A |= (1<<COM0A1); Hallo Nico, Danke für die promte Antwort. Habe ich das richtig verstanden, dass zwischen den beiden Zeilen (Register TCCR0A) keine andere Anweisung stehen darf? LG Willi
Willi schrieb: > Habe ich das richtig verstanden, dass zwischen den beiden Zeilen > (Register TCCR0A) keine andere Anweisung stehen darf? Nein, das nicht. Aber achte auf das | vor dem = welches ich eingefügt habe, das fehlte bei dir und damit wurde durch das zweite Beschreiben des Registers TCCRA0 die beiden Bits WGM00 und WGM01 wieder auf 0 gesetzt.
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.