Upload
independent
View
1
Download
0
Embed Size (px)
Citation preview
En este laboratorio utilizaremos MATLAB para recibir datos del microcontrolador PIC16F877A, como también enviar datos de MATLAB a este microcontrolador.
Haremos un programa en assembler que nos permita utilizar al PIC en modo transmisor y receptor de un byte vía serial.El programa es el siguiente.
list p=16f877a#include <p16f877a.inc>
COMP EQU 0X20 ;es para saber si se ha presionado una tecla
;este registro se compara con el código de la tecla
;y de acuerdo a eso se toma una desiciónTECLA EQU 0X21SELECT EQU 0X22COM_LIBRE EQU 0X26COM_TECLA EQU 0X27
__CONFIG _CP_OFF & _WDT_OFF & _BODEN_ON & _PWRTE_ON & _HS_OSC & _WRT_OFF & _LVP_OFF & _CPD_OFF
org 0x0000GOTO INICIO ;va al inicio del
programaorg 0x0005
INICIOCLRF STATUSBSF STATUS,RP0 ;banco 1MOVLW 0X06MOVWF ADCON1 ;Todo el puerto A es DigitalMOVLW 0XFFMOVWF TRISA ;Todo el puerto A son
entradasCLRF TRISBCLRF STATUSCLRF PORTBMOVLW 0X80MOVWF SELECTCLRF 0X23CLRF 0X24CLRF 0X25
CALL TECLADO_INI ;congigura el tecladoBUCLE
BTFSS PORTA,0GOTO ENVIARBTFSS PORTA,3GOTO RECIBIR
MOVLW 0X40MOVWF COM_LIBREMOVLW 0X06MOVWF COM_TECLACALL SCAN_TECLADO ;escanea el tecladoMOVWF TECLA ;escribe el código 7
segmentosMOVF TECLA,WSUBWF COM_LIBREBTFSC STATUS,ZGOTO BUCLESUBWF COM_TECLABTFSC STATUS,ZGOTO UNO
CERO RRF SELECTCALL DELAYGOTO BUCLE
UNO MOVF SELECT,WADDWF PORTB,FGOTO CERO
TECLADO_INICLRF STATUS ;banco 0 RP1=0 , RP0=0BSF STATUS,RP0 ;banco 1 RP1=0 , RP0=1MOVLW 0X0F ;nible alto como salida, MOVWF TRISD ;nible bajo como entradaBCF STATUS,RP0 ;banco 0 RP1=0 , RP0=0CLRF PORTD ;borra el puerto dRETURN
SCAN_TECLADOMOVLW 0XF0 ;almacena este númeroMOVWF COMP ;para luego hacer una restaMOVWF PORTD ;las columnas estan en 1111BTFSC PORTD,0 ;pregunta si esta fila esta a
0CALL DETECTED ;si es falso la detectaBTFSC PORTD,1 ;pregunta si esta columna
esta a 0CALL DETECTED ;si es falso la detecta
BTFSC PORTD,2 ;pregunta si esta columna esta a 0
CALL DETECTED ;si es falso la detectaBTFSC PORTD,3 ;pregunta si esta columna
esta a 0CALL DETECTED ;si es falso la detectaSUBWF COMP,F ;le resta a COMP el
valor de wBTFSS STATUS,Z ;pregunta si el resultado es
0RETURN ;de no ser asi es
porque se ha presionado una tecla RETLW 0X40 ;caso contrario no se
presionó y ;retorna el código del "-"
cuando no hay tecla presionadaDETECTED
MOVLW 0X10 ;mueve 0001XXXX al PORTDMOVWF PORTD ;para scanear en la fila ABTFSC PORTD,0 ;pregunta si esta columna
esta a 0RETlW 0X06 ;si es falso retorna el
código 7 segmentos del "1"BTFSC PORTD,1 ;pregunta si esta columna
esta a 0RETlW 0X66 ;si es falso retorna el
código 7 segmentos del "4"BTFSC PORTD,2 ;pregunta si esta columna
esta a 0RETlW 0X27 ;si es falso retorna el
código 7 segmentos del "7"BTFSC PORTD,3 ;pregunta si esta columna
esta a 0RETlW 0X79 ;si es falso retorna el
código 7 segmentos del "E"
MOVLW 0X20 ;mueve 0010XXXX al PORTDMOVWF PORTD ;para scanear en la fila BBTFSC PORTD,0 ;pregunta si esta columna
esta a 0RETlW 0X5B ;si es falso retorna el
código 7 segmentos del "2"BTFSC PORTD,1 ;pregunta si esta columna
esta a 0RETlW 0X6D ;si es falso retorna el
código 7 segmentos del "5"BTFSC PORTD,2 ;pregunta si esta columna
esta a 0RETlW 0X7F ;si es falso retorna el
código 7 segmentos del "8"
BTFSC PORTD,3 ;pregunta si esta columna esta a 0
RETlW 0X3F ;si es falso retorna el código 7 segmentos del "0"
MOVLW 0X40 ;mueve 0100XXXX al PORTDMOVWF PORTD ;para scanear en la fila CBTFSC PORTD,0 ;pregunta si esta columna
esta a 0 RETlW 0X4F ;si es falso retorna el código 7 segmentos del "3"
BTFSC PORTD,1 ;pregunta si esta columna esta a 0
RETlW 0X7D ;si es falso retorna el código 7 segmentos del "6"
BTFSC PORTD,2 ;pregunta si esta columna esta a 0
RETlW 0X6F ;si es falso retorna el código 7 segmentos del "9"
BTFSC PORTD,3 ;pregunta si esta columna esta a 0
RETlW 0X71 ;si es falso retorna el código 7 segmentos del "F"
MOVLW 0X80 ;mueve 1000XXXX al PORTDMOVWF PORTD ;para scanear en la fila DBTFSC PORTD,0 ;pregunta si esta columna
esta a 0RETlW 0X77 ;si es falso retorna el
código 7 segmentos del "A"BTFSC PORTD,1 ;pregunta si esta columna
esta a 0RETlW 0X7C ;si es falso retorna el
código 7 segmentos del "B"BTFSC PORTD,2 ;pregunta si esta columna
esta a 0RETlW 0X39 ;si es falso retorna el
código 7 segmentos del "C"BTFSC PORTD,3 ;pregunta si esta columna
esta a 0RETlW 0X5E ;si es falso retorna el
código 7 segmentos del "D"RETLW 0X40 ;retorna el código del "-"
cuando no hay tecla presionada
ENVIARCALL DELAYCLRF STATUSBSF STATUS,RP0 ;banco 1BCF TXSTA,BRGH ;pone bit BRGH=0 (velocidad
baja)
MOVLW .25 ;valor para 9615 Bauds (Fosc=16 Mhz)
MOVWF SPBRG ;configura 9615 BaudsBCF TXSTA,SYNC ;limpia bit SYNC (modo
asíncrono)BSF TXSTA,TXEN ;pone bit TXEN=1 (habilita
transmisión)BCF STATUS,RP0 ;banco 0BSF RCSTA,SPEN ;pone bit SPEN=1 (habilita
puerto serie)
BSF STATUS,RP0 ;banco 1LOOP BTFSS TXSTA,TRMT ;testea el buffer de transmisión
GOTO LOOPBCF STATUS,RP0 ;banco 0MOVF PORTB,W ;mueve el valor que hay en el
puerto B a wMOVWF TXREG ;mueve el dato a enviarGOTO BUCLE ;Regresa a esperar el
siguiente pulso en RA0
RECIBIRCLRF STATUSBSF STATUS,RP0 ;banco 1BCF TXSTA,BRGH ;pone bit BRGH=0 (velocidad
baja)MOVLW .25 ;valor para 9615 Bauds
(Fosc=16 Mhz)MOVWF SPBRG ;configura 9615 BaudsBCF TXSTA,SYNC ;limpia bit SYNC (modo
asíncrono)BCF STATUS,RP0 ;banco 0BSF RCSTA,SPEN ;pone bit SPEN=1 (habilita
puerto serie)BSF RCSTA,CREN ;Habilita recepciónCLRF PORTB ;Inicializa en cero el puerto
B
LOOP2BTFSS PIR1,RCIF ;testea el buffer de
recepciónGOTO LOOP2MOVF RCREG,W ;mueve el valor que hay en
RCREG a wMOVWF PORTB ;luego lo mueve al puerto bGOTO LOOP2 ;regresa a esperar el
siguiente dato
DELAY ;Delay de 500ms
MOVLW 0X0AMOVWF 0X25
AQUI DECFSZ 0X23GOTO AQUIDECFSZ 0X24GOTO AQUIDECFSZ 0X25GOTO AQUIRETURN
END
Y en MATLAB haremos otro programa que nos permita también transmitir y recibir datos de tamaño Byte via serial. El Programa en MATLAB es el siguiente.
Puerto_Serie=serial('COM1','BaudRate',9600)fopen(Puerto_Serie) while 1opcion=input('Ingrese 1 para Trasmitir, o 2 para Recibir : ') if opcion==1 dato=input('Escriba el dato para trasmitir : ') fwrite(Puerto_Serie,dato,'uchar') end if opcion==2 Dato_recibido=fread(Puerto_Serie,1,'uchar') end end
Para simular nuestro laboratorio utilizaremos VIRTUAL SERIAL PORT v6.9 este software permite emular par de
puertos seriales que nos servirán para comunicar matlab conel PIC desde proteus.
Enviando un Byte por Matlab:
Corremos el programa:
Simulamos en PROTEUS, Damos un pulso de nivel bajo en el RA3 del PIC para entrar en modo Receptor:
Regresamos a MATLAB y escribimos 1 para enviar, luego escribimos el dato que queremos trasmitir damos enter:
Y ahora recibiendo un Byte en MATLABEscribimos 2 para recibir un dato damos enter he inmediatamente, desde el PROTEUS, escribimos el dato con elteclado alfanumérico el dato en binario, luego damos un pulso de nivel bajo en RA0 del PIC para enviar el dato.