Forum: Mikrocontroller und Digitale Elektronik anfängliche Frage zur Verzögerung von 1ms


von Owen S. (senmeis)


Lesenswert?

Servus,

ich versuche mit einem Infineon XC164CM (40MHz, 1/Takfrequenz sind 25ns) 
Easy Kit eine Verzögerung von 1ms mit folgendem Code zu erzeugen.
1
#define COUNTER_1MS 2700UL // muss noch so verändert werden, dass 1ms herauskommt
2
3
  
4
 void delay(uword ms)
5
{
6
  uword count_ms;        
7
   ulong counter;     
8
 
9
   for(count_ms=0 ; count_ms<ms ; count_ms++)
10
 for(counter=0 ; counter<COUNTER_1MS ; counter++);   // Schleife für einzelne Millisekunden
11
}
Die Frage ist, wie errechne ich den Wert COUNTER_1MS (hier 2700UL). Muss 
man den Assembler anzeigen lassen und die Zyklen nach dem Befehlssatz 
addieren? Oder gibt’s noch einfachere Wege?

Danke
Owen

von 2ter Gast (Gast)


Lesenswert?

1) Ja, du benötigst das Assemblerlisting. Idealerweise schreibst du so 
eine delay Funktion in Assembler, denn nur so kennst du dann korrekte 
Anzahl an Taktzyklen.

2) Oft gibt es schon Funktionen wie delay_cycles, delay oder so ähnlich. 
Bei deinem chip weis ich es aber nicht.

3) Wenn der Chip einen Hardware Timer hat, könntest du auch diesen zur 
Verzögerung benutzen.

von Olaf (Gast)


Lesenswert?

> Die Frage ist, wie errechne ich den Wert COUNTER_1MS (hier 2700UL).
> Muss man den Assembler anzeigen lassen und die Zyklen nach dem
> Befehlssatz addieren?

Das ist die einzige Moeglichkeit, aber selbst diese ist totaler Murks 
weil dann die Zeit immer noch davon abhaengt ob dein Programm im 
Hintergrund mal einen IRQ ausfuehrt oder wie die Compilerswitches so 
stehen.

> Oder gibt’s noch einfachere Wege?

Es gibt einen richtigen Weg. Du verwendest dazu einen Timer und schaffst 
dir damit eine Zeitbasis. Entweder indem du direkt den Inhalt des 
Zaehlregister bewertest, oder noch klueger einen Interrupt generieren 
laesst wenn deine eingestellte Wunschzeit abgelaufen ist.

Olaf

von Matthias L. (Gast)


Lesenswert?

>Entweder indem du direkt den Inhalt des Zaehlregister bewertest, oder noch 
>klueger einen Interrupt generieren laesst wenn deine eingestellte >Wunschzeit 
abgelaufen ist.

Du hast das "entweder" und das "noch klüger" vertauscht!

von Owen S. (senmeis)


Lesenswert?

Wie wär's mit folgendem Code mit einem Timer?
1
unsigned char timer_ticks = 0;
2
3
void delay_ms(unsigned char number_of_ms)
4
{
5
  timer_ticks = 0;  // Zähler zurücksetzen
6
while(timer_ticks != number_of_ms);  // wiederholen, bis gewünschte Zeit abgelaufen ist
7
}
8
9
ISR()
10
{
11
  timer_ticks++;
12
}
Owen

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.