Forum: Mikrocontroller und Digitale Elektronik Atmega644 PWM Timer0 OCROB / A -Problem


von Rudi K. (yast)


Lesenswert?

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

von Hubert G. (hubertg)


Lesenswert?

Schon mal hier
  OCR0B = (analog_0/4);
  OCR0A = (analog_1/4);
getauscht um zu sehen ob überhaupt ein analog Wert kommt?

von Rudi K. (yast)


Lesenswert?

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....

von Hubert G. (hubertg)


Lesenswert?

Und wenn du OCR0A mit einem festen Wert belegst, z.B. 100, kommt dann 
auch nicht?

von Rudi K. (yast)


Lesenswert?

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?

von Hubert G. (hubertg)


Lesenswert?

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.

von Rudi K. (yast)


Lesenswert?

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

von Rudi K. (yast)


Angehängte Dateien:

Lesenswert?

hab mal die fils angehängt

vlt hilfts ja.

von Hubert G. (hubertg)


Lesenswert?

Der Fehler könnte auch in der ADC-Init sein.

von Rudi K. (yast)


Lesenswert?

Hubert G. schrieb:
> Der Fehler könnte auch in der ADC-Init sein.

wie das?

deshalb die files

von Stefan E. (sternst)


Lesenswert?

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.

von Hubert G. (hubertg)


Lesenswert?

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.

von Rudi K. (yast)


Lesenswert?

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ß

von Hubert G. (hubertg)


Lesenswert?

Ja, genau so.

von Rudi K. (yast)


Lesenswert?

danke uns schuldigung...

von Thomas E. (thomase)


Lesenswert?

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.

von Rudi K. (yast)


Lesenswert?

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