Autor Tema: Problema con TMR0 a 1 Segundo  (Leído 2558 veces)

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

Desconectado Goodfrey

  • PIC12
  • **
  • Mensajes: 87
Problema con TMR0 a 1 Segundo
« en: 20 de Octubre de 2011, 16:18:27 »
Muy buenas tardes, nuevamente estoy aquí esperando que puedan ayudarme a resolver el problema que tengo...

El programa debería hacer lo siguiente:

Cuando pulso el botón el tiene que activar el tmr0 el mismo tiene un prescaler de 256, el mismo tiene una temporización de 10 ms, al desbordarse hay un conteo que cuando 100 equivale a 1 segundo...

Cuando es presionado el botón el mismo arranca a leer datos del adc y la lectura de esos datos son convertidos en BCD y luego enviados por USART, cuando el conteo de tmr0 llega a 100 el mismo tiene que dejar de contar y empezar de nuevo, es decir esperar que sea pulsado el botón para poder empezar el proceso de nuevo...

ahora el problema que tengo es que lo hace la primera vez, pero cuando se interrumpe el mismo las variables que están dentro de la interrupción no hacen nada... es decir en proteus no muestra un incremento de la variables ni nada...

También cuando se sale de la interrupción la misma queda siempre en la rutina de envio de datos y no sale de hay... y de verdad he revisado el codigo varias veces y no le encuentro la falla...

por favor espero entiendan mi codigo y puedan ayudarme a encontrar dicho problema por favor.... aqui esta el mismo....

Código: [Seleccionar]
LIST P=16F877A
#include <P16F877A.INC>


;////////////////////////////////////////////////////////////////////////
; BANCOS DE VARIAGLES
;///////////////////////////////////////////////////////////////////////

BUT EQU 0x20
CONT EQU 0x21
TER EQU 0x22
UNIDAD EQU 0x23
DECENA EQU 0x24
CENTENA EQU 0x25
LECTU1 EQU 0x26
LECTU2 EQU 0x27
DATO EQU 0x28
REG EQU 0x29
REG1 EQU 0x30
REG2 EQU 0x31
W_TEMP EQU 0x32
S_TEMP EQU 0x33

;////////////////////////////////////////////////////////////////////////
; VECTOR DE INICIO
;///////////////////////////////////////////////////////////////////////

ORG 0x00
CALL CONF
CALL TRANS
CALL ADC_C
GOTO INICIO


;////////////////////////////////////////////////////////////////////////
; INTERRUPCION
;///////////////////////////////////////////////////////////////////////
 
ORG 0x04
MOVWF   W_TEMP ; save off current W register contents
MOVF STATUS,W ; move status register into W register
MOVWF S_TEMP ; save off contents of STATUS register
GOTO SERVICIO

SERVICIO
BCF INTCON,GIE
BTFSS INTCON,T0IF
GOTO SALIR
INCF CONT,F
MOVF CONT,W
XORLW .100
BTFSS STATUS,Z
GOTO SALIR
INCF TER,F
BCF INTCON,T0IE
GOTO SALIR2
SALIR
BCF INTCON,T0IF
BSF INTCON,GIE
MOVLW .217
MOVWF TMR0
MOVF S_TEMP,W ; retrieve copy of STATUS register
MOVWF STATUS ; restore pre-isr STATUS register contents
SWAPF   W_TEMP,F
SWAPF   W_TEMP,W ; restore pre-isr W register contents
RETFIE
SALIR2
MOVLW "@"
CALL ENVIA
CLRF BUT
CLRF CONT
BCF INTCON,T0IF
BSF INTCON,GIE
MOVF S_TEMP,W ; retrieve copy of STATUS register
MOVWF STATUS ; restore pre-isr STATUS register contents
SWAPF   W_TEMP,F
SWAPF   W_TEMP,W ; restore pre-isr W register contents
RETFIE

;////////////////////////////////////////////////////////////////////////
; PUERTOS
;///////////////////////////////////////////////////////////////////////


CONF BSF STATUS,RP0
BCF STATUS,RP1
MOVLW B'00000011'
MOVWF TRISA
CLRF TRISB
MOVLW B'10000000'
MOVWF TRISC
CLRF TRISD
CLRF TRISE
BCF STATUS,RP0
BCF STATUS,RP1
MOVLW B'10000000'
MOVWF PORTC
CLRF PORTB
CLRF PORTE
RETURN

;////////////////////////////////////////////////////////////////////////
; CONFIGURACION DEL ADC
;///////////////////////////////////////////////////////////////////////

ADC_C
BSF STATUS,RP0
BCF STATUS,RP1
MOVLW B'10001110'
MOVWF ADCON1
BSF TRISA,0 ; configura como entrada el canal digital RA0
BCF STATUS,RP0
BCF STATUS,RP1
MOVLW B'01000001' ; Selecciona el canal AN0, reloj de conversión Fosc/2
MOVWF ADCON0 ; y enciende el convertidor
CALL PAUSA
RETURN

;////////////////////////////////////////////////////////////////////////
; CONFIGURACION USART
;///////////////////////////////////////////////////////////////////////

TRANS
BSF STATUS,RP0 ; BANCO 1
BCF TXSTA,BRGH ; BRGH = 1 ( VELOCIDAD BAJA )
MOVLW .25 ; 2400 BAUDS ( 4 Mhz )
MOVWF SPBRG ; CONFIGURACION A 2400 BAUDIOS
BCF TXSTA,SYNC ; SYNC = 0 ( MODO ASINCRONO )
BSF TXSTA,TXEN ; TXEN = 1 ( HABILITA LA TRANSMISION)
BCF STATUS,RP0 ; BANCO 0
BSF RCSTA,SPEN ; SPEN = 1 ( HABILITA PUERTO SERIE )
BSF RCSTA,CREN ; HABILITA RECEPCION
RETURN

;////////////////////////////////////////////////////////////////////////
; INICIO DEL PROGRAMA
;///////////////////////////////////////////////////////////////////////


INICIO
BTFSS PORTB,1
GOTO $-1
BTFSC PORTB,1
GOTO $-1
CALL INICIA
; INCF BUT,F
; MOVF BUT,W
; XORLW .2
; BTFSS STATUS,Z
; GOTO $+2
; GOTO SIGUE
MOVLW .217
MOVWF TMR0
T1 CALL ADC1
MOVF LECTU1,W
CALL BINBCD
CALL SEND
MOVF LECTU2,W
CALL BINBCD
CALL SEND
MOVF TER,W
XORLW .1
BTFSS STATUS,Z
GOTO T1
CLRF TER
CLRF CONT
GOTO INICIO

INICIA
BSF STATUS,RP0
BCF STATUS,RP1
MOVLW B'00000111'
MOVWF OPTION_REG
BCF STATUS,RP0
BCF STATUS,RP1
MOVLW B'10100000'
MOVWF INTCON
RETURN

SIGUE GOTO INICIO

;////////////////////////////////////////////////////////////////////////
; LECTURA ADC
;///////////////////////////////////////////////////////////////////////

ADC1
BSF ADCON0,GO ; INICIO CONVERSION
BTFSC ADCON0,GO         ; ESPERO SI TERMINO
GOTO $-1
CALL PAUSA
MOVF ADRESH,W ; MUEVO LO QUE TIENE ADRESL A W
MOVWF LECTU2
BSF STATUS,RP0
BCF STATUS,RP1
MOVF ADRESL,W ; MUEVO LO QUE TIENE ADRESL A W ; LA CONVERSION
BCF STATUS,RP0
BCF STATUS,RP1
MOVWF LECTU1
RETURN

;////////////////////////////////////////////////////////////////////////
; ENVIO DE DATOS POR SERIAL
;///////////////////////////////////////////////////////////////////////

ENVIA
MOVWF DATO
BSF STATUS,RP0 ; BANCO 1
BTFSS TXSTA,TRMT ; CHQUEA EL BUFFER DE TRANSMISION
GOTO $-1 ; ESTA OCUPADO
BCF STATUS,RP0 ; BANCO 0
MOVF DATO,W ; RESCATA DATO A ENVIAR
MOVWF TXREG ; LO ENVIA
RETURN

SEND
MOVF CENTENA,W
CALL ENVIA
MOVF DECENA,W
CALL ENVIA
MOVF UNIDAD,W
CALL ENVIA
RETURN

;////////////////////////////////////////////////////////////////////////
; BINARIO A BCD
;///////////////////////////////////////////////////////////////////////

BINBCD
MOVWF UNIDAD
CLRF DECENA
CLRF CENTENA
RESTA10
MOVLW .10
SUBWF UNIDAD,W
BTFSS STATUS,C
GOTO BCD_FIN
INC_DEC
MOVWF UNIDAD
INCF DECENA,F
MOVLW .10
SUBWF DECENA,W
BTFSS STATUS,C
GOTO RESTA10
INC_CEN
CLRF DECENA
INCF CENTENA,F
GOTO RESTA10
BCD_FIN
SWAPF DECENA,W
ADDWF UNIDAD,W
MOVLW 30H
ADDWF UNIDAD,F
MOVLW 30H
ADDWF DECENA,F
MOVLW 30H
ADDWF CENTENA,F
RETURN

;////////////////////////////////////////////////////////////////////////
; RETARDOS
;///////////////////////////////////////////////////////////////////////

PAUSA
MOVLW .9 ; Carga dato para 30 µseg.
MOVWF REG
DECFSZ REG,1
GOTO $-1
RETURN

RET1S
MOVLW .100
MOVWF REG2
LP1 MOVLW .97
MOVWF REG1
LP2 MOVLW .33
MOVWF REG
DECFSZ REG,1
GOTO $-1
DECFSZ REG1,1
GOTO LP2
DECFSZ REG2,1
GOTO LP1
RETURN

;////////////////////////////////////////////////////////////////////////
; FIN DE PROGRAMA
;///////////////////////////////////////////////////////////////////////

END



Desconectado Goodfrey

  • PIC12
  • **
  • Mensajes: 87
Re: Problema con TMR0 a 1 Segundo
« Respuesta #1 en: 21 de Octubre de 2011, 11:31:38 »
por favor de verdad necesito alguna orientación con respecto a eso por que la rutina de servicio no me esta generando el incremento de las variables que tengo y no encuentro la respuesta... ya revise el código y a mi parecer esta bien solo necesito su colaboración al respecto a ver si uds consiguen el problema...

Desconectado tapi8

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1506
Re: Problema con TMR0 a 1 Segundo
« Respuesta #2 en: 21 de Octubre de 2011, 14:42:49 »
Veras lo mire muy por encima, se me queda aqui:

Código: [Seleccionar]
INICIO
BTFSS PORTB,1
GOTO $-1
BTFSC PORTB,1
GOTO $-1

Porque RB1,supongo que es el pulsador, esta configurado como salida y no lo lee.


Desconectado Goodfrey

  • PIC12
  • **
  • Mensajes: 87
Re: Problema con TMR0 a 1 Segundo
« Respuesta #3 en: 21 de Octubre de 2011, 14:46:28 »
Veras lo mire muy por encima, se me queda aqui:

Código: [Seleccionar]
INICIO
BTFSS PORTB,1
GOTO $-1
BTFSC PORTB,1
GOTO $-1

Porque RB1,supongo que es el pulsador, esta configurado como salida y no lo lee.




Muchas gracias por la respuesta.... ya había corregido el problema pero realmente no se queda preguntando por el puerto se queda luego de que genera la interrupción cuando sale del retfie el mismo cae en el envió del usart y de hay no sale mas nunca... también las variables  que están en la rutina de interrupción no se incrementan... por lo menos en proteus no sirve...

Desconectado tapi8

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1506
Re: Problema con TMR0 a 1 Segundo
« Respuesta #4 en: 22 de Octubre de 2011, 09:41:28 »
Es que tienes varios fallos en la interrupcion, ya en principio guardas mal el reg. STATUS, porque al hacer "MOVF STATUS,W" te esta afectando al flag Z.

Código: [Seleccionar]
ORG 0x04
MOVWF   W_TEMP ; save off current W register contents
MOVF STATUS,W ; move status register into W register
MOVWF S_TEMP ; save off contents of STATUS register
GOTO SERVICIO

Pero el principal problema es que cuando llega a 100 desactivas la interrupcion por TIMER, no pones a 0 "CONT" para que a la proxima vez empiece de 0 a contar (aunque nunca cuenta porque el TIMER no provoca interrupcion), y encima tienes el WATCH DOG activado y no lo tienes en cuenta en el programa.

Código: [Seleccionar]
SERVICIO
BCF INTCON,GIE
BTFSS INTCON,T0IF
GOTO SALIR
INCF CONT,F
MOVF CONT,W
XORLW .100
BTFSS STATUS,Z
GOTO SALIR
INCF TER,F
BCF INTCON,T0IE
GOTO SALIR2

Deberias darle un repaso al tema de las interrupciones, porque tampoco debes activar tu el INTCON,GIE eso te lo hace el cuando sale con el RETFIE.

Código: [Seleccionar]
BCF INTCON,T0IF
BSF INTCON,GIE
MOVLW .217
MOVWF TMR0
MOVF S_TEMP,W ; retrieve copy of STATUS register
MOVWF STATUS ; restore pre-isr STATUS register contents
SWAPF   W_TEMP,F
SWAPF   W_TEMP,W ; restore pre-isr W register contents
RETFIE

Desconectado Goodfrey

  • PIC12
  • **
  • Mensajes: 87
Re: Problema con TMR0 a 1 Segundo
« Respuesta #5 en: 25 de Octubre de 2011, 12:57:20 »
Amigos sinceramente no tiendo que es lo que pasa.... miren el problema es el siguiente... me baje el programa que tiene suky en web para desarrollar los codigos de las interrupciones y todo eso, con el siguiente código me funciona muy bien hace exactamente lo que quiero...

Apretar el botón y el trm0 hace un conteo, se desborda y cuando llega a 40 la variable significa que ha transcurrido 1 segundo exacto.

simplemente agarra lo que esta en el ADC y lo pone en los puertos mientras no hallan transcurrido 1 segundo...

Ahora el problema es el siguiente...

uso exactamente el mismo código que el anterior, pero cuando le agrego la transmisión serial a 2400 baudios el programa no hace nada, se tranca totalmente.... voy a colocarte los códigos para que me entiendan.

Código: [Seleccionar]
LIST P=16F877A
#include <P16F877A.INC>

;////////////////////////////////////////////////////////////////////////
; BANCOS DE VARIAGLES
;///////////////////////////////////////////////////////////////////////

BUT EQU 0x20
CONT EQU 0x21
TER EQU 0x22
S_TEMP EQU 0x23
W_TEMP EQU 0x24
LECTU1 EQU 0x25
LECTU2 EQU 0x26

REG EQU 0x40
REG1 EQU 0x41
REG2 EQU 0x42


;////////////////////////////////////////////////////////////////////////
; VECTOR DE INICIO
;///////////////////////////////////////////////////////////////////////

ORG 0x00
CALL CONF
CALL ADC_C
GOTO INICIO

ORG 0x04
GOTO SERVICIO

;////////////////////////////////////////////////////////////////////////
; INTERRUPCION
;///////////////////////////////////////////////////////////////////////
 
SERVICIO
BCF INTCON,GIE
MOVWF W_TEMP
SWAPF STATUS,W
MOVWF S_TEMP
BTFSS INTCON,T0IF
GOTO SALIR
INCF CONT,F
MOVF CONT,W
XORLW .40
BTFSS STATUS,Z
GOTO SALIR
INCF TER,F
BCF INTCON,T0IE
GOTO SALIR2
SALIR
SWAPF S_TEMP,W
MOVWF STATUS
SWAPF W_TEMP,F
SWAPF W_TEMP,W
BCF INTCON,T0IF
MOVLW 0x9C
MOVWF TMR0
RETFIE
SALIR2
SWAPF S_TEMP,W
MOVWF STATUS
SWAPF W_TEMP,F
SWAPF W_TEMP,W
CLRF BUT
CLRF CONT
BCF INTCON,T0IF
RETFIE

;////////////////////////////////////////////////////////////////////////
; PUERTOS
;///////////////////////////////////////////////////////////////////////

CONF BSF STATUS,RP0
MOVLW B'00000011'
MOVWF TRISA
CLRF TRISB
CLRF TRISC
CLRF TRISD
CLRF TRISE
BCF STATUS,RP0
CLRF PORTB
CLRF PORTC
CLRF PORTD
CLRF PORTE
RETURN

;////////////////////////////////////////////////////////////////////////
; CONFIGURACION DEL ADC
;///////////////////////////////////////////////////////////////////////

ADC_C
BSF STATUS,RP0
MOVLW B'10001110'
MOVWF ADCON1
BSF TRISA,0 ; configura como entrada el canal digital RA0
BCF STATUS,RP0
MOVLW B'01000001' ; Selecciona el canal AN0, reloj de conversión Fosc/2
MOVWF ADCON0 ; y enciende el convertidor
CALL PAUSA
RETURN

;////////////////////////////////////////////////////////////////////////
; INICIO DEL PROGRAMA
;///////////////////////////////////////////////////////////////////////

INICIO
BTFSS PORTA,1
GOTO $-1
BTFSC PORTA,1
GOTO $-1
CALL INICIA
INCF BUT,F
MOVF BUT,W
XORLW .2
BTFSS STATUS,Z
GOTO $+2
GOTO SIGUE
MOVLW 0x9C
MOVWF TMR0
T1 CALL ADC1
MOVF LECTU1,W
MOVWF PORTB
MOVF LECTU2,W
MOVWF PORTC
MOVF TER,W
XORLW .1
BTFSS STATUS,Z
GOTO T1
CLRF TER
CLRF CONT
GOTO INICIO

INICIA
BSF STATUS,RP0
MOVLW 0xD7
MOVWF OPTION_REG
BCF STATUS,RP0
BSF INTCON,T0IE
BSF INTCON,GIE
RETURN

SIGUE GOTO INICIO

;////////////////////////////////////////////////////////////////////////
; LECTURA ADC
;///////////////////////////////////////////////////////////////////////

ADC1
BSF ADCON0,GO ; INICIO CONVERSION
BTFSC ADCON0,GO ; ESPERO SI TERMINO
GOTO $-1
CALL PAUSA
MOVF ADRESH,W ; MUEVO LO QUE TIENE ADRESL A W
MOVWF LECTU2
BSF STATUS,RP0
MOVF ADRESL,W ; MUEVO LO QUE TIENE ADRESL A W ; LA CONVERSION
BCF STATUS,RP0
MOVWF LECTU1
RETURN

;////////////////////////////////////////////////////////////////////////
; RETARDOS
;///////////////////////////////////////////////////////////////////////

PAUSA
MOVLW .9 ; Carga dato para 30 µseg.
MOVWF REG
DECFSZ REG,1
GOTO $-1
RETURN

RET1S
MOVLW .100
MOVWF REG2
LP1 MOVLW .97
MOVWF REG1
LP2 MOVLW .33
MOVWF REG
DECFSZ REG,1
GOTO $-1
DECFSZ REG1,1
GOTO LP2
DECFSZ REG2,1
GOTO LP1
RETURN

;////////////////////////////////////////////////////////////////////////
; FIN DE PROGRAMA
;///////////////////////////////////////////////////////////////////////

END


Ahora este es el que me da problemas...


Código: [Seleccionar]

LIST P=16F877A
#include <P16F877A.INC>

;////////////////////////////////////////////////////////////////////////
; BANCOS DE VARIAGLES
;///////////////////////////////////////////////////////////////////////

BUT EQU 0x20
CONT EQU 0x21
TER EQU 0x22
S_TEMP EQU 0x23
W_TEMP EQU 0x24
LECTU1 EQU 0x25
LECTU2 EQU 0x26
UNIDAD EQU 0x27
DECENA EQU 0x28
CENTENA EQU 0x29
DATO EQU 0x30

REG EQU 0x40
REG1 EQU 0x41
REG2 EQU 0x42


;////////////////////////////////////////////////////////////////////////
; VECTOR DE INICIO
;///////////////////////////////////////////////////////////////////////

ORG 0x00
CALL CONF
CALL ADC_C
GOTO INICIO

ORG 0x04
GOTO SERVICIO

;////////////////////////////////////////////////////////////////////////
; INTERRUPCION
;///////////////////////////////////////////////////////////////////////
 
SERVICIO
BCF INTCON,GIE
MOVWF W_TEMP
SWAPF STATUS,W
MOVWF S_TEMP
BTFSS INTCON,T0IF
GOTO SALIR
INCF CONT,F
MOVF CONT,W
XORLW .40
BTFSS STATUS,Z
GOTO SALIR
INCF TER,F
BCF INTCON,T0IE
GOTO SALIR2
SALIR
SWAPF S_TEMP,W
MOVWF STATUS
SWAPF W_TEMP,F
SWAPF W_TEMP,W
BCF INTCON,T0IF
MOVLW 0x9C
MOVWF TMR0
RETFIE
SALIR2
SWAPF S_TEMP,W
MOVWF STATUS
SWAPF W_TEMP,F
SWAPF W_TEMP,W
CLRF BUT
CLRF CONT
BCF INTCON,T0IF
RETFIE

;////////////////////////////////////////////////////////////////////////
; PUERTOS
;///////////////////////////////////////////////////////////////////////

CONF BSF STATUS,RP0
MOVLW B'00000011'
MOVWF TRISA
CLRF TRISB
CLRF TRISC
CLRF TRISD
CLRF TRISE
BCF STATUS,RP0
CLRF PORTB
CLRF PORTC
CLRF PORTD
CLRF PORTE
RETURN

;////////////////////////////////////////////////////////////////////////
; CONFIGURACION DEL ADC
;///////////////////////////////////////////////////////////////////////

ADC_C
BSF STATUS,RP0
MOVLW B'10001110'
MOVWF ADCON1
BSF TRISA,0 ; configura como entrada el canal digital RA0
BCF STATUS,RP0
MOVLW B'01000001' ; Selecciona el canal AN0, reloj de conversión Fosc/2
MOVWF ADCON0 ; y enciende el convertidor
CALL PAUSA
RETURN

;////////////////////////////////////////////////////////////////////////
; CONFIGURACION USART
;///////////////////////////////////////////////////////////////////////

TRANS
BSF STATUS,RP0 ; BANCO 1
BCF TXSTA,BRGH ; BRGH = 1 ( VELOCIDAD BAJA )
MOVLW .25 ; 2400 BAUDS ( 4 Mhz )
MOVWF SPBRG ; CONFIGURACION A 2400 BAUDIOS
BCF TXSTA,SYNC ; SYNC = 0 ( MODO ASINCRONO )
BSF TXSTA,TXEN ; TXEN = 1 ( HABILITA LA TRANSMISION)
BCF STATUS,RP0 ; BANCO 0
BSF RCSTA,SPEN ; SPEN = 1 ( HABILITA PUERTO SERIE )
BSF RCSTA,CREN ; HABILITA RECEPCION
RETURN

;////////////////////////////////////////////////////////////////////////
; INICIO DEL PROGRAMA
;///////////////////////////////////////////////////////////////////////

INICIO
BTFSS PORTA,1
GOTO $-1
BTFSC PORTA,1
GOTO $-1
CALL INICIA
INCF BUT,F
MOVF BUT,W
XORLW .2
BTFSS STATUS,Z
GOTO $+2
GOTO SIGUE
MOVLW 0x9C
MOVWF TMR0
T1 CALL ADC1
MOVF LECTU1,W
CALL BINBCD
CALL SEND
MOVF LECTU2,W
CALL BINBCD
CALL SEND
MOVF TER,W
XORLW .1
BTFSS STATUS,Z
GOTO T1
CLRF TER
CLRF CONT
GOTO INICIO

INICIA
BSF STATUS,RP0
MOVLW 0xD7
MOVWF OPTION_REG
BCF STATUS,RP0
BSF INTCON,T0IE
BSF INTCON,GIE
RETURN

SIGUE GOTO INICIO

;////////////////////////////////////////////////////////////////////////
; LECTURA ADC
;///////////////////////////////////////////////////////////////////////

ADC1
BSF ADCON0,GO ; INICIO CONVERSION
BTFSC ADCON0,GO ; ESPERO SI TERMINO
GOTO $-1
CALL PAUSA
MOVF ADRESH,W ; MUEVO LO QUE TIENE ADRESL A W
MOVWF LECTU2
BSF STATUS,RP0
MOVF ADRESL,W ; MUEVO LO QUE TIENE ADRESL A W ; LA CONVERSION
BCF STATUS,RP0
MOVWF LECTU1
RETURN

;////////////////////////////////////////////////////////////////////////
; ENVIO DE DATOS POR SERIAL
;///////////////////////////////////////////////////////////////////////

ENVIA
BSF STATUS,RP0 ; BANCO 1
BTFSS TXSTA,TRMT ; CHQUEA EL BUFFER DE TRANSMISION
GOTO $-1 ; ESTA OCUPADO
BCF STATUS,RP0 ; BANCO 0
; MOVF DATO,W ; RESCATA DATO A ENVIAR
MOVWF TXREG ; LO ENVIA
CALL PAUSA
RETURN

SEND
MOVF CENTENA,W
CALL ENVIA
MOVF DECENA,W
CALL ENVIA
MOVF UNIDAD,W
CALL ENVIA
RETURN

;////////////////////////////////////////////////////////////////////////
; BINARIO A BCD
;///////////////////////////////////////////////////////////////////////

BINBCD
MOVWF UNIDAD
CLRF DECENA
CLRF CENTENA
RESTA10
MOVLW .10
SUBWF UNIDAD,W
BTFSS STATUS,C
GOTO BCD_FIN
INC_DEC
MOVWF UNIDAD
INCF DECENA,F
MOVLW .10
SUBWF DECENA,W
BTFSS STATUS,C
GOTO RESTA10
INC_CEN
CLRF DECENA
INCF CENTENA,F
GOTO RESTA10
BCD_FIN
SWAPF DECENA,W
ADDWF UNIDAD,W
MOVLW 30H
ADDWF UNIDAD,F
MOVLW 30H
ADDWF DECENA,F
MOVLW 30H
ADDWF CENTENA,F
RETURN

;////////////////////////////////////////////////////////////////////////
; RETARDOS
;///////////////////////////////////////////////////////////////////////

PAUSA
MOVLW .9 ; Carga dato para 30 µseg.
MOVWF REG
DECFSZ REG,1
GOTO $-1
RETURN

RET1S
MOVLW .100
MOVWF REG2
LP1 MOVLW .97
MOVWF REG1
LP2 MOVLW .33
MOVWF REG
DECFSZ REG,1
GOTO $-1
DECFSZ REG1,1
GOTO LP2
DECFSZ REG2,1
GOTO LP1
RETURN

;////////////////////////////////////////////////////////////////////////
; FIN DE PROGRAMA
;///////////////////////////////////////////////////////////////////////

END


Lo único que tiene de diferente es el Binario a BCD y la rutina que en vez de colocar los datos del adc al puerto solo el addresh  va al binario a bcd y luego se envían por serial , el addrel va a binario a bcd y luego se envía por serial...

realmente no consigo el por que el código se vuelve loco solo cuando coloco estas rutinas nada mas...

Desconectado tapi8

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1506
Re: Problema con TMR0 a 1 Segundo
« Respuesta #6 en: 25 de Octubre de 2011, 13:36:06 »
Posiblemente la solucion la tengas aqui:

http://www.todopic.com.ar/foros/index.php?topic=26493.0

Comentan que los pines de USART deben estar configurados como entradas, creo que tu los tienes como salidas.


Desconectado Goodfrey

  • PIC12
  • **
  • Mensajes: 87
Re: Problema con TMR0 a 1 Segundo
« Respuesta #7 en: 25 de Octubre de 2011, 13:53:55 »
Posiblemente la solucion la tengas aqui:

http://www.todopic.com.ar/foros/index.php?topic=26493.0

Comentan que los pines de USART deben estar configurados como entradas, creo que tu los tienes como salidas.



Problema la configuracion real es esta

Citar
CONF   BSF   STATUS,RP0
   MOVLW   B'00000011'
   MOVWF   TRISA
   CLRF   TRISB
   MOVLW   .128
   MOVWF   TRISC
   CLRF   TRISD
   CLRF   TRISE
   BCF   STATUS,RP0
   CLRF   PORTB   
   MOVLW   .128
   MOVWF   PORTC
   CLRF   PORTD
   CLRF   PORTE
   RETURN

y voy a revisar el link que me diste para ver que puedo hacer porque realmente el problema es cuando estoy enviando los datos que apenas sale de la interrupción cae en la rutina de envió de datos....

Desconectado Goodfrey

  • PIC12
  • **
  • Mensajes: 87
Re: Problema con TMR0 a 1 Segundo
« Respuesta #8 en: 25 de Octubre de 2011, 16:54:55 »
Lo que había puesto aquí no sirvió disculpen aun presento problemas...
« Última modificación: 25 de Octubre de 2011, 17:05:02 por Goodfrey »

Desconectado bmfranky

  • PIC16
  • ***
  • Mensajes: 165
    • La Tienda De Fran
Re: Problema con TMR0 a 1 Segundo
« Respuesta #9 en: 26 de Octubre de 2011, 03:34:37 »
Hola, si realmente usas el segundo código que posteas, fíjate que aunque defines la función que configura la usart, no la usas en ningún momento, con lo que intentas usar un periférico que no esta habilitado y el procesador se pierde.

Prueba-lo y me comentas, lo lógico es que habilites el adc y la usart directamente desde la función conf.
Visiten La Tienda De Fran ;-) Aqui. y mi nueva Web Aqui.