Forum: Mikrocontroller und Digitale Elektronik Nur ein PWM Channel funktioniert?!


von Nn N. (jaytharevo)


Lesenswert?

Hey,

also ich machs kurz. Hab heute ein Proggi probiert, und es hat nur einer 
der beiden PWM Channel funktioniert. Hab sogar Controller gewechselt, 
daran lags natürlich nicht^^. Controller is ein ATMEGA88PA und nur OC1A 
funktioniert, OC1B macht nix....

Hier der Codeteil:
1
void Timer1_init(void)  // Configre for PWM (2 Channels) and 20ms Overflow
2
{
3
// Clear OC1A/OC1B on Compare Match, set OC1A/OC1B at BOTTOM
4
 TCCR1A |= (1<<COM1A1) | (1<<WGM11);
5
// Compare Output Mode, Fast PWM (TOP = ICR1) | CPU_Clock/8
6
 TCCR1B |= (1<<WGM13) | (1<<WGM12) | (1<<CS11);
7
// Overflow enabled
8
 TIMSK1 |= (1<<TOIE1);
9
10
11
// TOP Value --> 20ms Frametime
12
 ICR1 = Frame_time;
13
// OCR1A default Value --> 1ms 
14
 OCR1A = Lower_end;
15
// OCR1B default Value --> 1ms 
16
 OCR1B = Lower_end;
17
}

Ich finde wiedermal den Fehler nicht....

MfG

von spess53 (Gast)


Lesenswert?

Hi

Portpin auf Ausgang?

MfG Spess

von Nn N. (jaytharevo)


Lesenswert?

1
DDRB |= (1<<PB1) | (1<<PB2); // Set PB1 & PB2 as Output for PWM Channels, rest is Input

Sollte doch passen?

von spess53 (Gast)


Lesenswert?

Hi

Und wo ist/sind das/die COM-Bit(s) für OC1B?

MfG Spess

von Karl H. (kbuchegg)


Lesenswert?

> TCCR1A |= (1<<COM1A1) | (1<<WGM11);


Und wo schaltest du da den anderen Portpin auf die PWM drauf?

COM1A1 ist für den A-Kanal der PWM. Daher auch das A im Namen. Für den 
B-Kanal brauchst du auch eine Freigabe.

von Nn N. (jaytharevo)


Angehängte Dateien:

Lesenswert?

Was übersehe ich?

Der is ja mit dem OCR1A freigegben.

Anhang sind screens aus dem Datenblatt!

von spess53 (Gast)


Lesenswert?

Hi

>Der is ja mit dem OCR1A freigegben.

Nein. Sieh dir mal die Beschreibung von TCCR1A an.

MfG spess

von Nn N. (jaytharevo)


Lesenswert?

1
The COM1A1:0 and COM1B1:0 control the Output Compare pins (OC1A and OC1B respectively)
2
behavior. If one or both of the COM1A1:0 bits are written to one, the OC1A output
3
overrides the normal port functionality of the I/O pin it is connected to. If one or both of the
4
COM1B1:0 bit are written to one, the OC1B output overrides the normal port functionality of the
5
I/O pin it is connected to. However, note that the Data Direction Register (DDR) bit corresponding
6
to the OC1A or OC1B pin must be set in order to enable the output driver.

Du wirst den Absatz meinen. Gelesen hab ich ihn ja, nur den Sinn hab ich 
anscheinend nicht so ganz verstanden.

Also muss ich OC1B erst einschalten, dadurch wird die erste Tabelle dann 
ja ungültig oder? Also, dass keinen invertierten Mode habe.

MfG

Danke für eure Hilfe :)!

von Karl H. (kbuchegg)


Lesenswert?

Julian Schild schrieb:

> Du wirst den Absatz meinen. Gelesen hab ich ihn ja, nur den Sinn hab ich
> anscheinend nicht so ganz verstanden.

Du hast 2 PWM Kanäle: A und B

A:  Der Ausgangspin ist OC1A
    Wie sich der Pin in Bezug auf den Timer verhält, regeln
    die Bits COM1A0 und COM1A1


B:  Der Asugangspin ist OC1B
    Wie sich der Pin in Bezug auf den Timer verhält, regeln
    die Bits COM1B0 und COM1B1


> Also muss ich OC1B erst einschalten, dadurch wird die erste Tabelle dann
> ja ungültig oder? Also, dass keinen invertierten Mode habe.

Nein.
Es ist alles völlig gleich zum A Kanal.
Du musst nur in den Konstanten anstelle von A B hinschreiben. Das ist 
alles.


COM1A0 und COM1A1 regeln nur den A Kanal, der am Pin OC1A rauskommt. Du 
scheinst zu denken, dass diese Bits auch den B-Kanal beeinflussen. Das 
tun sie nicht. Der hat seine eigenen Bits


Hier
1
// Clear OC1A/OC1B on Compare Match, set OC1A/OC1B at BOTTOM
2
 TCCR1A |= (1<<COM1A1) | (1<<WGM11);
stimmen deni Kommentar und dein Code nicht überein. Diese Konfiguration 
konfiguriert nur 'clear OC1A on Compare Match, set OC1A at Bottom'

Jetzt
1
// Clear OC1A/OC1B on Compare Match, set OC1A/OC1B at BOTTOM
2
 TCCR1A |= (1<<COM1A1) | (1<<COM1B1) | (1<<WGM11);
stimmts. Jetzt ist auch der B Kanal so wie im Kommentar beschrieben, 
konfiguriert.

von Nn N. (jaytharevo)


Lesenswert?

OMFG,
ich hab mich da total verschaut. Da steht ja COM1A1/COM1 B 1.
Na dann ist alles klar.


Also heißt meine Codezeile nun korrekt:
1
TCCR1A |= (1<<COM1A1) | (1<<COM1B1) | (1<<WGM11);


Danke ihr "Augenöffner", morgen gehts munter mit dem Debugging weiter^^

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.