mikrocontroller.net

Forum: Compiler & IDEs PWM...


Autor: Zoltan (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Zoltan (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Der Anhnag nochmal:

Autor: Joerg Wunsch (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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).

Autor: Zoltan (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Zoltan (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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

Autor: Joerg Wunsch (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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).

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.