Forum: Mikrocontroller und Digitale Elektronik Atmega8 PB3/OC2 PWM aktivieren


von HMS (Gast)


Lesenswert?

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

von Frank L. (franklink)


Lesenswert?

Hi,
zeig mal Deinen Code, dann kann man dir helfen.

Gruß
Frank

von H.Joachim S. (crazyhorse)


Lesenswert?

Du musst den Pin auch als Ausgang setzen. Einfache Aktivierung der 
OC-Einheit reicht nicht.

von HMS (Gast)


Lesenswert?

Ist als Ausgang definiert.

Bin gerade leider nicht zu Huase, aber werde den Code heute abend 
schicken :-)

von Uwe (Gast)


Lesenswert?

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.

von HMS (Gast)


Lesenswert?

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.

von Karl H. (kbuchegg)


Lesenswert?

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.

von HMS (Gast)


Lesenswert?

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 :-(

von spess53 (Gast)


Lesenswert?

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

von Karl H. (kbuchegg)


Lesenswert?

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.

von HMS (Gast)


Lesenswert?

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

von Karl H. (kbuchegg)


Lesenswert?

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.

von HMS (Gast)


Lesenswert?

jetzt geht es.

Danke vielmals

von HMS (Gast)


Lesenswert?

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.

von HMS (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.