Hallo, nach langer Zeit ohne Mikrocontroller wollte ich mal schnell ne PWM mit nem ATTINY45 über Timer0 an PB0 und PB1 erzeugen,und ich kriegs nicht hin, kann aber den Fehler nicht finden - die LEDS bleiben einfach dunkel. Mein Probeaufbau läuft, wenn ich die die Pins als Ports direkt auf eins setze, leuchten die LEDS, übers OCR0A/B-Register gehts aber nicht. Hab lange im Datenblatt alles fünffach gegengecheckt und auch im Netz recherchiert, meiner Meinung nach mache ich alles richtig, aber offensichtlich nicht.Wenn da irgendwer mal rüberschauen könnte, wäre ich sehr dankbar, ich seh es einfach nicht. Oben kurz die meine Initialisierung des Timers, darunte das komplette Programm, was so funktioniert, nur eben die PWM-Ausgabe nicht... Danke an alle helfende Augen! ****TIMER_INIT**** void init_timer0() { //timer_0, fast PWM, clear on compare match TCCR0A |= (1<<COM0A1) | (1 << COM0B1) |(1<<WGM01)|(1<<WGM00); // no prescaling TCCR0B |= (1 << CS00); } ****KOMPLETTES PROGRAMM**** #include <avr/io.h> #include <util/delay.h> #include <stdlib.h> #define button_down (!(PINB & (1 << PINB2))) #define gruen_pin PB0 #define rot_pin PB1 #define blau_pin PB4 #define poti_pin PB3 void init_timer0() { //timer_0, fastPWM, clear on compare match TCCR0A |= (1<<COM0A1) | (1 << COM0B1) |(1<<WGM01)|(1<<WGM00); // no prescaling TCCR0B |= (1 << CS00); } void rot_mode() { OCR0A = 255; OCR0B = 0; PORTB = (1 << blau_pin); } void gruen_mode() { OCR0A = 255; OCR0B = 0; PORTB |= (1 << blau_pin); } void fade_mode() { OCR0A = 100; OCR0B = 100; PORTB &= ~(1 << blau_pin); } void blink_mode() { OCR0A = 0; OCR0B = 0; } int main(void) { ////Ausgänge DDRB |= (1 << rot_pin) | (1 << gruen_pin) | (1 << blau_pin); ////Eingänge //Taster DDRB &= ~(1 << PINB2); //POTI DDRB &= ~(1 << PINB3); //interne Pullups hoch PORTB |= (1 << PB2); //Timer initialisieren init_timer0; uint8_t flag_mode = 0; while(1) { if (button_down) { while (button_down) { } flag_mode++; if (flag_mode == 4) { flag_mode = 0; } } switch(flag_mode) { case 0: rot_mode(); break; case 1: gruen_mode(); break; case 2: fade_mode(); break; case 3: blink_mode(); break; default: break; } } }
claudia h. schrieb: > //Timer initialisieren > init_timer0; Das ist kein Funktionsaufruf. Warum ignorierst du Compilerwarnungen? Warum mixt du Portnummern und Namen zur maximalen Unleserlichkeit? leo
leo schrieb: > Das ist kein Funktionsaufruf. Warum ignorierst du Compilerwarnungen? DANKE! Es gab keine Compilerwarnung... Und ja, die Benennung mach ich nochmal vernünftig! Danke fürs rüberschauen trotz der maximalen Unlesbarkeit!
claudia h. schrieb: > Es gab keine Compilerwarnung... Dann wird es Zeit diese einzuschalten. E.g. bei gcc mit -Wall:
1 | f.c:6:3: warning: statement with no effect [-Wunused-value] |
2 | f; |
leo
Sollte es eigentlich nicht der PWM Modus 7 mit Top OCRA sein? Der if (button_down) Teil kann funktionieren, muß aber nicht wenn der Taster anfängt zu prellen. Wenn kein Taster gedrückt wird, wird switch(flag_mode) immer wieder aufgerufen und die dementsprechende Funktion, welche immer wider OCRA und den Pin einstellt. Nicht schön...
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.