Hi, ich versuche vergeblich den "dritten" PWM Ausgang an meinem Atmega8 zu aktivieren. Ich benutzte eigentlich den selben angepassten Code wie für OC1A und OC1B aber leider ohne Erfolg. Kann es sein dass der OC2 einfach kaputt ist? Ich hab echt keinen schimmer mehr was ich noch machen kann. Habt ihr vielleicht schnell nen C Code mit dem ihr das immer gemacht habt, dann würde ich das schnel ausprobieren. Danke
Du musst den Pin auch als Ausgang setzen. Einfache Aktivierung der OC-Einheit reicht nicht.
Ist als Ausgang definiert. Bin gerade leider nicht zu Huase, aber werde den Code heute abend schicken :-)
OC2 ist der Output Compare für Timer2 und nicht Output Compare Timer 1 B. Also es gibt OC0 = OC für Timer 0 OC1A = OC für Timer 1 Register A OC1B = OC für Timer 1 Register B OC2 = OC für Timer 2 Also es gibt 3 Timer wobei Timer1 zwei Output Compare Einheiten hat. Der PIN OC2 gehört aber zur Output Compare Einheit von Timer 2.
so ich muss das jetzt nochmal nach oben bringen, da ich es endlich geschafft habe folgenden code verwende ich um den PWM einzuschalten. -------------------- DDRB |= (1 << DDB3); // PB3 als Ausgang OCR2 = 0xB0; // PWM Duty Cycle TCCR2 |= (1 << COM21); // none-inverting mode TCCR2 |= (1 << WGM21) | (1 << WGM20); // fast PWM Mode TCCR2 |= (1 << CS21) | (1 << CS22); // prescaler TCNT2 = 255; // counter -------------------- Also die LED blinkt jetzt schon in gewünschter Frequenz :-) Was jetzt toll wäre, das die LED nur blinkt wenn an Pin D5 ein "High-Signal" anliegt.
HMS schrieb: > Was jetzt toll wäre, das die LED nur blinkt wenn an Pin D5 ein > "High-Signal" anliegt. Dann geb ich dir einen Tip: Ein Timer läuft nur dann, wenn er einen Takt hat. Kein Takt -> Timer zählt auch nicht. Kein zählender Timer -> keine blinkende LED.
Hi, ich habe es mit folgender Zeile versucht. TCCR2 |= (0 << CS20) | (0 << CS21) | (0 << CS22); // prescaler aber leider ohne erfolg. http://www.mikrocontroller.net/articles/AVR-Tutorial:_Timer#TCCR2 Damit kann ich ja den Timer anhalten. es passiertt nix. die led blinkt einfach weiter :-(
Hi >ich habe es mit folgender Zeile versucht. > TCCR2 |= (0 << CS20) | (0 << CS21) | (0 << CS22); // prescaler >aber leider ohne erfolg. Weil 1 or 0 = 1. Kann also nichts werden. MfG Spess
HMS schrieb: > Hi, > > ich habe es mit folgender Zeile versucht. > > TCCR2 |= (0 << CS20) | (0 << CS21) | (0 << CS22); > // prescaler > > aber leider ohne erfolg. Dann schau noch mal in Bitmanipulation wie man Bits wirklich auf 0 zurücksetzt. Merke: Mittels Oder kann man maximal eine 0 zu einer 1 machen. Aber nicht umgekehrt eine 1 zu einer 0. Denn 1 oder irgendwas_anderes ergibt immer noch 1, egal ob dieses irgendwas_anderes nun 0 oder 1 war. Abgesehen davon ist 0 << irgendwas Unsinn. Eine 0 kannst du schieben soviel du willst. Da kommt hinten nach trotzdem immer nur wieder 0 raus.
Also folgendes habe ich gefunden --------------- PORTB &= 0xF0; // entspricht PORTB = PORTB & 0xF0; bitweises UND // Bits 0-3 (das "niederwertige" Nibble) werden geloescht /* übersichtlicher mittels Bit-Definitionen */ #define MEINBIT0 0 #define MEINBIT1 1 #define MEINBIT2 2 PORTB &= ~((1 << MEINBIT0) | (1 << MEINBIT2)); // löscht Bit 0 und 2 in PORTB ---------------------------------------- das habe ich daraus gemacht. könnte das funtkionieren? PORTB &= ~((1 << PB3)); // löscht Bit 0 und 2 in PORTB
HMS schrieb: > könnte das funtkionieren? > > PORTB &= ~((1 << PB3)); // löscht Bit 0 und 2 in PORTB Was soll das bringen? Du hast nicht mehr die Kontrolle über den PB3 Pin. Die hast du an den Timer abgegeben. Der kontrolliert jetzt diesen Pin. Warum willst du nicht die Taktbits des Timers einfach auf 0 zurücksetzen? Damit hat der Timer dann keinen Vorteiler mehr und ohne Vorteiler taktet der auch nicht. Timer einschalten TCCR2 |= (1 << CS21) | (1 << CS22); Timer ausschalten TCCR2 &= ~( (1 << CS21) | (1 << CS22) ); Einzig unschön (das liegt aber im Ermessen) ist, dass die LED schlagartig dort mit Blinken aufhört, wo du deinen Taster betätigst. Ob das mitten in der Aus-Phase oder Mitten in der Ein-Phase ist, ist der dann egal. Aufgehört ist aufgehört. Wenn dich das stört, musst du wieder die Kontrolle über den Pin zurück erlangen und selbst den Pin ausschalten (wobei ich mir nicht sicher bin, ob der Timer dann tatsächlich Zugriffe auf das PORTB/3 blockiert. Aber das kann man ausprobieren) Das mit dem Bit setzen/löschen hast du noch nicht so recht kapiert, oder? Ein Bit mit der Nummer xy wird gesetzt Byte |= ( 1 << xy ); ein Bit mit der Nummer xy wird gelöscht Byte &= ~( 1 << xy ); Um zu verstehen warum das so ist, solltest du dir das alles auf Bitebene aufmalen und dann selbst mal die Einzelbits miteinander logisch verknüpfen.
also danke nochmals für die hilfe. jetzt nach einer weiteren Anforderung an die Schaltung muss ich eben doch nach loslassen des tasters die LED zum ausschalten zwingen, also die LED darf nicht schlagartig aufhören sondern muss in der Dunkelphase aufhören zu blinken. Jetzt ist natürlich die Frage wie ich die Kontrolle über den Pin zurück bekomme, damit ich den Pin einfach auf 0 setzten kann.
nach dem das projekt jetzt lange zeit auf eis gelegt war, da ich viel zu tun hatte geht es jetzt mal wieder weiter. das problem ist immernoch, dass es passieren kann, das ich nicht kontrollieren kann ob die leds ausgehen oder anbleiben
1 | Timer einschalten |
2 | |
3 | TCCR2 |= (1 << CS21) | (1 << CS22); |
4 | |
5 | Timer ausschalten |
6 | |
7 | TCCR2 &= ~( (1 << CS21) | (1 << CS22) ); |
8 | |
9 | |
10 | Einzig unschön (das liegt aber im Ermessen) ist, dass die LED |
11 | schlagartig dort mit Blinken aufhört, wo du deinen Taster betätigst. Ob |
12 | das mitten in der Aus-Phase oder Mitten in der Ein-Phase ist, ist der |
13 | dann egal. Aufgehört ist aufgehört. Wenn dich das stört, musst du wieder |
14 | die Kontrolle über den Pin zurück erlangen und selbst den Pin |
15 | ausschalten (wobei ich mir nicht sicher bin, ob der Timer dann |
16 | tatsächlich Zugriffe auf das PORTB/3 blockiert. Aber das kann man |
17 | ausprobieren) |
das mit der bitmainpulation bekomme ich jetzt gerade auch nicht so richtig hin. ich bekomme den timer einfach nicht ausgeschaltet bzw. das die leds aus gehen :-(
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.