mikrocontroller.net

Forum: Compiler & IDEs Problem mit for-Befehlen


Autor: Adrian Degwert (Gast)
Datum:

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

Autor: Dominic Thomé (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Standardanfägerproblem, mit Sichfunktion zu lösen :
Such mal nach volatile
Dominic

Autor: Adrian Degwert (Gast)
Datum:

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

Autor: tubbu (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
probier doch mal
unsigned int
oder
unsigned long

Autor: Adrian Degwert (Gast)
Datum:

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

Autor: ---- (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Achtung rekursiver Aufruf von fa() in fb() und umgekehrt führt zu
Stacküberlauf. Ob das dein eigentliches Problem ist - kA.

----, (QuadDash).

Autor: Adrian Degwert (Gast)
Datum:

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

Autor: Christian Schifferle (Gast)
Datum:

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

Autor: Adrian Degwert (Gast)
Datum:

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

Autor: OldBug (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hast Du den Port richtig initialisiert?

Gruß,
Patrick...

Autor: Adrian Degwert (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Denke schon.... So wie es ganz oben im Code steht.

Gruss, Adrian

Autor: --- --- (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
port pin rücksetzen normalerweise

P2OUT &= ~0x01;

müsste oben immer anbleiben!

Autor: Adrian Degwert (Gast)
Datum:

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

Autor: Adrian Degwert (Gast)
Datum:

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

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.