anfängliche Frage zur Verzögerung von 1ms

OP #2165304
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
Gast #2165315
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.
Gast #2165318
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
Gast #2165448
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!
OP #2166412
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

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