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.
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...
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...