Problem mit for-Befehlen

Gast #76999
Hallo,

ich bin total neu bei den Mikroprozessoren und habe bisher nur Delphi
programmiert. Mit Elektronik kenne ich mich allerdings recht gut aus.
Ich wollte zunaechst so anfangen, dass ich einen Port z.B. im
1-Sek.-Takt dazu bringe, zu blinken. Leider scheitert dies an der
Wartefunktion, die ich aus einem Beispiel uebernommen habe.

Dort wird einfach i von 0 bis 32000 hochgezaehlt - theoretisch. Beim
Simulieren klappts auch aber wenn ich dann den MSP anschliesse macht er
das fuer i > 100 so schnell, dass ich es nicht messen kann und bei 1 >
1000 gar nicht mehr. Am Port bleiben 3,0V.
Ich habe das sowohl mit MSP430123_2 als auch MSP430F149 probiert. Ich
verwende erstmal die Kickstart Umgebung von TI da ich den parallel-JTAG
habe der soweit ich weiss nicht mit MSPGCC funktioniert.

Hier mein Code:

#include "msp430x14x.h"


void fa (void);
void fb (void);

void main(void){
//vClockInit();
P2OUT   = 0xFF;               /* LEDs */
     P2DIR   = 0xFF;
     P2IES   = 0x00;
     P2IE    = 0x00;
     P2SEL   = 0x00;
fa();}

void fa (void){
int i, a;

for (a=0; a<10; a++){
i = 0;
for (i=0; i<100; i++);}

P2OUT |= 0x01;
fb();

}

void fb (void){
int i, a;

for (a=0; a<10; a++){
i = 0;
for (i=0; i<100; i++);}
P2OUT &= ~0x01;
fa();
}
Gast #77001
Also wenn ich das richtig verstanden habe dann sollte ich i als volatile
int deklarieren? Geht aber auch nicht.... mit 1000 gings noch aber bei
10000 bleibt er einfach in der Schleife haengen, weiss nicht ob er die
dauernd ausfuehrt oder oder gar nicht (am Port liegen halt 3V).

void fb (void){
volatile int a;

for (a=0; a<10000; a++);

P2OUT &= ~0x01;
fa();
}
Gast #77003
hab ich schon - aber der definitionsbereich von int reicht ja schon
ueber 32000! das aendert nichts.
bin ich so dumm dass ich so eine uebung nicht hinbring oder was ist da
los?!?

adrian
Gast #77005
nee das war ja nur eine verzweiflungstat weils so auch nicht lief. aber
im simulationsmodus gehts ja perfekt?!? nur mit dem echten chip halt
nich :-(
Gast #77006
Ich denke mal, dass der Compiler die for-Schleife komplett wegoptimiert,
da sie keine Anweisungen enthält.
Versuch's mal so:

volatile int i
for (i=0; i<10000; ) i++;

Gruss
Christian
Gast #77007
Ich habe die Sache noch etwas verdeutlicht mit printf - mit i<1500
bekomme ich die Ausgaben "on" und "off", bei i<3000 nicht mehr?!

Irgendwie bleibt er wohl in der for-Schleife haengen.... Ich habe den
MSP430F149 nur an den JTAG angeschlossen, davon bekommt er auch die
Stromversorgung und ansonsten haengt er woertlich in der Luft (da fehlt
doch nicht etwa etwas?).

Nein, was mich total stutzig macht, ist, dass es bis ca. i<1500
funktioniert.... Ich beginne an der Logik des Programmierens zu
zweifeln!

Hier der deutlichere Code:

void onOff (void){
volatile int i;

while(1){
 for (i=0;i<3000; ) i++;

 P2OUT |= 0x01;
 printf("on");

 for (i=0; i<3000; ) i++;

 P2OUT &= 0x01;
 printf("off");}
}
Gast #77011
Habe ich aus einem Beispiel der Zeitschrift c't und wenn ich mit printf
verzögere, klappt das auch. Glaube nicht, dass es daran liegt....

Danke trotzdem.
Gast #77012
Oh, habs erkannt... da fehlt ein ~ da hab ich mich bei den vielen
Versuchen halt ein Mal vertippt ;-)
Warum bitte funktioniert das bis zu einem bestimmten i Wert und dann
nicht mehr?!?

Gruesse, Adrian

Antwort schreiben

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