www.mikrocontroller.net

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


Autor: Daniel (Gast)
Datum:

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

Autor: ... ... (docean) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ersetze 2. while durch if das sollte schon mal helfen...

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

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

Autor: Stefan B. (stefan) Benutzerseite
Datum:

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

Autor: Peter Dannegger (peda)
Datum:

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

Autor: bjoern (Gast)
Datum:

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

Autor: Daniel (Gast)
Datum:

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

Autor: jl (Gast)
Datum:

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

Autor: Maik Fox (sabuty) Benutzerseite
Datum:

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

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.