Anfängerfrage MSP430F149 - Schleife

Gast #324138
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
Gast #324140
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.
Gast #324141
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++){}
Gast #324143
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.
Gast #324145
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?
Gast #324148
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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren