Hi, ich verstehe folgenden Programmcode nicht: int main( void ) { WDTCTL = WDTPW + WDTHOLD; // Stop watchdog timer to prevent time out reset P1DIR = 0xFF; // Alle LEDs als Ausgang setzen P1OUT = 0x00; // alle LEDs ausschalten delay(2); P1OUT = 0xFF; delay(2); while (1) { // Endlosschleife while (P2IN & BIT5) { P1OUT = 0xF0; } } // end Endlosschleife } // end main Folengeder Programmablauf ist auf dem Controller zu beobachten: Start --> Alle LEDs an --> Wartezeit (Delay) --> Alle LEDs aus --> Wartezeit (Delay) --> 4 LEDs an --> Wartezeit (Delay) --> Alle LEDs an --> kurze Wartezeit --> alle LEDs aus --> kurze Wartzezeit --> 4 LEDs an --> .... Problem: Das Programm müsste doch 1. in der While(1) Schleife hängen und dürfte nicht mehr alle LEDs anmachen. Doch so wie es aussieht springt das Programm wieder "hoch" zum Anfang von main. Außerdem wollte ich gerne nur 4 LEDs anmachen, wenn der Schalter gedrückt wird ( while (P2IN & BIT5) ) aber leider zeigt der Programmablauf keine Reaktion bei Betätigung der Taster. Muss man das irgendwie anders lösen? Vielen Dank im Voraus, grüße Daniel
ersetze 2. while durch if das sollte schon mal helfen...
Daniel schrieb: > Hi, > Problem: Das Programm müsste doch 1. in der While(1) Schleife hängen und > dürfte nicht mehr alle LEDs anmachen. Doch so wie es aussieht springt > das Programm wieder "hoch" zum Anfang von main. Ich denke nicht, dass es hochspringt. Ich denke, dass da der Watchdog zuschlägt. Auch wenn der Kommentar suggeriert, das hier der Watchdog abgeschaltet wird. Kommentare sind Schall und Rauch, da kann man alles Mögliche hinschreiben. Zumindest könnte ein Watchdog zusammen mit einem Active High/Active Low Denkfehler das geschilderte Verhalten erklären.
Das Programm setzt eine bestimmte Art voraus, wie die LEDs und Taster angeschlossen sind. Deshalb ist es immer schlau einen Schaltplanskizze mitzuschicken :) Die LEDs scheinen tatsächlich active low angeschlossen zu sein während das Programm eine active high Schaltung vermutet, denn der Programmkommentar passt nicht zur Beobachtung. Möglicherweise ist das auch bei dem Taster der Fall. Im übrigen ist die Tasterreaktion "final", d.h. nachdem du einmal die 4/4 LEDs geschaltet hast, ändert sich deren Zustand in diesem Programm nie mehr. Aber das ist ein Logikproblem. Was mit active low und active high gemeint ist, steht u.a. im AVR-Tutorial und im AVR-GCC-Tutorial im I/O Kapitel
Stefan B. schrieb: > Das Programm setzt eine bestimmte Art voraus, wie die LEDs und Taster > angeschlossen sind. Deshalb ist es immer schlau einen Schaltplanskizze > mitzuschicken :) Insbesondere, ob am Taster ein Pullup hängt oder man erst den internen Pullup einschalten muß. Anfänger nehmen oft an, daß ein offener Pin einen Logikpegel hätte. Dem ist aber nicht so! Offene Pins sind Pfui-Bäh. An allen unbenutzten Pins sollte man die internen Pullups setzen. Peter
außerdem wird P2 nicht richtig initialisiert... P2DIR=0x00; P2REN=??; //je nachdem Pullup oder Pulldown Gruß
Dann werde ich mich mal mit dem Tutorial beschäftigen....danke schonmal für die Hilfe
Daniel schrieb:
> WDTCTL = WDTPW + WDTHOLD; // Stop watchdog timer to prevent time out
ist mir neu das man einen Watchdog der einmal aktiviert wurde wieder
ausschalten kann. Das wiedersprich dem Gedanken eines Watchdogs.
Der wird hier eher aktiviert.
jl schrieb: > Daniel schrieb: >> WDTCTL = WDTPW + WDTHOLD; // Stop watchdog timer to prevent time out > > ist mir neu das man einen Watchdog der einmal aktiviert wurde wieder > ausschalten kann. Das wiedersprich dem Gedanken eines Watchdogs. > > Der wird hier eher aktiviert. Das sieht auch stark nach MSP430 aus. Da ist der Watchdog nach dem Reset aktiv und sollte bei Nichtverwendung genau mit dieser Sequenz abgeschaltet werden können. Für die Sicherheit dient hier das "WDTPW", was eine Art Passwort darstellt.
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.