mikrocontroller.net

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


Autor: Tom (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: johnny.m (Gast)
Datum:

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

Autor: gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Tom (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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++){}

Autor: Ralf (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: johnny.m (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: johnny.m (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: R2D2 (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Florian (Gast)
Datum:

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

Autor: SupaChris (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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;

Autor: Thomas Dorn (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.