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


von Benni (Gast)


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:
1
#include <msp430x16x.h>
2
3
int main(){
4
  int n, i = 0;
5
  P3DIR = 0xFF;
6
  P3SEL = 0x00;
7
8
  // Endlosschleife
9
  while(1) {
10
    if (i == 0) {
11
      // LEDs alle ausmachen.
12
      P3OUT = i;
13
      i += 1;
14
      continue;
15
    }
16
    // LEDs auf 1, 2, 4, 8, .... setzen.
17
    P3OUT = i;
18
    i *= 2;
19
    // Wenn die hochwertigste LED geschaltet wurde: von vorne (ab 0).
20
    i %= 255;
21
    for (n = 0; n < 200; n++) {;} // <- !!!!
22
  }
23
  return 0;
24
}

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

von Benni (Gast)


Lesenswert?

Sorry, ich habe eine Sachen vergessen:

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

von Christian R. (supachris)


Lesenswert?

1
volatile int n;
hilft. Sonst optimiert der Kompiler (zu Recht) die leere Schleife weg.

von Simon K. (simon) Benutzerseite


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!

von Benni (Gast)


Lesenswert?

Christian: vielen Dank! :-)

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

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.