Estoy intentando controlar un servomotor con attiny45 escribiendo el código en el ensamblador. Descubrí cómo configurar el temporizador en modo pwm y cómo elegir un preescalador necesario. Y con diferentes valores OCR0A estoy obteniendo la posición neutral y 0 grados. Sin embargo, me he encontrado con un problema con 180 grados. Cuando mantengo la configuración del temporizador igual y no configuro el OCR0A, el servo pasa fácilmente a 180 grados. Pero cuando cambio el OCR0A para obtener un impulso diferente y diferentes posiciones del motor y para intentar volver al valor predeterminado de OCR0A, nada funciona. Por lo tanto, el código:
Esto pone mi motor en posición de 180 grados
.includepath "/usr/share/avra/"
.device ATtiny45
.DEF A=R16
.equ DDRB = 0x17
.equ PORTB = 0x18
.equ TCCR0A = 0x2A
.equ TCCR0B = 0x33
.equ OCR0A = 0x29
.ORG $0000
SBI DDRB, 0x3
SBI PORTB, 0x3
ON_RESET:
SBI DDRB, 0
LDI A, 0b10000011
OUT TCCR0A, A
LDI A, 0b00000011
OUT TCCR0B,A
MAIN_LOOP:
RJMP MAIN_LOOP
Esto no (espero que sea fácil de entender lo que estoy tratando de hacer aquí)
.includepath "/usr/share/avra/"
.device ATtiny45
.DEF A=R16
.equ DDRB = 0x17
.equ PORTB = 0x18
.equ TCCR0A = 0x2A
.equ TCCR0B = 0x33
.equ OCR0A = 0x29
.ORG $0000
SBI DDRB, 0x3
SBI PORTB, 0x3
ON_RESET:
SBI DDRB, 0
LDI A, 0b10000011
OUT TCCR0A, A
LDI A, 0b00000011
OUT TCCR0B,A
MAIN_LOOP:
LDI A, 0xFF
OUT OCR0A, A
RCALL DELAY_05
RCALL DELAY_05
RCALL DELAY_05
RCALL DELAY_05
LDI A, 192
OUT OCR0A, A
RCALL DELAY_05
RCALL DELAY_05
RCALL DELAY_05
RCALL DELAY_05
LDI A, 40
OUT OCR0A, A
RCALL DELAY_05
RCALL DELAY_05
RCALL DELAY_05
RCALL DELAY_05
RJMP MAIN_LOOP
DELAY_05:
LDI R17,8
OUTER_LOOP:
LDI R24, low(3037)
LDI R25, high(3037)
DELAY_LOOP:
ADIW R24,1
BRNE DELAY_LOOP
DEC R17
BRNE OUTER_LOOP
RET
Sí, no sé cómo escribir un segundo. función de retardo.
Entonces, ¿hay una manera de "restablecer" el registro OCR0A?