Forum: Mikrocontroller und Digitale Elektronik Verstehe folgenden (trivialen) Programmcode nicht


von Daniel (Gast)


Lesenswert?

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

von ... .. (docean) Benutzerseite


Lesenswert?

ersetze 2. while durch if das sollte schon mal helfen...

von Karl H. (kbuchegg)


Lesenswert?

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.

von Stefan B. (stefan) Benutzerseite


Lesenswert?

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

von Peter D. (peda)


Lesenswert?

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

von bjoern (Gast)


Lesenswert?

außerdem wird P2 nicht richtig initialisiert...
P2DIR=0x00;
P2REN=??; //je nachdem Pullup oder Pulldown
Gruß

von Daniel (Gast)


Lesenswert?

Dann werde ich mich mal mit dem Tutorial beschäftigen....danke schonmal 
für die Hilfe

von jl (Gast)


Lesenswert?

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.

von Maik F. (sabuty) Benutzerseite


Lesenswert?

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
Noch kein Account? Hier anmelden.