Forum: Mikrocontroller und Digitale Elektronik PB1 (OC1A) bleibt dauerhaft auf low


von igor.h (Gast)


Lesenswert?

Hallo,

ich wollte einfach mal die Funktion der Fast - PWM Funktion probieren, 
jedoch funktioniert das so nicht. Laut meinem Verständnis sollte nun der 
PIN ca. zur Hälfte eingeschaltet sein und dann wieder auf low gehen.

#include <avr/io.h>

int main(void)
{

  TCCR1B=(1<<CS11);                //Vorteiler 8
  TCCR1B=(1<<WGM12);               //Fast PWM Modus(8 bit)
  TCCR1A=(1<<WGM10);               //Fast PWM Modus(8 bit)
  TCCR1A=(1<<COM1A1)|(1<<COM1A0);  //Einschalten bei Compare match
  OCR1AH=0;
  OCR1AL=127;

  DDRB=0xff;

while(1)
  {
    ;
  }
}

freue mich über den gefundenen Fehler
von crazy horse (Gast)


Lesenswert?

igor.h schrieb:

>   TCCR1B=(1<<CS11);                //Vorteiler 8
>   TCCR1B=(1<<WGM12);               //Fast PWM Modus(8 bit)
Was passiert hier mit TCCR1B?

>   TCCR1A=(1<<WGM10);               //Fast PWM Modus(8 bit)
>   TCCR1A=(1<<COM1A1)|(1<<COM1A0);  //Einschalten bei Compare match
Was passiert hier mit TCCR1A?
von igor.h (Gast)


Lesenswert?

laut meinem Verständnis wäre dann

TCCR1B=00001010     durch die Verschiebung der Bits auf die Position 
oder?

und

TCCR1A=11000001

hm, aber so wies aussieht weißt du das Problem =)
von m.n. (Gast)


Lesenswert?

x = 4;
x = 16;

Welchen Wert hat x am Ende?
von igor.h (Gast)


Lesenswert?

ouh, das heißt ja ich schiebe das zuerst gesetzte Bit CS11 viel 
weiter....

wohl das ODER vergessen^^

vielen Dank, jetzt tuts
von Jonathan S. (joni-st) Benutzerseite


Lesenswert?

Nein:


TCCR1B = (1<<CS11)
Was passiert? TCCR1B wird der Wert 0000_1000 zugewiesen.
Danach kommt
TCCR1B = (1<<WGM12)
Und hier wird dem Register der Wert 0000_0010 zugewiesen. Dabei nimmt es 
dann auch wirklich den Wert 0000_0010 an - und dein vorher gesetztes Bit 
ist wieder gelöscht. Mit "=" weist man nämlich einem Register einen Wert 
zu - und der vorherige Wert wird vollständig überschrieben. Les' dir mal 
den Artikel über Bitmanipulation durch. ODER (OR, als Operator "|" oder 
"|=") ist das Stichwort.


Gruß
Jonathan
von Jonathan S. (joni-st) Benutzerseite


Lesenswert?

Ups, zu lange getippt ;)
von igor.h (Gast)


Lesenswert?

ok also z.B

TCCR1B=(1<<CS11)|(1<<WGM12);

Damit weise ich praktisch den Verknüpften Wert direkt zu

TCCR1B= 0000_1010

hab das jetzt einfach direkt reingeschrieben
TCCR1B=0b00001010;

auf jeden Fall nochmals vielen Dank :)
von Rolf Magnus (Gast)


Lesenswert?

igor.h schrieb:
> laut meinem Verständnis wäre dann
>
> TCCR1B=00001010     durch die Verschiebung der Bits auf die Position
> oder?

Nein.

> hm, aber so wies aussieht weißt du das Problem =)

Tut er mit Sicherheit. Aber du sollst selbst drauf kommen.
Dröseln wir's doch noch weiter auf:

Was passiert hier mit TCCR1B:

>   TCCR1B=(1<<CS11);                //Vorteiler 8

und was hier:

>   TCCR1B=(1<<WGM12);               //Fast PWM Modus(8 bit)

?
von igor.h (Gast)


Lesenswert?

wie bereits geschrieben oder?^^
von Rolf Magnus (Gast)


Lesenswert?

Ja. Ich hatte nur zu lange gebraucht, meine Antwort abzuschicken und hab 
vorher nicht geschaut, ob schon andere Antworten da waren.
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.