Verstehe folgenden (trivialen) Programmcode nicht

Gast #1610403
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
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.
Persönliche Seite
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
Gast
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.
Persönliche Seite
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.

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 16 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.