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(); }
Standardanfägerproblem, mit Sichfunktion zu lösen : Such mal nach volatile Dominic
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(); }
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
Achtung rekursiver Aufruf von fa() in fb() und umgekehrt führt zu Stacküberlauf. Ob das dein eigentliches Problem ist - kA. ----, (QuadDash).
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 :-(
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
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");} }
port pin rücksetzen normalerweise P2OUT &= ~0x01; müsste oben immer anbleiben!
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.