10
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ón TECLA EQU 0X21 SELECT EQU 0X22 COM_LIBRE EQU 0X26 COM_TECLA EQU 0X27 __CONFIG _CP_OFF & _WDT_OFF & _BODEN_ON & _PWRTE_ON & _HS_OSC & _WRT_OFF & _LVP_OFF & _CPD_OFF org 0x0000 GOTO INICIO ;va al inicio del programa org 0x0005 INICIO CLRF STATUS BSF STATUS,RP0 ;banco 1 MOVLW 0X06 MOVWF ADCON1 ;Todo el puerto A es Digital MOVLW 0XFF MOVWF TRISA ;Todo el puerto A son entradas CLRF TRISB CLRF STATUS CLRF PORTB MOVLW 0X80 MOVWF SELECT CLRF 0X23 CLRF 0X24 CLRF 0X25

Informe Proyecto microcontroladores

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 vemos el dato recibido en el Puerto B del PIC:

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.

Y lo recibimos en MATLAB: