HCS12 wait schleife/funktion

Gast #436370
Lesenswert?

Hallo zusammen,

ich versuche mich gerade an der Progammierung eine HCs12. Ich wollte nun 
eine "Wait"-Funktion einfügen. Einfach eine For-Schleife die von einer 
bestimmten zahl runter zählt. Das Programm läuft, aber die Funktion wird 
anscheined nicht aufgerufen, also es wird quasi nicht gewartet. Hat 
jemand einen Tip, woran das liegen könnte?

Vielen Dank.

Gruß
Maik
Gast #436373
Lesenswert?

Hi,
wenns wirklich nicht wartet, hast du möglicher weise in deiner For 
-Schleife nichts drin stehen. Und der Optimizer deines compilers wirft 
dann diese scheinbar sinnlose schleife einfach raus.
Am besten du schreibst in die schleife etwas rein, wie z.B ein assembler 
"NOP". Dann wird das klappen.

Marc989
#436382
Lesenswert?

Ansonsten liegt der Fehler vielleicht in Zeile 12?!

Ohne Code wird das nicht viel. Ein entsprechender Codeauszug wäre nett. 
Vielleicht hast ja nen gedanklichen Fehler drin?

Schonmal kontrolliert, ob er überhaupt in die For Schleife reingeht? Z.B 
über UART senden, LED blinken lassen oder (im Idealfall) debuggen per 
Compiler und Breakpoint. Das geht doch recht easy mit dem HCS12, solang 
du diesen Programmer hast.
#436383
Lesenswert?

>      for(ii=1; ii < zahl; ii++)
>      {
>         for(ii=1; ii < zahl; ii++)
>          {
>           _asm("NOP");
>          }
>         _asm("NOP");
>       }

Wartet er gar nicht oder ist nur die Zeit zu kurz?
Die äussere for-Schleife bewirkt hier nämlich gar
nichts, weil ihre Endbedingung durch die innere
for Schleife mit ausgelöst wird.
-> 2 verschiedene Variablen benutzen.
#436384
Lesenswert?

Also zumindest di äußere For-Schleife kannst du dir schenken. Denn wenn 
er aus der inneren For Schleife raus geht, ist ii mit sicherheit schon 
größer als zahl.

Somit wird deine äußere Schleife genau 1x aufgerufen.

Btw: Wie groß ist "zahl" üblicherweise? Deine MCU läuft mit (laut 
mystischer Glaskugel) 16MHz. Da muss Zahl schon reichlich groß sein, 
dass du selber was mit warten bemerkst.
Gast #436387
Lesenswert?

Hi,

wenn du zwei mal ii als zähler nimmst, löscht die innerer schleife den 
wert der äußeren. Ich würde unterschiedliche variablen nehmen.
Des weitern wäre noch interessant welcher Wert in Zahl steht und wieviel 
bittig die variable ist. (8-bit, 16 bit...)

Marc989
#436407
Lesenswert?

Dann musst du in der Schleife irgendwas anderes machen, was
der Compiler nicht wegoptimieren kann. Eine Funktion aufrufen
bei der der Compiler den Funktionsrumpf nicht sieht und
daher nicht inlinen kann, ist zb. immer ein guter Kandidat:

static void wait_1( int time );
static void wait_2();

void wait( int time )
{
  int i;

  for( i = 0; i < time; ++i )
    wait_1( time );
}

void wait_1( int time )
{
  int i;
  for( i = 0; i < time; ++i )
    wait_2();
}

void wait_2()
{
  asm( "NOP" );
}
Gast #436420
Lesenswert?

bist du sicher das dein int 16 bit gross ist?
Ich programmiere oft mit 8Bit controllern und da ist das int eben nur 8 
bit gross, also nur (0...255).
dann könntest du so eine große zahl nicht reinladen. dann bliebe nicht 
mehr viel davon übrig.

Weiss nicht mehr ob der HC12 8Bit oder 16Bit controller ist.

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