Hablar con pic via rs232

Hola me gustaría que alguien me explicase o me facilitara algún doc sobre comunicaciones rs232 en los pic la finalidad que estoy buscando es poder comunicarme con una aplicación propia de forma que cuando se produzcan cosas en el pic este envía churros a mi programa y este actúa en consecuencia enviando otro churro al pic.
Gracias
Respuesta
1
El tema de la comunicación serial rs232 es uno de los temas más interesantes para el control de dispositivos con el PC
Para la comunicación serie RS232 asíncrona se puede implementar por software o por hardware según el PIC que poseas. La ventaja de usar el pic 16f877 es debido a que implementa intermamente registros especializados para la comunicación es decir posee un modulo usart para transmisión y recepción que puede trabajar de tres maneras diferentes:
1.Asíncrona rs232
2.Síncrona maestro esclavo
3.Síncrona esclavo
Una de las formas más usadas es la asincona rs232 en este protocolo cada palabra de información o dato se envía independiente de los demás. Suele constar de 8 o 9 bits y van precedidos por un bit de inicio y al final un bit de parada de acuerdo con las normas del formato NRZ ( no retorno a zero), los bits se transmiten a una frecuencia fija y normalizada
La arquitectura básica interna del modulo usart del pic 16f877 la componen:
A)Un circuito de muestreo: Actúa sobre el pin RC7/RX/DT que es por donde recibe el bit de información o control y se encarga de muestrear tres veces su valor para decidir este por mayoría
B)Un generador de baudios:genera la frecuencia en baudios para la transferencia de los datos a valores normalizados 300, 600, 1200, 2400, 4800, 9600, 19200, 38400 etc para generar esta frecuencia el generador de baudios se carga con uno de estos valores el registro SPBRG ver manual del pic 16f877 la descripción de bits y constantes usadas.
C)Un transmisor asíncrono: el dato que se desea transmitir por el modulo usart se deposita en el registro TXREG y a continuación se pasa al registro de despalzamiento interno TSR que saca los bits secuencialmente a la frecuencia establecida
D)Recepector asíncrono: los datos se reciben en serie bit a bit por el pin RC7/RX y se van introduciendo secuencialmente
El siguiente ejemplo ilustra una rutina que usa el modulo usart del pic 16f877 para la comunicación serie rs232
;-----PALABRA DE CONFIGURACION----
RADIX HEX ; Sistema de numeraci¢n hexadecimal
processor 16F877
include <p16F877.inc>
__CONFIG _CP_OFF & _DEBUG_OFF & _WRT_ENABLE_OFF & _CPD_OFF & _LVP_OFF & _BODEN_ON & _PWRTE_ON & _WDT_OFF & _XT_OSC
__IDLOCS H'0000'
;-----REGISTROS INTERNOS--------
STATUS EQU 0x03 ;registro de estado
PORTA EQU 0x05 ;puertoa
PORTB EQU 0x06
PORTC EQU 0x07
PORTD EQU 0x08
PORTE EQU 0x09 ;puertob
RAM EQU 0X20 ;direccion de inicio de la tabla en RAM
INDF EQU 0x00
FSR EQU 0x04
PC EQU 0x02
RP0 EQU 5
RP1 EQU 6
PIR1 EQU H'000C'
Pir2 equ h'000d' ;contiene banderas para interrupciones de periféricos
PCLATH EQU 0x0A
TXREG EQU H'0019' ;registro de control y status de transmision
RCREG EQU H'001A' ;registro de control y status de recepcion
RCSTA EQU H'0018'
SPBRG EQU 0x99
TXSTA EQU H'0098'
SPBRG EQU H'0099'
PIE1 EQU 0x8C
RP0 EQU 5
RP1 EQU 6
Irp equ 7
Z EQU 2
C EQU 0
TXIF EQU 4 ;bandera de transmision usart 1=vacio 0= lleno
ADCON1 EQU 0x9F
OPTION_REG EQU 0x81
ADCON0 EQU 0x1F
TMRO EQU 0x1
INTCON EQU 0x0B
;--------REGISTROS DEFINIDOS EN RAM
ORG RAM ;Inicio de los registros de Uso general RAM
CONTADOR_ERROR RES 1
BYTE1_ALTO RES 1
BYTE_CONTROL RES 1
BYTE_DIRECCION RES 1
BYTE_DATA RES 1
BYTE1 RES 1
BYTE1_BAJO RES 1
BYTE2 RES 1
BYTE3 RES 1
BYTE4 RES 1
CONTROL RES 1 ;Reserva un Byte para palabra de control de la tarjeta
ADRESS RES 1 ;Reserva un Byte para dirección de la tarjeta
BYTE RES 1 ;
BIT RES 1 ;
NUM RES 1 ;
VALOR RES 1 ;registro temporal donde se almacenan los datos que vienen de la tarjeta
TEMPORAL1 RES 1 ;contador para almacenar variables temporales
BANDERAS RES 1
OutputReg res 1
CounterReg res 1
Cont1 res 1
BYTE2_BAJO RES 1
BYTE2_ALTO RES 1
BYTE3_BAJO RES 1
BYTE3_ALTO RES 1
BYTE4_BAJO RES 1
BYTE4_ALTO RES 1
LOOPS RES 1
LOOPS2 RES 1
Contador4 res 1
Contador3 res 1
Contador5 res 1
Contador res 1 ;variables para subrutina retardos
CONTADOR2 RES 1
CONTADOR1 RES 1
;------------------------------------------------VARIABLES DEL TECLADO
TEMP_1 RES 1
DELAY_1 RES 1
DELAY_2 RES 1
DELAY_3 RES 1
LCD_VAR RES 1
KEY_VAR RES 1
KEY_DELAY_1 RES 1 ;Variable de temporizaci¢n
KEY_DELAY_2 RES 1 ;Variable de temporizaci¢n
TECLADO RES 1
;---------BITS ESPECIALES------
CLK EQU 1
RST EQU 0 ;bit para control y datos del LCD
IO EQU 2 ;bit de enable para LCD
SWITCH EQU 6 ;SWITCH DE ENCENDIDO DE LA TARJETA
DI EQU 7 ;bit de entrada desde eeprom
DO EQU 6 ;bit de salida para eeprom
TR EQU 6
Rbpu equ 7
TRMT EQU 1
Rcie equ 5
;-----REGISTROS LCD-------
; Bits del puerto B para controlar la Pantalla
LCD_RS EQU 5
LCD_E EQU 4
;Bancos 0-1-2-3 16 bytes comunes a los 4 bancos (sharebank)
CBLOCK H'070'
RXBUF
COUNT2
Count
Eeprom
TRANS ;REGISTRO QUE SE TRANSMITE RS 232 AL PC
R0D ;CONTADOR 8 PARA RS232
R0E
CONT1 ;CONTADOR carga para 833us PARA RS232
CONT
CONT2
Ncount
Mcount
TXBUF
TECLA ;Retorno del c¢digo de tecla
KEY_1 ;No de filas a explorar
KEY_2
ENDC
;****************************************************************
;PROGRAMA PRINCIPAL
;*****************************************************************
ORG 0X00
GOTO INICIO
ORG 0x04
;TRATAMIENTO DE INTERRUPCIONES
INTER BTFSS PIR1,RCIF ;INTERRUPCION POR RECEPCION?
GOTO VOLVER ;FALSA ALARMA
BCF PIR1, RCIF ;SI REPONER FLAG
Movf rcreg, w ;lectura del dato recibido
movwf teclado
CLRF RCREG
;CALL LCDC
MOVLW 'F'
SUBWF TECLADO, W
BTFSC STATUS, Z
GOTO LECTURA
CALL TX_DATO2
BSF STATUS, 5
CLRF RCSTA ;-->OJO ES TXSTA PORQUE ESTA EN BANCO 1
BCF STATUS, 5
;MOVLW B'11000000'
;MOVWF INTCON
VOLVER RETFIE
TX_DATO2 BCF PIR1,TXIF ;RESTAURA EL FLAG DEL SEÑALIZADOR
MOVLW 'N'
Movwf txreg ;muevele byte a transmitir al registro de transmisión
BSF STATUS, 5
BCF STATUS, 6
TX_dat_w2 btfss rcsta,trmt ;fue transmitido el byte? Ojo es el registro TXsta porque esta en el banco 1
GOTO TX_DAT_W2
BCF STATUS,5
RETURN
Inicio clrf portc
BSF STATUS, 5 ;Cambio al banco 1
BCF STATUS, RP1
BCF STATUS, IRP
MOVLW b'0000000'
MOVWF PORTD ;Configura todo el puerto d como salida.
MOVLW b'11110000' ;CONFIGURO TECLADO
MOVWF PORTB
MOVLW b'10001000' ;CONFIGURO BANDERAS DE CONTROL LCD Y LED INSERT Y TX RS232
MOVWF PORTC
Movlw b'11000100' ;configuro i/o para reset de tarjeta
MOVWF PORTA
MOVLW b'00000110'
Movwf adcon0 ; deshabilito conversor a/d entradas digitales
MOVLW B'00100100' ;CONFIGURACIÓN DE USART
BSF STATUS, 5
Movwf rcsta ;activación de transmisión ojo es txsta porque estoy en banco 1
BCF STATUS, 5
;9600 BAUDIOS
BSF STATUS, 5
MOVLW . 25
MOVWF TXREG ;OJO ES SPBRG PORQUE ESTOY EN BANCO 1
BCF STATUS, 5
BSF STATUS, 5
Bsf pir1, rcie ;habilita interrupción en recepción ojo es pie estoy en banco 1
BCF STATUS, 5 ;Cambio al banco 0
CALL CONFI_LCD
Movlw b'10010000' ;configuración USART para recepción continua
MOVWF RCSTA
MOVLW B'11000000'
Movwf intcon ;habilitación de las interrupciones en general
BUCLE GOTO BUCLE
;**********
;LECTURA
;*********
LECTURA
MOVLW 0x01
CALL LCDI
CALL TEMPO2
MOVLW 'L'
CALL LCDC
MOVLW 'E'
CALL LCDC
MOVLW 'Y'
CALL LCDC
MOVLW 'E'
CALL LCDC
MOVLW 'N'
CALL LCDC
MOVLW 'D'
CALL LCDC
MOVLW 'O'
CALL LCDC
CALL TX_DATO
CLRF TXREG
;MOVLW B'11000000'
;MOVWF INTCON
RETFIE
TX_DATO BCF PIR1,TXIF ;RESTAURA EL FLAG DEL SEÑALIZADOR
MOVLW .3
MOVWF COUNT
SIGUE2 MOVLW 'R'
Movwf txreg ;muevele byte a transmitir al registro de transmisión
BSF STATUS, 5
BCF STATUS, 6
BSF STATUS, 5
TX_DAT_W BTFSS RCSTA,TRMT ;FUE TRANSMITIDO EL BYTE? Ojo es txsta estoy en banco 1
GOTO TX_DAT_W
BCF STATUS,5 ;
BSF STATUS, 5
CLRF RCSTA ;OJO ES TXSTA ESTOY EN BANCO 1
BCF STATUS, 5
DECFSZ COUNT, 1
GOTO SIGUE2
BCF STATUS,5
RETURN
;***********************************
;COMANDOS DE CONTROL DE LCD
;************************************
;---RESET LCD-----
CONFI_LCD
CALL TEMPO2 ;RETARDO DE POWER ON
CALL de10ms ; wait for nice LCD startup! (>2mSec)
MOVLW b'00110000'
CALL de58us ;RETARDO DE 58us activa banderas E,RS.RW
CALL TEMPO1 ;wait for nice LCD startup! (>2mSec)
MOVLW b'00110000' ;A 8 BITS LCD
CALL LCDI ;HABILITACION DE COMANDO
MOVLW b'00111000' ;LCD PARA TRABAJAR CON 2 LINEAS
CALL LCDI ;HABILITACION DE COMANDO
MOVLW b'00000110' ;CURSOR A LA DERECHA
CALL LCDI ;HABILITACION DE COMANDO
MOVLW b'00001100' ;ACTIVA O DESACTIVA AL DISPLAY Y AL
;CURSOR Y DETERMINA SI PARPADEA O NO
CALL LCDI ;HABILITACION DE COMANDO
RETURN
;-------RUTINA PARA ENVIO DE COMANDOS DE CONTROL AL LCD-----
LCDI
BCF STATUS,5
BCF STATUS,6
BCF STATUS,7
BCF PORTC,LCD_RS ;HABILITA COMANDO
BSF PORTC,LCD_E
MOVWF PORTD
BCF PORTC,LCD_E
CALL TEMPO1 ;RETARDO
RETURN
;-------RUTINA PARA ENVIO DE DATOS AL LCD-----
LCDC
BCF STATUS,5
BCF STATUS,6
BCF STATUS,7
BSF PORTC,LCD_RS ;HABILITA ENVIO DE DATOS AL LCD
BSF PORTC,LCD_E
MOVWF PORTD
BCF PORTC,LCD_E
CALL TEMPO1
RETURN
TEMPO1 MOVLW 0x0D ;RETARDO1 ;UN PEQUEÑO RETARDO PARA LCD
MOVWF CONT1
CICLOT1 NOP
DECFSZ CONT1,1
GOTO CICLOT1
RETURN
;----------
TEMPO2 MOVLW 0x00 ;RETARDO2 ;UN PEQUEÑO RETARDO PARA LCD
MOVWF CONT2
CICLOT2 CALL TEMPO1
DECFSZ CONT2,1
GOTO CICLOT2
RETURN
;--------------------------------
de10ms ; SUBRUTINA PARA INICIAR SECUENCIA RESET EN LCD
BCF PORTC,LCD_RS
BSF PORTC,LCD_E
MOVWF PORTD
BCF PORTC,LCD_E
Movlw 0x3a
Movwf mcount
Loadn movlw 0x3a
Movwf ncount
Decn decfsz ncount, f
goto decn
decfsz mcount,f
goto loadn
return
;---------------------------------
de58us ; SUBRUTINA PARA INICIAR SECUENCIA RESET EN LCD
BCF PORTC,LCD_RS
BSF PORTC,LCD_E
MOVWF PORTD
BCF PORTC,LCD_E
CALL TEMPO1
RETURN
END
Dudas o sugerencias son bienvenidas
Ing Jorge Higuera P
Bucaramanga Colombia
email:[email protected]

1 respuesta más de otro experto

Respuesta
Te mando un curso de PIC's donde podrás encontrar eso y mucho más. Realmente es muy bueno.
http://personal3.iddeo.es/calaza/piccurso.htm

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas