Tanken är att servoaxeln ska vridas "ett steg" (så litet som möjligt) varje gång man trycker på en knapp. Trycker man inte så står servoaxeln stilla. Håller man in knappen så vrids servoaxeln sakta tills det når något av ändlägena. (Det ska finnas två knappar, en för att styra medsols och en för motsols.)
Tidigare har jag gjort detta med delayloopar i MikroBasic, men nu vill jag göra det i assembler och timer.
Problemet är att jag inte kommer på hur.
Med prescalern kan man ju ändra hur fort man får Timer-interrupt, men varje prescaler 1:2 , 1:4 , 1:8 osv gör ju att tiden fördubblas. Jag vill att servoaxeln ska vridas lika mycket vid varje knapptryckning.
Så hur gör man? Eller är timern fel "verktyg" för detta?
Om så är fallet så undrar jag hur man gör det med t.ex delayloopar. I MikroBasic var det så smidigt eftersom man bara behövde skriva vdelay_ms(variabeln) och så kunde man enkelt ändra tiden. Men hur gör man för att enkelt ändra tiden för delayloopar i assembler?
Med delayloopar menar jag t.ex:
delay_10ms
movlw 0x14
movwf CNT4
movlw 0x0D
movwf CNT5
movlw 0x08
movwf CNT6
dly10ms_loop
decfsz CNT5
goto dly10ms_loop
movlw 0x02
movwf CNT5
decfsz CNT4
goto dly10ms_loop
decfsz CNT6
goto dly10ms_loop
nop
return
Koden ska alltså enbart styra servot efter vad man tryckt på någon av fyra knappar:
Knapp 1: Motsols
Knapp 2: Medsols
Knapp 3: Först motsols 90 grader och sedan medsols 90 grader.
Knapp 4: Sätter ett "stopp" vid aktuell position så att servoaxeln inte kan vridas motsols förbi den aktuella positionen.
Först hade jag tänkt använda Interrupt-on-change för att registrera knapptryckningar, men det blir ju problem om man håller inne knappen, vilket man ska kunna göra för att servoaxeln ska kunna vridas sakta åt något håll utan att man ska behöva trycka upprepade gånger.
Servot ska kunna vridas 90 grader på ungefär fyra sekunder. (Det är ok om det tar mellan 2 - 5 sekunder.)
Tror att jag fick med allt där.
