PWM...

Gast #39336
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).
Gast #39337
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?
Gast #39338
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
Angehängte Dateien:
Gast #39339
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).

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 23 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.