[C] 1ms delay?

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
Andi04
Inlägg: 53
Blev medlem: 16 februari 2005, 17:42:04

[C] 1ms delay?

Inlägg av Andi04 »

Hur gör jag enklast en 1ms delay (så exakt som möjligt) i C utan att använda timer? Använder en 8MHz osc.
Användarvisningsbild
AndLi
Inlägg: 18273
Blev medlem: 11 februari 2004, 18:17:59
Ort: Knivsta
Kontakt:

Inlägg av AndLi »

gör en loop, lägg in en inline asm NOP i loopen som kompilatorn inte BORDE effiktirisera bort.

Loopa 100 ggr, mät med osciloskåpet hur lång tid det tar,
Loopa 200 ggr, mät med osciloskåpet hur lång tid det tar.

Räkna sen ut hur lång inittiden är och hur lång tid 1 varv tar. Ställ in loopen så att det blir så nära 1mS det går att få med den uträknade noggranheten.

Orkar man kan man också ta asm list filen och räkna fram hur lång tid en loop tar, men det tar garanterat längre tid än att köra trial and error.

Har du en frekvensräknare, kan ju ju alltid toggla en pinne mellan varje gång delayloopen är klar, och på så sätt få reda på längden. Delayen är korrekt när frekvensen är 500 Hz
henkebenke
Inlägg: 515
Blev medlem: 31 maj 2003, 10:42:37
Ort: Helsingborg

Inlägg av henkebenke »

Det beror på processor och kompilator. Skulle rekommendera en timer om det ska vara exakt. Annars skulle jag rekommendera att skriva en loop i assembler där du kan räkna antalet instruktioner. Eller så får du göra en liten loop i C och kolla på output hur många instruktioner den blev. Sen får du ta en kik i databladet och kolla hur många klockcykler varje instruktion tar.
frejo
Inlägg: 496
Blev medlem: 21 april 2004, 21:43:01
Ort: Linköping

Inlägg av frejo »

Beror på uC också, i en avr kan du ju aktivera timern och sätta divider på klocksignalen och ställa in värdet den ska räkna till så det blir ett interrupt efter 1ms.
Användarvisningsbild
cykze
EF Sponsor
Inlägg: 1539
Blev medlem: 8 april 2004, 10:40:28
Ort: Uppsala

Inlägg av cykze »

Ska du ha det så exakt som möjligt, utan timers, så är assembler det enda rätta. När det gäller att räkna på C-kod så vet man ju aldrig hur kompilatorn optimerar från en gång till en annan. Assemblerkoden kan du ju slänga in direkt i C-kodfilen. Glöm inte att inaktivera interrupts och liknande under tiden bara.
Skriv svar