Hallo Zusammen, habe das Problem am meinem Atmega644, das ich über den 8-Bit-Timer0 eine PWM an 0CR0B und A haben möchte. Mit "B" geht es mit "A" nicht. Alle Bits des Timer habe ich so gesetzt wie ich es aus dem Datenblatt als richtig sehe. Register einstellungen: TCCR0A = (1<<WGM00) | (1<<WGM01)| (1<<COM0A1) |(1<<COM0B1); TCCR0B = (1<<CS01) | (1<<CS00); /* OC0A als PWM-Port setzen */ DDRB |= (1 << PB3); // OCR0A = 128; //Testwert /* OC0B als PWM-Port setzen */ DDRB |= (1 << PB4); // OCR0B = 128; //Testwert // HAUPTPROGRAMM while( 1 ) { analog_0 = ADC_Read_Avg(0, 4); // Kanal 0, Mittelwert aus 4 Mes. analog_1 = ADC_Read_Avg(1, 4); // Kanal 1, Mittelwert aus 4 Mes. OCR0B = (analog_0/4); OCR0A = (analog_1/4); if(analog_0 >500) PORTD = 0x07; else PORTD = 0x00; } An PB4 geht es, an PB3 nicht. Zerreist mich bitte nicht wenn ich was übersehen habe, aber ich kann mir einfach nicht erklären was da los ist.... Gruß und Danke schon mal für die Hilfe
Schon mal hier OCR0B = (analog_0/4); OCR0A = (analog_1/4); getauscht um zu sehen ob überhaupt ein analog Wert kommt?
Hubert G. schrieb: > Schon mal hier > OCR0B = (analog_0/4); > OCR0A = (analog_1/4); > getauscht um zu sehen ob überhaupt ein analog Wert kommt? ja hab ich, analog geht alles, nur PWM an OCR0A nicht, controller wurde auch schon gewechsel, da liegts auch nciht dran....
Und wenn du OCR0A mit einem festen Wert belegst, z.B. 100, kommt dann auch nicht?
Hubert G. schrieb: > Und wenn du OCR0A mit einem festen Wert belegst, z.B. 100, kommt dann > auch nicht? nein dann kommt auch nix, ich tippe auf den Timer register?! Oder ist da alles so wie es sein muss?
Ich sehe nichts was fehlen könnte. Vielleicht setzt du in deinem Programm den OCR0A irgendwo wieder zurück. Hardwarefehler ist natürlich auch möglich.
Hubert G. schrieb: > Ich sehe nichts was fehlen könnte. > Vielleicht setzt du in deinem Programm den OCR0A irgendwo wieder zurück. > Hardwarefehler ist natürlich auch möglich. Hardwarefehler durch beschaltung kann ich ausschließen, da die Pins nicht weiter angeschlossen sind. Programm ist nur das was oben steht... also unter Hauptprogramm, mehr steht nicht in der Schleife
1 | // OC0A auf Ausgang
|
2 | DDRB = (1 << PB3 ); |
3 | //OC0B auf Ausgang
|
4 | DDRB = (1 << PB4 ); |
Herzlichen Glückwunsch. Du hast es geschafft, die Zeit von mehreren hilfsbereiten Menschen sinnlos zu verschwenden, nur weil du nicht in der Lage warst, gleich den richtigen Code zu posten. Copy&Paste ist ja auch sooo schwer.
Das hätte ich auch gleich sehen können // OC0A auf Ausgang DDRB = (1 << PB3 ); //OC0B auf Ausgang DDRB = (1 << PB4 ); Mit PB4 auf Ausgang setzt du PB3 zurück. Edit: War im ersten Posting nicht so drinnen.
Hubert G. schrieb: > Das hätte ich auch gleich sehen können > // OC0A auf Ausgang > DDRB = (1 << PB3 ); > //OC0B auf Ausgang > DDRB = (1 << PB4 ); > > Mit PB4 auf Ausgang setzt du PB3 zurück. > > Edit: > War im ersten Posting nicht so drinnen. kacke sorry, Das hätte ich auch gleich sehen können so wäre richtig oder? DDRB = (1<<PB3) |(1<<PB4); Gruß
Yannik Stümper schrieb: > so wäre richtig oder? > DDRB = (1<<PB3) |(1<<PB4); Ja das funktioniert. Stellt sich die Frage, ob das auch gut ist. Stellst du vorher etwas anderes in DDRB ein, veränderst du das jetzt wieder. Wozu das führt, hast du jetzt ja gesehen. Gewöhn' dir das ab. DDRB |= (1<<PB3) |(1<<PB4); macht das gleiche. mfg.
Thomas Eckmann schrieb: > DDRB |= (1<<PB3) |(1<<PB4); > macht das gleiche. damit verknüpfe ich den "alten" zustand mit der Änderung Bitweise "ODER" Sehe meinen Fehler ein und bereuhe/lerne. Danke
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.