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
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).
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?
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.