Forum: Mikrocontroller und Digitale Elektronik Schwierigkeiten mit Phase Correct PWM Mode


von Daniel (Gast)


Lesenswert?

hallo zusammen,
ich würde gerne an dem OC0A pin meines Atmega48 eine Phase correct pwm 
ausgeben lassen, doch es will einfach nicht so richtig klappen.
Deshalb wäre ich echt froh wenn mir jemand von euch weiterhelfen könnte 
hier der Quellcode:

void main(void)
{
  TCCR0A |= (1<<WGM00) | (1<COM0A1);        //phase correct mode
  TCCR0B |= (1<<CS01) | (1<<CS00);          //Prescaler 1/64
  OCR0A = 0;                                //signal bis 100

  PORTD = 0;                                //Pull ups deaktivieren
  DDRD |= (1<<DDD6);                        //OC0A output
  EI;                                       //enable interrupts
  while(1)
  {
  }
}

vielen dank schon mal im vorraus

grüße daniel

von Daniel (Gast)


Lesenswert?

ups das muss näturlich heißen OCR0A = 100; funktioniert aber trotzdem 
nicht...

wäre echt nett von euch wenn mir jemand weiterhelfen könnte bin nämlich 
schon richtig am verzweifeln weil ich einfach den Fehler nicht finde...

grüße daniel

von Jörg X. (Gast)


Lesenswert?

Was erwartest du denn bei "OCR0A = 0; "?
> If the OCR0A is set equal to BOTTOM, the output will be continuously low
> and if set equal to MAX the output will be continuously high for non-
> inverted PWM mode. For inverted PWM the output will have the opposite
> logic values.
Probier mal andere Compare-Werte ...

hth. Jörg
ps.: Welchen Compiler verwendest du denn da? (das "EI;" hab ich bei AVRs 
noch nicht gesehen)

von Jörg X. (Gast)


Lesenswert?

Oh, da war ich zu langsam..
Woran merkst du, dass es nicht funktioniert?
Wie testest du das, was erwartest du, etc.

von Daniel (Gast)


Lesenswert?

ich teste es in dem ich den status von OC0A mit einem oszi messe aber 
nie ein pwm signal bekomme.

erwarten würde ich ein pwm signal das nach 100/255 ausgeht und sich dann 
bei 1/255 wieder einschaltet. oder hab ich da irgendwas falsch 
verstanden, könnte ja auch der fall sein.

danke übrigensfür deinen beitrag.

grüße daniel

von Daniel (Gast)


Lesenswert?

ich benutze übrigens iar workbench... bin bis jetzt eigentlich ganz gut 
damit gefahren zum progen nehm ich winavr...

von Jörg X. (Gast)


Lesenswert?

1
void main(void)
2
{
3
    TCCR0A = (1<<WGM01)|(1<<WGM00)|(1<COM0A1);    //fast-PWM mode, set on match
4
    TCCR0B = (1<<CS01) | (1<<CS00);             //Prescaler 1/64
5
    OCR0A = 128;                                //signal bis 100
6
7
    PORTD = 0;                                //Pull ups deaktivieren
8
    DDRD |= (1<<DDD6);                        //OC0A output
9
    //nicht noetig EI;                       //enable interrupts
10
    while(1){
11
   }
12
}
Probier das mal, und schau dir im Datenblatt den Unterschied zwischen 
Fast-pwm und Phase-correct pwm an.

hth. Jörg

von Daniel (Gast)


Lesenswert?

Hi jörg,
danke für deinen Beitrag, ich habs bei meinem uC ausprobiert, es 
funktioniert aber immer noch nicht.

Ich würde echt gerne wissen, woran es liegt, seit 2 Tagen tu ich schon 
an dem Schmarn rum und finde einfach den Fehler nicht...

Falls dir oder irgendjemand anderem noch etwas einfallen sollte, ich 
wäre echt froh wenn mir jemand weiterhelfen könnte.

gruß Daniel

von Daniel (Gast)


Lesenswert?

Alles klar hat sich erledigt, hab zwar den selben Code genommen wie 
oben, aber jetzt funktionierts komischerweise(Enable Interrupt benötigt 
man natürlich nicht, dass stand noch von einem früheren Code da)! Danke 
für deine Hilfe Jörg, der Fast-PWM-Mode funktioniert jetzt auch.

bis dann Daniel

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.