Forum: Mikrocontroller und Digitale Elektronik mega8 PWM nur OCR1B, OCR1A tot


von Tino K. (blumengiesser)


Lesenswert?

Problemchen: Ich möchte auf dem OCR1B (PB2) beim Mega8 das PWM signal 
haben. Dazu habe ich den Timer folgender Maßen konfiguriert:
1
TCCR1A |= (1<<COM1B1) | (1<<COM1B0) | (1<<WGM10);
2
TCCR1B |= (1<<CS10) | (1<<CS11);
3
OCR1B |= 150; 
4
TIMSK |= (1<<OCIE1B);

Das funktioniert auch ABER: Der Pin PB1 ist jetzt "tot". Sprich der 
reagiert auf keine Änderungen ala
1
 PORTB  |= (1<<PB1);

Kann man das irgendwie umgehen? Oder was mache ich falsch?

von Matthias S. (Firma: matzetronics) (mschoeldgen)


Lesenswert?

Ob der Timer PWM erzeugt oder nicht, ist dem Pin erstmal wurscht. Erst, 
wenn er auf Ausgang geschaltet wird, erscheint PWM, entsprechend den 
gesetzten COM Bits.
Stehen die also für OCRA auf 0, ist der Pin als I/O benutzbar. Deswegen 
vermute ich

Tino Kühn schrieb:
> TCCR1A |= (1<<COM1B1) | (1<<COM1B0) | (1<<WGM10);

Du veroderst nur. Wenn also vorher schon mal was im TCCR1A gestanden 
hat, dann wird das so erhalten. Wenn du nur einmal TCCR1A beschreibst, 
nimm ruhig ein = statt dem |=. Das kann auch beim TCCR1B nicht schaden.

Tino Kühn schrieb:
> Oder was mache ich falsch?

Du könntest den kompletten Code posten.

von Tino K. (blumengiesser)


Lesenswert?

Matthias Sch. schrieb:
> Ob der Timer PWM erzeugt oder nicht, ist dem Pin erstmal wurscht. Erst,
> wenn er auf Ausgang geschaltet wird, erscheint PWM, entsprechend den
> gesetzten COM Bits.
> Stehen die also für OCRA auf 0, ist der Pin als I/O benutzbar. Deswegen
> vermute ich
>
> Tino Kühn schrieb:
>> TCCR1A |= (1<<COM1B1) | (1<<COM1B0) | (1<<WGM10);
>
> Du veroderst nur. Wenn also vorher schon mal was im TCCR1A gestanden
> hat, dann wird das so erhalten. Wenn du nur einmal TCCR1A beschreibst,
> nimm ruhig ein = statt dem |=. Das kann auch beim TCCR1B nicht schaden.
>
> Tino Kühn schrieb:
>> Oder was mache ich falsch?
>
> Du könntest den kompletten Code posten.

Das Ändern von |= auf = hatt ekeinerlei Erfolg. ich habe weiter versucht 
rauszubekommen, was passiert. Jedenfalls denke ich, dass sich der 
Controller zu einer bestimmten Zeit "aufhängt", und zwar genau wenn ein 
Programmteil die Pins PB1 auch benutzen will.

main, alles raus was nicht wichtig war
1
int main()
2
{
3
  initTimer0();
4
  initTimer1();
5
6
  sei();//interrupt aktivieren
7
8
  spi_init();
9
10
  uart_init();
11
12
  init_3lines_DOGM163();
13
14
15
16
while(1)
17
{
18
  uart_puts("h");
19
  uart_puts("\n");
20
 
21
}
22
}

1
void init_3lines_DOGM163(void) 
2
{
3
  init_PORTS_DOGM163();
4
  _delay_ms(200);
5
  write_instruction_DOGM163 (0x38); // Instruction Set, {0 0 1 DL N DH IS2 IS1} = 00 11 10 00 
6
  write_instruction_DOGM163 (0x39); // Instruction Set, {0 0 1 DL N DH IS2 IS1} = 00 11 10 01 
7
  write_instruction_DOGM163 (0x1D); // Bias (Spannung), {0 0 0 1 BS 1 0 Fx} = 00010101, es kann 15/1D gewählt werden, dann leuchtet der Hintergrund stark nach
8
  write_instruction_DOGM163 (0x7F); // Contrast (Bit C3-C0) {0 1 1 1 C3 C2 C1 C0} = 01111111
9
  write_instruction_DOGM163 (0x5F); // Power/ICON/Contrast (Bit C5-C4) {0 1 0 1 Ion Bon C5 C4} = 01011111
10
  write_instruction_DOGM163 (0x69); // Follower {0 1 1 0 Fon Rab2 Rab1 Rab0} = 01101001, Rab siehe Datenblatt Power supply
11
    _delay_ms(200);
12
  write_instruction_DOGM163 (0x0C); // Display Function, {0 0 0 0 1 D C B} = 00001100
13
  write_instruction_DOGM163 (0x06); // Entry Mode {0 0 0 0 0 1 I/D S} = 00000110
14
}
15
16
#define DOGM163_CSB   PB1   // Port fuer CSB am µC
17
#define DOGM163_RS     PB0    // Port für RS am µC
18
#define DOGM163_DDR   DDRB  // DDR  am Atemega8
19
#define DOGM163_PORT   PORTB  // Port am Atemega8
20
21
22
void init_PORTS_DOGM163 (void)
23
{
24
  //RS und CSB als Ausgang setzen
25
  DOGM163_DDR |= (1<<DOGM163_RS) | (1<<DOGM163_CSB);
26
}

Durch rumprobieren weiss ich jetzt, dass es nicht geht wenn der Timer1 
auf die Pins zugreifen will. Aber das sollte doch wenn man sie nicht 
definiert funktionieren? Ich verstehe es auch nicht mehr...

von Tino K. (blumengiesser)


Lesenswert?

1
#define DOGM163_MOSI   PB3   // MOSI, Master out slave in, am Atmega8
2
#define DOGM163_SCK   PB5   // SCK am Atmega8
3
#define DOGM163_SS     PB2   // SS am Atmega8
4
5
6
// Initialisierung des SPI Interfaces
7
void spi_init(void)
8
{
9
  // MOSI, SS und SCK als Ausgang setzen
10
  DDRB |= (1<<DOGM163_SS)|(1<<DOGM163_MOSI)|(1<<DOGM163_SCK); 
11
  //SPI als Master aktivieren. Clock rate fck/16 
12
  SPCR |= (1<<SPE)|(1<<MSTR)|(1<<SPR0);
13
}

von Tino K. (blumengiesser)


Lesenswert?

kann mir hier keiner helfen?

von Salami (Gast)


Lesenswert?

Tino Kühn schrieb:
> Durch rumprobieren weiss ich jetzt, dass es nicht geht wenn der Timer1
> auf die Pins zugreifen will. Aber das sollte doch wenn man sie nicht
> definiert funktionieren? Ich verstehe es auch nicht mehr...

Was geht nicht wie mit welchem angespeckten kompletten kopmilierbaren 
lauffähigen Testprogramm? Eventuell HW Fehler zB Schluß mit PB2, etc.

Aus den gegebenen Infos kann man nicht ableiten warum PB1 nicht 
reagiert.

von grundschüler (Gast)


Lesenswert?

Tino Kühn schrieb:
> #define DOGM163_SS     PB2   // SS am Atmega8

> Ich möchte auf dem OCR1B (PB2) beim Mega8 das PWM signal
> haben.

CS als PWM?

von Matthias S. (Firma: matzetronics) (mschoeldgen)


Lesenswert?

grundschüler schrieb:
> CS als PWM?

Das sehe ich auch so, PB2 ist da doppelt belegt. Ich würde dir 
vorschlagen, mal einen Pinplan zu erstellen und das ein wenig 
auseinander zu fusseln. Das komplette Programm ist das übrigens immer 
noch nicht - wer weiss, was da noch für Seiteneffekte mitprogrammiert 
sind.

von gvs (Gast)


Lesenswert?

Der geneigte Leser des Datenblatts
hat gelegentlich die folgende Stelle gefunden und erkannt, dass bei PWM 
die Sache etwas komplizierter liegt:

>
16-bit Timer/Counter
Register Description
Timer/Counter 1 Control
Register A – TCCR1A

When the OC1A or OC1B is connected to the pin, the function of the 
COM1x1:0 bits is dependent of the WGM13:0 bits setting.
<

In den folgenden Tabelle kann man die entsprechenden Werte finden.

Man könnte daraus erkennen, ob das möglich ist, was man "möchte":

Tino Kühn schrieb:
> Ich möchte auf dem OCR1B (PB2) beim Mega8 das PWM signal
> haben.

Tino Kühn schrieb:
> Das funktioniert auch ABER: Der Pin PB1 ist jetzt "tot".

von Tino K. (blumengiesser)


Angehängte Dateien:

Lesenswert?

So, Sonntag war Sonntag aber jetzt hier mein Projekt als ZIP File (nur 
die *.c Dateien und der Schaltplan). Ich hoffe das erklärt sich.

Zu der Anmerkung, warum SS/PB2 auch in der SPI Routine verwendet wird: 
Es wird bei der Initialisierung vom SPI beim Mega8 erwartet, dass dieser 
Pin ein Ausgang ist. Der wird aber vom SPI nicht benutzt und ohne diese 
Deklaration funktioniert das SPI nicht. Das hatte ich schon vor Jahren 
mal rausbekommen.

OK, nochmal meine Frage zusammengefasst: PB1/OC1A kann nicht mehr als 
normaler Port verwendet werden, wenn Timer1 als PWM defeniert wird 
(PB2/OC1B soll als PWM Signal die Helligkeit steuern und PB1 als 
normaler Port dienen)

Wer mir die Lösung (ohne neue Hardware) als erster sagt, bekommt einen 
Glühwein auf einem der Dresdner Weihnachtsmärkte ausgegeben :-)

von Matthias S. (Firma: matzetronics) (mschoeldgen)


Lesenswert?

Tino Kühn schrieb:
> post.zip

Also, ich habe jetzt auch keine Lust mehr. Da fehlt das Hauptprogramm 
und ich habe keine Lust zu raten, ob du evtl. aus Versehen in OCR1A den 
TOP Wert reinschreibst. Dein System zum Aufteilen der winzigen 
Programmstücke auf verschiedene Dateien mit ellenlangen 
Registererklärungen macht auch keinen Spass.
Beachte die Bemerkungen zu 'Phase Correct PWM' im Datenblatt. Ich weiss 
auch nicht, warum zur Helligkeitsregelung Phase Correct wichtig wäre, 
eigentlich reicht da eine simple Fast PWM mit 8 bit.

von Tino K. (blumengiesser)


Angehängte Dateien:

Lesenswert?

Matthias Sch. schrieb:
> Tino Kühn schrieb:
>> post.zip
>
> Also, ich habe jetzt auch keine Lust mehr. Da fehlt das Hauptprogramm
> und ich habe keine Lust zu raten, ob du evtl. aus Versehen in OCR1A den
> TOP Wert reinschreibst. Dein System zum Aufteilen der winzigen
> Programmstücke auf verschiedene Dateien mit ellenlangen
> Registererklärungen macht auch keinen Spass.

Hey Sorry, das habe ich in der Eile vergessen ranzuhängen. Jetzt aber!

> Beachte die Bemerkungen zu 'Phase Correct PWM' im Datenblatt. Ich weiss
> auch nicht, warum zur Helligkeitsregelung Phase Correct wichtig wäre,
> eigentlich reicht da eine simple Fast PWM mit 8 bit.

Sorry wenn ich vielleicht nicht den richtigen Mode ausgesucht habe. Ich 
nehe alles was funktioniert...

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.