Hallo, Ich versuche an einem MSP430F149 (ohne Zusatzquarz) den Port 1 aus/ einzuschalten. Dies funktioniert, jedoch das zeitliche Verzögern über eine FOR Schleife funktioniert nicht. #include "msp430x14x.h" #include "msp430def.h" int main(void){ unsigned long i; WDTCTL = WDTPW + WDTHOLD; // watchdog aus P1DIR=0xFF; // port 1 = output P1SEL=0x00; // normale I/O P1OUT=0x00; // initial aus for(i=0;i==1000000000;i++);//Verzögerungsschleife P1OUT=0xFF; //Port1 an return 0;} Warum schaltet der MC sofort den Port1 ein? (For Schleife wirkt sich nicht als verzögerung aus) Gruß Tom
Mal völlig Controllertyp-unabhängig: leere Schleifen werden meist vom Compiler wegoptimiert. Genau das wird vermutlich bei Dir der Fall sein.
Wenn ich mich nicht irre wird der Port bereits beim ersten Durchgang der Schlaufe eingeschaltet. Damit die Verzögerungsschlaufe funktioniert musst du den Port ausserhalb und nach der Schlaufe einschalten.
@Jonny Ich habe die for Schleife gefüllt und es hat sich nichts geändert: for(i=0;i==1000000000;i++){i=i+1;}//Verzögerungsschleife @ gast ich habe es auch schon mit leerer Schleife versucht - ohne Erfolg: for(i=0;i==1000000000;i++){}
probiers mal mit for(i=0;i<=1000000000;i++); die Schleife wird ausgeführt solange die bedingung erfüllt ist. mit i==1000 wird die kein einzuiges mal ausgeführt.
Gibt es die Möglichkeit, dass Du Dir den compilierten Code anschauen kannst (List-File)? Kenne mich mit MSP430 nicht aus. Wenn ja, dann schau doch bitte mal nach, was der Compiler daraus macht. Ansonsten definier Dir noch eine Hilfsvariable, die Du in der Schleife hochzählst, damit Du nicht auf die Schleifenzählvariable i zurückgreifen musst. Wenn es die Möglichkeit gibt, inline-Assembler zu verwenden, dann schreib probeweise mal einen NOP-Befehl (Weiß jetzt nicht, ob der bei MSP430 auch so heißt... Jedenfalls einen 'Mach gar nichts'-Befehl) in die for-Schleife. @Gast: Nein, in der ersten Version steht hinter der for-Anweisung ein Semikolon. Wenn die Schleife überhaupt angesprungen wird, dann wird P1OUT=0xFF erst nach Durchlaufen der kompletten Schleife ausgeführt.
Shit, Überschneidung. Ralf hat natürlich völlig recht. Hatte ich gar nicht drauf geachtet. Die Bedingung für den Schleifendurchlauf ist bei Dir natürlich nie erfüllt.
Du hast 2. Fehler. 1. Das bereits erwähnte == statt den <. Einfach ersetzen. 2. Das fehlende NOP. Die Schleife müsste für msp-gcc dann so aussehen: for(i=0;i<1000000000;i++) nop(); Alternativ kannst du i als volatile deklarieren. Das Problem ist, dass du mit so einer Funktion nie eine genaue Zeit warten kannst. Wenn du pech hast optimiert der Compiler es mal so und mal so. Schreib die Funktion lieber gleich in asm. Ich glaub bei den Beispielen zum gcc war sogar eine dabei. Wenn es jetzt dann läuft musst du aber gute Nerven haben: Du wartest 1000000000:800kHz=1250s=20.8Minuten! Vorrausgesetzt man geht von optimalem Code aus, der nur einen Zyklus für die Schleife brauchen würde. Du brauchst aber so zwischen 3 und 5(grob geschätzt) und dann bis du gleich mal im Stundenbereich. Wähl lieber etwas kleinere Zahlen. Noch ein Hinweis: Bei Mikrocontrollern is es meistens nicht gewünscht die Main zu verlassen. Weil wo willst du dann hin? Zurück zum Betriebssystem?
Die Warteschleife die R2D2 meint ist hier zu finden. Funktioniert wunderbar. http://mspgcc.sourceforge.net/manual/c1408.html
Zählvariablen, die nicht wegoptimiert werde sollen, müssen im IAR außerdem mit "volatile" deklariert werden. also z.b. volatile unsigned int count;
Hallo, hab wegen eigenem Problem mal reingekuckt. Hab da noch eine Anmerkung: Der MSP hat 16 Bit für Variablen zur Verfügung, d.h. 0xFFFF = 65535 und wenn Du 1000000000 (=0x3B9ACA00)als Zahl verwenden wolltest, bräuchtest Du 32Bits ...log2(0x3B9ACA00) -> 32Bits ...bis 0xFFFFFFFF( =4294967295) mfg Thomas D
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.