Voor mijn eindwerk (industrieel ingenieur) heb ik een robot gemaakt die een traject volgt, dat getekend wordt met behulp van de computermuis. Het programma waarin dit gebeurt, zendt bytes door naar de microcontroller, die beslist welke motor(en) moeten gestart worden, en hoelang. Ik heb de tijd gedurende de motoren moeten draaien steeds bepaald met behulp van timers. Ik heb nu echter encoders geïnstalleerd, en daarvoor moet ik dus het aantal 1-0 overgangen die de encoders genereren kunnen tellen en vergelijken met een bepaalde waarde in het register. Ik heb daarvoor de volgende subroutine geschreven. Het probleem is dat de motoren blijven draaien. Ik weet zeker dat de encoders naar behoren werken, en de subroutine zou in theorie ook moeten werken, maar ervaring leert me dat theorie en praktijk niet altijd overeenstemmen.
Ik vraag me dus af als er mensen zijn die een betere manier weten om een counter te vergelijken met een registerwaarde, en hem te doen stoppen als deze waarde bereikt is.
De subroutine is de volgende:
De waarde die moet bereikt worden zit eerst in de accu, en vervolgens wordt die ingelezen in het register R0. Deze waarde is dus nooit langer dan 8 bits, dus ze moet enkel vergeleken worden met de laagste byte van de 16-bit counter.
Tel_Links: clr C
mov TL0,#00h
mov TH0,#00h
mov R0,A
Tel_Verder_1: clr C
mov A,R0
subb A,TL0
JNZ Tel_Verder_1
ret
P.S. Sorry voor de nogal lange uitleg, maar ik moet het toch een beetje situeren hé. Als het topic in het verkeerde forum staat, gelieve het dan te verplaatsen.
Ik vraag me dus af als er mensen zijn die een betere manier weten om een counter te vergelijken met een registerwaarde, en hem te doen stoppen als deze waarde bereikt is.
De subroutine is de volgende:
De waarde die moet bereikt worden zit eerst in de accu, en vervolgens wordt die ingelezen in het register R0. Deze waarde is dus nooit langer dan 8 bits, dus ze moet enkel vergeleken worden met de laagste byte van de 16-bit counter.
Tel_Links: clr C
mov TL0,#00h
mov TH0,#00h
mov R0,A
Tel_Verder_1: clr C
mov A,R0
subb A,TL0
JNZ Tel_Verder_1
ret
P.S. Sorry voor de nogal lange uitleg, maar ik moet het toch een beetje situeren hé. Als het topic in het verkeerde forum staat, gelieve het dan te verplaatsen.