TODOPIC
Microcontroladores PIC => Todo en microcontroladores PIC => Mensaje iniciado por: Santherberg en 27 de Abril de 2011, 11:06:48
-
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
-
Hola amigo, revisa este ejemplo
title ¨COMUNICACION SERIAL UTILIZANDO EL MODULO USART¨
list p=16f873
;registros de proposito especifico
dir_ind equ 00
tmr0 equ 01
pc equ 02
status equ 03
fsr equ 04
porta equ 05
portb equ 06
portc equ 07
eedata equ 08
eeadr equ 09
pclath equ 0a
intcon equ 0b
rcsta equ 18
txreg equ 19
rcreg equ 1a
pir1 equ 0c
adcon1 equ 1f
;==============================================================================
;registros de proposito general
conta1 equ 20
conta2 equ 21
;==============================================================================
;registros de configuracion
trisa equ 05
trisb equ 06
trisc equ 07
txsta equ 18
spbrg equ 19
pie1 equ 0c
;==============================================================================
;bit de registro status
c equ 00
z equ 02
rp0 equ 05
w equ 00
f equ 01
tx equ 06
rx equ 07
;==============================================================================
org 00
goto inicio
;==============================================================================
org 04 ;CUANDO RECIBE LOS 8 BITS SE GENERA LA
;INTERRUPCION, EL DATO ES LLEVADO AL
movf rcreg,w ;PUERTO B
movwf portb
bcf pir1,5
retfie
;==============================================================================
tiempo movlw d'250' ;TIEMPO DE 1 ms PARA EVITAR REBOTES
movwf conta1
nop
decfsz conta1,f
goto $-2
return
;==============================================================================
enviar bcf intcon,7
bsf status,rp0
btfss txsta,1 ;SE PREGUNTA SI YA TERMINO DE ENVIAR
goto $-1
bcf status,rp0
bsf intcon,7
return
;==============================================================================
inicio bsf status,rp0
bsf trisc,7 ;PIN RX----RS232----AL PIN 3 DB9 DEL PC TX
bcf trisc,6 ;PIN TX----RS232----AL PIN 2 DB9 DEL PC RX
;GND-----------------AL PIN 5 DB9 DEL PC GND
clrf trisb
;LA TECLA ENTER ES EL CODIGO H'0D'
;LA TECLA TABULADOR ES EL CODIGO H'09'
;LA TECLA RETROCESO ES EL CODIGO H'08'
;LA TECLA ESPACIO ES EL CODIGO H'20'
;LA TECLA ESCAPE ES EL CODIGO H'1B'
;LA TECLA Ñ ES EL CODIGO H'D1'
movlw b'11000000' ;EL SISTEMA CONSISTE EN SENSAR UNA
movwf intcon ;TECLA Y CUANDO ESTA SE ACTIVA
;INCREMENTA UN CONTADOR QUE INICIA DESDE
movlw h'07' ;CERO, ESTE SE CONVIERTE A ASCII Y SE
movwf adcon1 ;ENVIA AL PC A HIPER-TERMINAL; DEL MISMO
;MODO DESDE EL PC SE PUEDE ENVIAR EL CODIGO
bcf status,rp0 ;DE LA TECLA Y EL PIC RECIBE Y LO ENTRGA AL
;PUERTO B
clrf conta2
bsf portc,6
clrf portb
;==============================================================================
bsf status,rp0
bsf pie1,5 ;SE HABILITA LA INTERRUPCION CUANDO
;TERMINA DE RECIBIR UN DATO POR EL RX
movlw d'12' ;SE CONFIGURA EL GENERADOR DE BAUDIOS
movwf spbrg ;PARA ENVIAR A 4800 BAUDIOS
movlw b'10100000' ;SE HABILITA EL MODULO DE TRANSMICION
movwf txsta
bcf status,rp0
movlw b'10111000' ;SE HABILITA EL MODULO DE RECEPCION
movwf rcsta
;==============================================================================
ciclo call tiempo ;RUTINA QUE PREGUNTA POR LA TECLA
btfsc porta,0
goto ciclo
movf conta2,w ;SE CONVIERTE EL VALOR DEL CONTADOR A
addlw h'30' ;ASCII Y SE LLEVA AL REGISTRO DE
movwf txreg ;TRANSMICION
incf conta2,f ;SE INCREMENTA EL CONTADOR
call enviar
;==================
;movlw h'0d' ;SE ENVIA LA FUNCION ENTER
;movwf txreg
;call enviar
call tiempo ;PREGUNTA SI YA SOLTARON LA TECLA
btfss porta,0
goto $-2
;==================
goto ciclo
;==============================================================================
end
Saludos.