Atmega 8L PWM2 geht nicht (lang)

Hallo, hier ein paar Schnipsel aus meinem DMX-RGB-Ansteuerprogramm:

Initialisierung:

// Timer/Counter 1 initialization // Clock source: System Clock // Clock value: 8000,000 kHz // Mode: Fast PWM top=00FFh // OC1A output: Non-Inv. // OC1B output: Non-Inv. // Noise Canceler: Off // Input Capture on Falling Edge

TCCR1A=0xA1; TCCR1B=0x09; TCNT1H=0x00; TCNT1L=0x00; OCR1AH=0x00; OCR1AL=0x00; // Wert für Rot OCR1BH=0x00; OCR1BL=0x00; // Wert für Grün

// Timer/Counter 2 initialization // Clock source: System Clock // Clock value: 8000,000 kHz // Mode: Fast PWM top=FFh // OC2 output: Non-Inverted PWM ASSR=0x00; TCCR2=0x69; TCNT2=0x00; OCR2=0x00; // Wert für Blau

Setzen der PWM-Kanäle:

if (dmxchannel==rot) { // Rot OCR1AH=0x00; OCR1AL=dmxvalue; } if (dmxchannel==gruen) { // Grün OCR1BH=0x00; OCR1BL=dmxvalue; } if (dmxchannel==blau) // Blau OCR2=dmxvalue;

Alle verwendeten DDRs sind auf Ausgang. Trotzdem ist nur das PWM für Rot und Blau am Ausgang zu finden, das PWM für Grün (OCR1B) gibt es nicht. Was habe ich denn übersehen? Verschlucke ich irgendwas?

Grüße, Carsten

Reply to
Carsten Wenzler
Loading thread data ...

kann oder will keine weiterhelfen? Carsten

Reply to
Carsten Wenzler

Hallo Carsten,

TCCR1A und TCCR1B scheinen mir richtig. Ist das SPI aus Versehen noch als Slave initialisiert (dann haette OC1B die -SS Funktion)?

Gruesse Hartmut

Reply to
Hartmut Schaefer

Nee, ist nicht. Das gemailte Programm ist eigentlich so ziemlich alles, was der uC macht. Es ist nur noch eine DMX-Empfangsroutine drin, die eben die Daten aufnimmt und weitergeben soll. Da das aber das erste Mal ist, dass ich bei dem uC den PWM verwende, scheint das Problem schon bei mir zu liegen. Google und div. Appnotes verwenden aber immer ein Soft-PWM, das ich bei

250kBit Empfang der DMX-Daten nicht einsetzen will, und außerdem soll man doch die Hardwarefunktionen auch nutzen können, wenn sie denn schon da sind. Hat vielleicht jemand einen C-Code Schnipsel, wo er alle 3 PWMs verwendet? Vielleicht hilft das schon weiter?

Grüße, Carsten

Reply to
Carsten Wenzler

Aber die Datenrichtungsregister setzt Du schon auch noch?

--
"Erst war es ein Kernel alle halbe Jahre, zum Schluss konnte ich mit 
dem Compilieren nicht mehr aufhören." (Torsten Kleinz im IRC)
Reply to
Michael Holzt

Schon klar, die sind als Ausgänge deklariert.

// Input/Output Ports initialization // Port B initialization // Func0=In Func1=Out Func2=Out Func3=Out Func4=In Func5=In Func6=In Func7=In // State0=T State1=0 State2=0 State3=0 State4=T State5=T State6=T State7=T PORTB=0x00; DDRB=0x0E;

was kanns dann noch sein? Greets, Carsten

Reply to
Carsten Wenzler

Carsten Wenzler schrieb:

Hi Carsten, wenn du willst, dass dir jemand hilft, soltest du den Leuten nicht auflasten die hexadezimalwerte umzurechnen um auf die gesetzten Bits zu schließen.

Ich weiß nicht welchen Compiler du benutzt, aber normalerweise verwendet man bei sowas Makros. z.B. in AVR-GCC für dein Beispiel:

TCCR1A= _BV(COM1A1) | _BV(COM1B1) | _BV(COM1A1) |_BV(WGM10); TCCR1B= _BV(WGM12) | _BV(CS10); ...usw...

würde man dann schon lieber lesen. Register scheinen richtig gesetzt zu sein. Kann dir also nur ein Tip geben das Programm absolut zu minimieren und einfach mal alle 3 PWM Channels auf einen festen Wert zu setzen (z.B. 20%,40%,60%). Also mal alles auskommentieren bis DDRB,TCCR1A,TCCR1B,OCR1A,OCR1B usw. um den Fehler absolut einzugrenzen. Viel Erfolg, HTH Andy

Reply to
Andreas Weber

ElectronDepot website is not affiliated with any of the manufacturers or service providers discussed here. All logos and trade names are the property of their respective owners.