mikrocontroller.net

Forum: Projekte & Code MSP-430: komisches Verhalten in supersimplen Programm/Zählproblem


Autor: Benni (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Forum,

hoffentlich bin ich hier richtig. Falls nein: sorry; vielleicht können 
die Mods meinen Thread ja verschieben. Einen passenden älteren Beitrag 
habe ich auch nicht finden können.

Ich will acht LEDs auf einem MSP-430-Board als Lauflicht programmieren.
Mein Code sieht so aus:
#include <msp430x16x.h>

int main(){
  int n, i = 0;
  P3DIR = 0xFF;
  P3SEL = 0x00;

  // Endlosschleife
  while(1) {
    if (i == 0) {
      // LEDs alle ausmachen.
      P3OUT = i;
      i += 1;
      continue;
    }
    // LEDs auf 1, 2, 4, 8, .... setzen.
    P3OUT = i;
    i *= 2;
    // Wenn die hochwertigste LED geschaltet wurde: von vorne (ab 0).
    i %= 255;
    for (n = 0; n < 200; n++) {;} // <- !!!!
  }
  return 0;
}

Soweit funktioniert das alles wunderbar (i nimmt nur 0 und 
Zweierpotenzen an, die werden auf das LED-Byte geschrieben), die LEDs 
werden jedoch viel zu schnell geschaltet (sie "stehen" sozusagen alle).
Um in meiner Schleife also eine zeitliche Verzögerung zu erreichen (auf 
sleep() o.ä. kann ich nicht zugreifen), habe ich das mit "!!!!" 
markierte for-Schleifenkonstrukt eingefügt. Mit einem Durchlauf bis 200 
blinken meine LEDs aber nur unwesentlich langsamer.
Sobald ich den Durchlauf erhöhe, n also bis zu einem größeren Wert gehen 
lasse, werden plötzlich nicht mehr alle LEDs geschaltet. Schon ab einem 
Durchlauf bis n=799 leuchten nur noch die niedrigwertigsten 6 LEDs.

Aber wieso!? Ich hab mir darüber heute morgen in der Uni den Kopf 
zerbrochen, mein Betreuer wusste auch keinen Rat.

n und i hängen doch nicht zusammen, ich hab' echt keinen Plan.

Hat jemand hier im Forum vielleicht einen Tipp?
Wenn ich das nächste Mal in's Labor darf, würde ich mich gerne mit etwas 
anderem beschäftigen.
Habe ich in meinem Programm vielleicht irgendwas übersehen?

Könnte mir außerdem jemand sagen, wieso ich beim Kompilieren einen 
Fehler bekomme, wenn ich INTs innerhalb des Quelltextes deklariere, und 
nicht unmittelbar nach dem main()-Einsprungpunkt? Ist das einfach eine 
Schwäche des verwendeten Compilers (an der Uni benutzen wir die MSP IAR 
Embedded Workbench)?

Wenn jemand Rat wüsste oder mir Tipps geben könnte wäre das wirklich 
super.

Vielen Dank im Voraus und viele Grüße
Benni

Autor: Benni (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sorry, ich habe eine Sachen vergessen:

die sechs geschalteten LEDs stehen quasi immer noch, sie laufen nicht 
langsamer.

Autor: Christian R. (supachris)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
volatile int n; 
hilft. Sonst optimiert der Kompiler (zu Recht) die leere Schleife weg.

Autor: Simon K. (simon) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Benni wrote:
> Hallo Forum,
>
> hoffentlich bin ich hier richtig. Falls nein: sorry; vielleicht können
> die Mods meinen Thread ja verschieben. Einen passenden älteren Beitrag
> habe ich auch nicht finden können.

Tz...

> Forum: Codesammlung
> Wenn ihr eigene Programme oder Anleitungen geschrieben habt könnt ihr sie
> hier posten. Fragen werden gelöscht!

Autor: Benni (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Christian: vielen Dank! :-)

Simon: sorry, das habe ich übersehen. Beim nächsten Mal gelobe ich 
Besserung. Ehrenwort!

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.