Forum: Compiler & IDEs Problem mit for-Befehlen


von Adrian Degwert (Gast)


Lesenswert?

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();
}

von Dominic Thomé (Gast)


Lesenswert?

Standardanfägerproblem, mit Sichfunktion zu lösen :
Such mal nach volatile
Dominic

von Adrian Degwert (Gast)


Lesenswert?

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();
}

von tubbu (Gast)


Lesenswert?

probier doch mal
unsigned int
oder
unsigned long

von Adrian Degwert (Gast)


Lesenswert?

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

von ---- (Gast)


Lesenswert?

Achtung rekursiver Aufruf von fa() in fb() und umgekehrt führt zu
Stacküberlauf. Ob das dein eigentliches Problem ist - kA.

----, (QuadDash).

von Adrian Degwert (Gast)


Lesenswert?

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 :-(

von Christian Schifferle (Gast)


Lesenswert?

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

von Adrian Degwert (Gast)


Lesenswert?

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");}
}

von OldBug (Gast)


Lesenswert?

Hast Du den Port richtig initialisiert?

Gruß,
Patrick...

von Adrian Degwert (Gast)


Lesenswert?

Denke schon.... So wie es ganz oben im Code steht.

Gruss, Adrian

von --- --- (Gast)


Lesenswert?

port pin rücksetzen normalerweise

P2OUT &= ~0x01;

müsste oben immer anbleiben!

von Adrian Degwert (Gast)


Lesenswert?

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.

von Adrian Degwert (Gast)


Lesenswert?

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

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.