Autor Tema: LCD en PORTB deja de funcionar con TIMER0  (Leído 1892 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado novara07

  • PIC10
  • *
  • Mensajes: 1
LCD en PORTB deja de funcionar con TIMER0
« en: 19 de Junio de 2005, 09:39:00 »
Hola.
Tengo un pequeño problemilla quando añado el TIMER0 a mi codigo. Estoy trabajando con una pic16f877 y tengo un lcd que funciona correctamente hasta que pongo la interrupcion del TIMER0, en este momento el lcd me saca el numero de caracteres correcto pero no los que yo quiero, siempre pone =======.
Alguien sabe porque me pasa eso??? es un problema de programacion de INTCON, STATUS_REG,... y todos esos?? GIE lo tengo a "1" y PEIE a "0".
Si alguien me puede ayudar le estare muy agradecida.
Gracias. Giño

Desconectado antoniof

  • Moderadores
  • PIC24F
  • *****
  • Mensajes: 729
RE: LCD en PORTB deja de funcionar con TIMER0
« Respuesta #1 en: 19 de Junio de 2005, 15:49:00 »
Bueno, pues cuando se añade al guna interru`ción en un PIC es muy recomendable salvar los registros "w", "status" y "pclath" antes de hacer nada en el vector de interrupción, porque puede ser que la interrupción salte cuando estes enviando información al lcd, y esta información cambie en la rutina de interrucpión. Aqui te paso el código necesario para salvar/restaurar estos registros cada vez que se atiende a una interrucpión:

Codigo:
   org   0x04      ;Vector de interrupción
   
   movwf   w_temp      ;Copy W to TEMP register
   swapf   status,w   ;Swap status to be saved into W
   clrf   status      ;bank 0, regardless of current bank, Clears IRP,RP1,RP0
   movwf   status_temp   ;Save status to bank zero STATUS_TEMP register
   movf   pclath,w   ;Only required if using pages 1, 2 and/or 3
   movwf   pclath_temp   ;Save PCLATH into W
   clrf   pclath      ;Page zero, regardless of current page
   goto   interr      ;Salta a la rutina de interrupción

interr

;*****
;Aqui la rutina de interrupción (no olvides borrar los flags de interrupción antes de salir)
;*****

   movf   pclath_temp,w   ;Restore PCLATH
   movwf   pclath      ;Move W into PCLATH
   swapf   status_temp,w   ;Swap STATUS_TEMP register into W (sets bank to original state)
   movwf   status      ;Move W into STATUS register
   swapf   w_temp,f   ;Swap W_TEMP
   swapf   w_temp,w   ;Swap W_TEMP into W
   retfie         ;Fin de interrupción


Si con esto sigue sin funcionar, peganos el código aqui para que podamos ver lo que falla.


 

anything