comunicacion pc pic
TRANSCRIPT
2010
COMUNICACIÓN PC – PIC16F876ARedes IndustrialesIng. Isidro Domínguez
SANDY MANUELA SÁNCHEZ LÓPEZSERGIO ABEL GÓMEZ JIMÉNEZKARINA GARCÍA JIMÉNEZ
INGENIERÍA MECATRÓNICA8A
COMUNICACIÓN PC A PIC LLLLLLLLLLL
UNIVERSIDAD TECNOLÓGICA DE CAMPECHE
INTRODUCCIÓN
En las prácticas anteriores se observa cómo se realiza la comunicación entre el puerto RS
232 y el puerto USB. En esta práctica se observará la transmisión que se realiza de la PC al
PIC 16f876A. La transmisión se realiza del puerto USB al puerto RS232 de la placa S –
120 de Solaris digital, el envío de datos se realiza en el programa NIPLE 5.2 el cual es
como un interfaz gráfico en donde se puede visualizar el envío y recepción de los paquetes
de bits. El envío se realiza de forma decimal y la recepción se visualiza de manera binaria,
en forma binaria y de acuerdo a la lógica de 1 es voltaje y 0 es bajo voltaje, se realiza el
envío a las salidas del PIC y de visualiza en los destellos de los leds. Al mismo tiempo que
recibe, envía la información de los datos que está recibiendo y los envía a la PC
mostrándolo así en la pantalla del NIPLE.
OBJETIVO
El objetivo es transmitir los datos de la maquina al pic y que se muestre en unos leds esa
información retorna a la pc de nuevo, comprender como es que esta trabajando el pic y la
pc en sincronía.
MATERIALES Y EQUIPOS UTILIZADOS
1 pic16f876A
1 Cristal de cuarzo
2 capacitores de 22 Pf
8 resistencias 220 Ohms
1 Resistencia 10Kh
8 leds
PC
Programador
1 push button
1 protoboard
Tarjeta Solaris – 120
Cable RS 232 a USB
Cable UTP
DESARROLLO DE LA PRÁCTICA
Primero se realiza el programa en el software NIPLE 5.2 el cual se muestra a continuación
y se describe cómo funciona.
Primero se declaran los registros que es enviar y recibir, el segundo paso es declarar los
puertos como estrada y como salida en esta ocasión el bit 8 del puerto C es entrada y los
demás son salidas el puerto B se toma todo como salida ya que alli se mostrara la
información, tercer paso recibir la información que envia la pc lo configuramos y se
configura la interrupción el cual solo permite recibir los datos y no deja hacer ninguna otra
función
Cuarto paso se manda a escribir esa información en el puerto B, el quinto se mandan a
pagar los Led y el ultimo paso se envía la información de nuevo a la PC.
A continuación se muestra el programa realizado en MPLAB
;------------------------------------------------------------
; Código assembler generado por Niple V5.2.0
; Proyecto: 41
; Autor: Sandy Sánchez López, Sergio Abel Jiménez Gómez, Karina García Jiménez
; Fecha: 15/03/2010
; PIC: 16F876A
; Velocidad de reloj: 4 Mhz
; Descripcion:
;------------------------------------------------------------
LIST P=PIC16F876A
_XT_OSC equ 0x3FFD
_DEBUG_OFF equ 0x3FFF
_WDT_OFF equ 0x3FFB
_PWRTE_ON equ 0x3FF7
_BODEN_OFF equ 0x3FBF
_LVP_OFF equ 0x3F7F
_CPD_OFF equ 0x3FFF
_CP_OFF equ 0x3FFF
_WRT_ENABLE_OFF equ 0x3DFF
__config _XT_OSC & _DEBUG_OFF & _WDT_OFF & _PWRTE_ON &
_BODEN_OFF & _LVP_OFF & _CPD_OFF & _WRT_ENABLE_OFF & _CP_OFF
;------------------------------------------------------------
; Declaración de Registros
;------------------------------------------------------------
w equ 0x0000
status equ 0x0003
portb equ 0x0006
portc equ 0x0007
pclath equ 0x000a
intcon equ 0x000b
pir1 equ 0x000c
rcsta equ 0x0018
txreg equ 0x0019
rcreg equ 0x001a
_np_w equ 0x0020
recibir equ 0x0021
enviar equ 0x0022
_np_chks_1 equ 0x0025
_np_chks_2 equ 0x0026
_np_aviso equ 0x0027
_np_temp1 equ 0x0028
_np_temp2 equ 0x0029
_np_status equ 0x002f
_np_tiempo equ 0x0031
_np_tiempo1 equ 0x0033
_np_tiempo2 equ 0x0034
_np_tiempo3 equ 0x0035
_np_banderas2 equ 0x0039
opcion equ 0x0081
trisb equ 0x0086
trisc equ 0x0087
pie1 equ 0x008c
txsta equ 0x0098
spbrg equ 0x0099
;------------------------------------------------------------
; Declaración de Bits
;------------------------------------------------------------
c equ 0 ;carry / borrow bit
cren equ 4 ;
gie equ 7 ;habilitador general de interrupciones
peie equ 6 ;ee write complete interrupt enable bit
rcie equ 5 ;
rcif equ 5 ;bandera de interrupcion por fin de recepción usart.
rp0 equ 5 ;registrer bank select bit
rp1 equ 6 ;registrer bank select bit
spen equ 7 ;
txif equ 4 ;bandera de interrupcion por fin de transmisión usart.
z equ 2 ;bit cero
sub_inte equ 0 ;bandera de subrrutina cancelada por interrupcion.
;------------------------------------------------------------
; Inicio
;------------------------------------------------------------
reset org 0
goto paso2
org 4
movwf _np_w
swapf _np_w,1
movf status,w
bcf status,rp0 ;cambiar a banco 0
bcf status,rp1
movwf _np_status
bcf status,rp0 ;cambiar a banco 0
bcf status,rp1
btfsc pir1,rcif
goto interrupción_rc
salir_interrupcion
bsf _np_banderas2,sub_inte ;activar la bandera de rutina cancelada por interrupcion
movf _np_status,w
movwf status
swapf _np_w,w
retfie
;------------------------------------------------------------
; inicio de la interrupción por rc usart
;------------------------------------------------------------
interrupción_rc_salir
bcf pir1,rcif
goto salir_interrupcion
interrupción_rc
inte_rc_usart_2_esperar_byte_1
bcf status,rp0 ;cambiar a banco 0
bcf status,rp1
btfss pir1,rcif
goto inte_rc_usart_2_esperar_byte_1
movf rcreg,w
movwf recibir
bcf pir1,rcif
inte_rc_usart_2_esperar_byte_2
btfss pir1,rcif
goto inte_rc_usart_2_esperar_byte_2
movf rcreg,w
movwf enviar
bcf pir1,rcif
inte_rc_usart_2_esperar_byte_3
btfss pir1,rcif
goto inte_rc_usart_2_esperar_byte_3
movf rcreg,w
movwf _np_chks_2
bcf pir1,rcif
inte_rc_usart_2_esperar_byte_4
btfss pir1,rcif
goto inte_rc_usart_2_esperar_byte_4
movf rcreg,w
movwf _np_chks_1
bcf pir1,rcif
clrf _np_chks_1
clrf _np_chks_2
clrf _np_aviso
clrf _np_temp1
clrf _np_temp2
movf recibir,w
movwf _np_temp1
call checksum
movf enviar,w
movwf _np_temp1
call checksum
inte_rc_usart_3
goto interrupción_rc_salir
;------------------------------------------------------------
; programa principal
;------------------------------------------------------------
paso2
movlw b'10000000' ;configurar el puerto c como esssssss
bsf status,rp0 ;cambiar a banco 1
bcf status,rp1
movwf trisc
movlw b'00000000' ;configurar el puerto b como ssssssss
movwf trisb
paso4
movlw b'00100110'
bsf status,rp0 ;cambiar a banco 1
bcf status,rp1
movwf txsta
movlw .25
movwf spbrg
bcf status,rp0 ;cambiar a banco 0
bsf rcsta,spen ;habilitacion del puerto de comunicacion serial
bsf rcsta,cren
bsf intcon,gie ;activar habilitador general de interrupciones.
bsf intcon,peie ;activar habilitador general de interrupciones por perifericos.
bsf status,rp0 ;cambiar a banco 1
bsf pie1,rcie ;activar interrupción por fin de recepción por usart.
;escribir en el puerto b
bcf status,rp0 ;cambiar a banco 0
movf enviar,w
movwf portb
movlw .1 ;temporizador 1 seg
call tiempo_1_255_mega_c
;escribir en el puerto b
movlw d'0'
movwf portb
bcf intcon,gie ;desactivar habilitador general de interrupciones.
movf enviar,w ;enviar el dato enviar
movwf _np_temp1
call rs232_tc6_9600
bsf intcon,gie ;activar habilitador general de interrupciones.
movlw .1 ;temporizador 1 seg
call tiempo_1_255_mega_c
goto paso4 ;cierra el ciclo
;------------------------------------------------------------
; Declaración de Subrutinas
;------------------------------------------------------------
checksum
;calculo de checksum
bcf status,rp0 ;cambiar a banco 0
bcf status,rp1
btfsc _np_aviso,0
goto checksum_1
bsf _np_aviso,0
movlw .255
movwf _np_chks_1
movwf _np_chks_2
checksum_1
movf _np_temp1,w
xorwf _np_chks_2,1
clrf _np_temp2
checksum_2
incf _np_temp2,1
movf _np_temp2,w
bcf status,2
sublw .9
btfsc status,2
goto checksum_salir
bcf status,0
rrf _np_chks_1,1
rrf _np_chks_2,1
btfss status,0
goto checksum_2
movlw b'00000001'
xorwf _np_chks_2,1
movlw b'10100000'
xorwf _np_chks_1,1
goto checksum_2
checksum_salir
return
tiempo_1_255_mega_c
movwf _np_tiempo
goto tiempo_1_255_mega_c_1
tiempo_1_255_mega_c_bucle2
nop
nop
nop
nop
nop
nop
nop
tiempo_1_255_mega_c_1
movlw .10
movwf _np_tiempo1
tiempo_1_255_mega_c_bucle1
nop
nop
movlw .99
movwf _np_tiempo2
tiempo_1_255_mega_c_bucle0
nop
nop
nop
movlw .200
movwf _np_tiempo3
tiempo_1_255_mega_c_bucle
nop
nop
decfsz _np_tiempo3,1
goto tiempo_1_255_mega_c_bucle
nop
nop
nop
decfsz _np_tiempo2,1
goto tiempo_1_255_mega_c_bucle0
nop
nop
nop
decfsz _np_tiempo1,1
goto tiempo_1_255_mega_c_bucle1
decfsz _np_tiempo,1
goto tiempo_1_255_mega_c_bucle2
return
rs232_tc6_9600
;enviar un dato rs232 por portc,6 (por usart)
movlw b'00100110'
bsf status,rp0 ;cambiar a banco 1
bcf status,rp1
movwf txsta
movlw .25
movwf spbrg
bcf status,rp0 ;cambiar a banco 0
bsf rcsta,spen
movf _np_temp1,w
movwf txreg
rs232_tc6_9600_eperar
btfss pir1,txif
goto rs232_tc6_9600_eperar
return
End
Ahora se mostrará la transferencia de datos a través dela pc y el pic
Como se mostró en las figuras anteriores se pudo transmitir datos de la PC al pic y viceversa.
CONCLUSIÓN
La práctica anterior se llevo a cabo utilizando los recursos que están a nuestro alcance, se
comprendió como se transmiten los datos lo principal de esto es la programación uno se
cumplió con los objetivos puestos anteriormente, y se notó como la representación de bits
en el protoboard y como lo mostraba el programa se cumplió y se muestra de manera
práctica en el video anexo a este trabajo. Entonces con esto concluimos nuestra práctica
realizando el objetivo que era hacer la comunicación entre el PC y el PIC16F876A.