Hola chic@s, les cuento.
estoy tratando de comunicar un 16f877 con un PC mediante el puerto USART y para ello empleo el integrado MAX232 para acondicionar los niveles de tensión.
Parece que tengo un problema en la programación del pic. Lo cierto es que no existe transmisión de datos por el puerto y no comprendo el porqué.
¿ podríais orientarme un poco? Gracias. Adjunto el código ligeramente documentado
;Programa de conversion de una señal analógica en AN0
;que se transmite por serial 2400-8-N-1-N en RC6/TX
; __CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON & _XT_OSC
list p=16f877
include <p16f877.inc>
ADDR_L equ 0x20
DATA_L equ 0x21
contador equ 0x22
org 0x00
nop
nop
bcf STATUS,RP0 ; ir al banco 0
bcf STATUS,RP1
movlw b'10000001' ; A/D conversion a Fosc/8
movwf ADCON0
bsf STATUS,RP0 ; ir al banco 1
bcf STATUS,RP1
clrf TRISA ;Configuracion de puertos.
clrf TRISB
clrf TRISC
clrf TRISD
clrf TRISE
bsf TRISA,0 ; configuracion de AN0 como entrada
bcf TRISC,6 ; RC6/TX/DT como salida.
movlw b'00001000' ; A/D port AN0/RA0 b'01001110'
movwf ADCON1
movlw d'12' ;2400 baudios para cristal de 4MHz.
movwf SPBRG
bcf TXSTA,BRGH ; BRGH=0 baja velocidad
bcf TXSTA, SYNC ; Modo asincrono.
bcf STATUS,RP0 ; ir al banco 0
bcf STATUS,RP1
bsf RCSTA,SPEN ; habilita el puerto serie.
bsf STATUS,RP0 ; ir al banco 1
bcf STATUS,RP1
bcf TXSTA,TX9 ; TX9=0 9 bit de transferecia no habiliado.
bsf TXSTA,TXEN ; TXEN=1 activacion de la transmision serie.
bcf STATUS,RP0 ; ir al banco 0
bcf STATUS,RP1
;****Conversion y transmision de datos*****
_adc
bsf ADCON0,GO ; habilita la conversion.
call demora_20us
_espera
btfsc ADCON0,GO ; ¿ha finalizado la conversion?
goto _espera ; si no ha finalizado vuelve a _adc
movf ADRESH,W ; si ha finalizado guarda el valor de ADRESH en W
movwf TXREG ;carga el registro TXREG con W
_esperatx
btfss PIR1,TXIF ; comprueba si se ha vaciado el registro de transmision TSR. Entonces habrá acabado la transmision.
goto _esperatx ; si no se ha vaciado aun está transmitiendo. Espera.
goto _adc ; si ha finalizado inicia el ciclo convirtendo otro valor.
;**** Demora ****
demora_20us
movlw 0x05 ;
movwf contador ; Iniciamos contador1.-
repeticion
decfsz contador,1 ; Decrementa Contador1.-
goto repeticion ; Si no es cero repetimos ciclo.-
return ; Regresa de la subrutina.-
end