[C] 1ms delay?
[C] 1ms delay?
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.
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
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
-
- Inlägg: 515
- Blev medlem: 31 maj 2003, 10:42:37
- Ort: Helsingborg
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.
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.