• Domingo 22 de Diciembre de 2024, 08:00

Autor Tema:  Pic16f84 Servomotor Con Excepciones  (Leído 1201 veces)

jose1982mix

  • Nuevo Miembro
  • *
  • Mensajes: 1
    • Ver Perfil
Pic16f84 Servomotor Con Excepciones
« en: Miércoles 25 de Abril de 2007, 13:19 »
0
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

-------