Forum: Mikrocontroller und Digitale Elektronik Anfängerfrage MSP430F149 - Schleife


von Tom (Gast)


Lesenswert?

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

von johnny.m (Gast)


Lesenswert?

Mal völlig Controllertyp-unabhängig: leere Schleifen werden meist vom
Compiler wegoptimiert. Genau das wird vermutlich bei Dir der Fall sein.

von gast (Gast)


Lesenswert?

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.

von Tom (Gast)


Lesenswert?

@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++){}

von Ralf (Gast)


Lesenswert?

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.

von johnny.m (Gast)


Lesenswert?

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.

von johnny.m (Gast)


Lesenswert?

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.

von R2D2 (Gast)


Lesenswert?

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?

von Florian (Gast)


Lesenswert?

Die Warteschleife die R2D2 meint ist hier zu finden. Funktioniert
wunderbar.
http://mspgcc.sourceforge.net/manual/c1408.html

von SupaChris (Gast)


Lesenswert?

Zählvariablen, die nicht wegoptimiert werde sollen, müssen im IAR
außerdem mit "volatile" deklariert werden. also z.b.
volatile unsigned int count;

von Thomas Dorn (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.