hola necesito diseñar un programa q me permita con PWM mantener un servomotor fijo a -90º. Como la forma de llevar la cuenta del tiempo tiene q ser mediante la excepcion tmr0...
mi problema es q una vez en la ejecucion, cuando yega a la subrutina fin en teoria el retfie deveria devolver el flujo al punto d donde salta la excepcion, es decir en el nop, sin embargo salta al principio dl vector d interrucion, alguien sabe xq?
-----------------------------------------------------------------------------------
datos equ 0x00 ; bloque de datos de este modulo
IO_var equ 0x20 ; bloque de datos del modulo de IO
STATUS EQU 03H
INTCON EQU 0BH
PORTB equ 06 ; puerta B (teclado)
RP0 equ 05h ; Bit 5 registro STATUS
Timer0_ContadorA equ 0x10
#DEFINE salida PORTA,2 ; Línea del Puerto B donde se conecta el servomotor.
CBLOCK
Guarda_W
Guarda_STATUS
; Contador auxiliar.
ENDC
org 0x0 ;vector de reset
goto inicio
org 0x04 ;vector de interrupcion
movwf Guarda_W ; Guarda los valores de tenían W y STATUS en el
swapf STATUS,W ; programa principal.
movwf Guarda_STATUS
;aki salta 1 y piko ciclos tmr0
decf Timer0_ContadorA,f ; Decrementa el contador.
btfss STATUS, Z
goto Fin
retfie
btfsc salida ; Testea el anterior estado de la salida.
goto CrestaCerrado
btfss salida
goto ValleCerrado
retfie
include <inout1.inc>
inicio: bcf INTCON,2 ;bit que indica desbordamiento de TMR0, hay que ponerlo a "0" por programa
bsf STATUS,RP0; pone el banco 1 para configurar la entrada salida
bcf TRISB,2 ; Esta línea se configura como salida.SE PONE A 0
movlw b'00001000' ; TMR0 sin prescaler.
movwf OPTION_REG
bcf STATUS,RP0 ;nos volvemos a poner en el banco 0
bsf salida ;LO PONEMOS EN ALTO XA EMPEZAR LA ONDA DESDE ARRIBA
bsf INTCON,GIE ;PONEMOS A 1 ESTOS BITS D INTCON
BSF INTCON, T0IE ;PONEMOS A 1 ESTOS BITS D INTCON
movlw 5 ;INICIALIZAMOS EL CONTADOR AL PRINCIPIO DE LA ONDA
movwf Timer0_ContadorA
nop ;ESPERAMOS A LA INTERRUPCION
goto $-1
ValleCerrado
bsf salida ; Estaba bajo y lo pasa a alto.
movf 5,W ; Repone el contador nuevamente con el tiempo en
movwf Timer0_ContadorA ; alto.
goto Fin
CrestaCerrado
bcf salida ; Estaba alto y lo pasa a bajo.
movf 71,W ; Repone el contador nuevamente con el tiempo
movwf Timer0_ContadorA
goto Fin
Fin
swapf Guarda_STATUS,W ; Restaura registros W y STATUS.
movwf STATUS
swapf Guarda_W,F
swapf Guarda_W,W
retfie
;salta al principio d la rsi
end
-------