Forum: Compiler & IDEs PWM...


von Zoltan (Gast)


Lesenswert?

Hallo,

könnte bitte jemand den kleinen Beispiel im  Anhang anschauen. Ich komme 
einfach nicht darauf, was ich falsch mache.
Der UART funktioniert, nur der PWM Signal an PB1(OC1) will einfach 
nicht.

Danke
Zoltan

von Zoltan (Gast)


Angehängte Dateien:

Lesenswert?

Der Anhnag nochmal:

von Joerg Wunsch (Gast)


Lesenswert?

Du hast die FAQ nicht gelesen.  Punkt 1: Wann muß man
wo "volatile" benutzen?  Die Variable "c" ist ein typischer
Kandidad.


Stilistisch mischst Du outp(), sbi(), cbi() mit der neueren
Variante der direkten Port Ein-/Ausgabe.  Benutze besser nur
letzteres.  Statt umständlich

    sbi(UCSRB, RXEN);
    sbi(UCSRB, RXCIE);

zu schreiben, kannst Du einfacher (und effektiver) schreiben:

   UCSRB = _BV(RXEN) | _BV(RXCIE);

sbi(port, bit) ist äquivalent zu

   port |= _BV(bit);

Analog cbi():

   port &= ~_BV(bit);

D. h. Du kannst für die IO-Ports identische Methoden benutzen
wie für ganz normale C-Variable.

Die Benutzung von PORTB zusammen mit PINB4 ist verwirrend.
Entweder gleich nur 4 schreiben oder PB4.

Ein Bit im Port toggeln:

   PORTB ^= _BV(4);

Großschreibung von Variablen/Parametern (uart_send()) ist
unkonventionell, da eine Großschreibung normalerweise für
Präprozessor-Macros vorbehalten ist.

Aber ich denke, der wirkliche Fehler sind die vergessenen
volatile bei c (und wohl auch x).

von Zoltan (Gast)


Lesenswert?

Hallo Joerg,

erstens danke für die ausführliche Erklärung, aber:
im FAQ steht nichts über "typische Kandidaten" für volatile.
Ich dachte mann nimmt volatile, damit bei Schleifen, diese nicht 
wegoptimiert werden. Ich habe dennoch volatile eingefügt, ohne 
Ergebniss.

Mich würde aber interessieren, ob ich speziell in dem PWM Einstellungen 
etwas übersehen habe.

PS.: Was bedeutet toggeln?

von Zoltan (Gast)


Angehängte Dateien:

Lesenswert?

Jetzt klappts: AVR-Studio wollte den Register //OCR1L=c; //nicht 
beschrieben, solang dieser in der Schleife lief. Ich habe sie jetzt an 
eine Andere stelle gesetzt und nun läft alles bestens. Es lag dann doch 
irgendwie am volatile.. Dake nochmals

von Joerg Wunsch (Gast)


Lesenswert?

Ach, sag doch gleich, daß Du das nur simuliert hast!

Nee, Jungs, richtige Tests macht man immer noch am besten auf
richtiger Hardware. ;-)  Erst danach behaupten, daß es nicht
gehen würde...

Ja, ich denke schon, daß das volatile Dein Problem war, da
anonsten in der Hauptschleife die Variable c einfach nie
neu eingelesen wird.  Sie wird einmal auf 0 gesetzt (das ist
der Initialwert, den sie standardmäßig hat -- da hilft auch
Deine erste Ausgabe auf das OCR-Register nichts, da es sofort
danach wieder mit 0 überschrieben wird) und dann innerhalb der
Schleife nie wieder neu gelesen, egal, was die UART-Interrupt-
Routine da empfangen hat.

»to toggle« heißt sowas wie ,,hin- und herschalten''.  Also
genau das, was Du relativ umständlich mit Deinen if(...)
sbi/cbi gemacht hast, das kann man halt mit XOR (^) viel
einfacher erreichen.  Bitweises Programmieren, wie man es bei
Controllern recht häufig braucht, ist in C etwas gewöhnungsbedürftig...
(das Löschen eines Bits mit &= ~... trifft das genauso).

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.