Muy buenas, estoy realizando un proyecto con un pic 16f876 y tengo un pequeño problema con el puerto serie.
Estoy detectando una interrupcion en la RB0/INT0 que salta con la señal de un encoder que he colocado en el eje de un movil, cuando salta la interrupcion tomo un muestra analogica por el pin RA0 y la guardo en NumH y NumL, despues envio las dos muestras por el puerto rs232. Mi problema es q no recibo dos muestras por el puerto serie si no tres, bueno varía, algunas veces son dos y otras tres. El aparatito no funciona xq algunas veces me envia la misma muestra para valores de tension diferentes.
La velocidad con la q tengo q hacer el proceso debe ser lo maximo posible por q en principio quiero colocar un modulo de radio en el movil y tomar muestras en tiempo real (lo mas deprisa posible).
Muchas gracias por todo
ahi va el codigo
; ************************************
; * INCLUDES, BANCOS, ERRORES *
; ************************************
list p=16f876 ; list directive to define processor
#include <p16f876.inc> ; INCLUIMOS LAS DEFINICIONES DEL PIC UTILIZADO
#define BANCO_1 bsf STATUS,RP0 ;DEFINICION DE BANCO 1
#define BANCO_0 bcf STATUS,RP0 ;DEFINICION DE BANCO 0
ERRORLEVEL -306, -302 ;QUITAMOS LOS ERRORES DE BANCO EN MPLAB
RADIX HEX ; sistema de numeracion hexadecimal
__CONFIG _CP_OFF & _WDT_OFF & _BODEN_OFF & _PWRTE_OFF & _XT_OSC & _WRT_ENABLE_OFF & _LVP_ON& _DEBUG_OFF & _CPD_OFF
; frecuencia clock
XTAL_FREQ EQU 4000000 ; OSC freq in Hz
; ***********************************
; * DEFINICION DE ETIQUETAS *
; ***********************************
cont equ 0x20
NumH equ 0x25
NumL equ 0x26
PDel0 equ 0x27
PDel1 equ 0x28
PDel2 equ 0x29
; ****************
; * START *
; ****************
org 0
goto inicio
; ******************************************
; * RUTINA de INTERRUPCIÓN GENERAL *
; ******************************************
org 4
call adsetnow
call Xready
call bith
call allsend
nop
nop
call Xready
call bitl
call allsend
nop
nop
bcf INTCON,INTF
retfie
; **************************************************
; * RUTINA DE INICIO, AUQI CONFIGURAMOS EL PIC *
; **************************************************
inicio
bcf STATUS, RP0
bcf STATUS, RP1
clrf PORTB
clrf PORTC
BANCO_1
movlw b"11111111"
movwf TRISB
movlw b"10000000"
movwf TRISC
BANCO_0
bsf RCSTA, 7 ; activamos el USART MODO ASINCRONO
BANCO_1
movlw b"00100100" ; SYNC=0 (asincrono) y BRGH = 1 (alta velocidad)
movwf TXSTA
movwf .25 <<<<<------------- AQUI ESTA EL ERRORR
movwf SPBRG
BANCO_0
bcf STATUS, 5
clrf PORTC
BANCO_1
movlw b"11000000"
movwf OPTION_REG
BANCO_0
movlw b"10010000"
movwf INTCON
; **********************************
; * PROGRAMA PRINCIPAL *
; **********************************
bucle
goto bucle
; ********************************************
; * SUBRUTINAS PARA LAS INTERRUPCIONES *
; ********************************************
adsetnow
call Init_ADC
call Read_ADC
return
bith
movf NumH,0
movwf TXREG
BANCO_1
return
bitl
movf NumL,0
movwf TXREG
BANCO_1
return
Init_ADC
; Set ADCON0
movlw b"10000001"
movwf ADCON0
; Set ADCON1
BANCO_1
movlw b"10001110"
movwf ADCON1
BANCO_0
return
Read_ADC
bsf ADCON0, GO_DONE ;inicializa la conversion
btfsc ADCON0, GO_DONE
goto $-1 ;espera a terminar la conversion
andlw b"00000011"
movf ADRESH,W
nop
movwf NumH
BANCO_1
movf ADRESL,W
andlw b"11111111"
BANCO_0
movwf NumL ;el resultado es retornado en NumH (bit 0 y bit1) y NumL (8bits)
return
Xready
BANCO_1
bsf TXSTA, TXEN
BANCO_0
return
allsend
btfss TXSTA,TRMT ; byte transmitido ?????
goto allsend ; No pues espera
BANCO_0
return
end