Você está na página 1de 10

Universidade Federal do Ceará - UFC

Centro de Tecnologia
Departamento de Engenharia Elétrica
Disciplina de Microcontroladores
Semestre 2020.2

Prática 04

Aluno: Luan Rocha do Amaral - 472237;


Pedro Herysson Almeida da Silva - 472178
Curso: Engenharia Elétrica
Professor: Diego

Fortaleza, 24/01/2021
Conteúdo
1. Para esta questão, foi habilitada a comunicação serial no registrador RCSTA, e o
registrador TXSTA responsável pelas configurações de transmissão, foi configurado para,
9600 de baud rate, 8 bits, sem paridade, 1 bit de start e 1 bit de parada. Logo em
seguida, foi criado uma sub-rotina de atraso de 10 milissegundos, dentro de um loop
infinito, que tem como função atrasar o envio do caractere "A"por 10 milissegundos, com
isto, a função do programa é enviar o caractere "A"(equivalente binário é: 01000001), a
cada 10 milissegundos pela transmissão serial.

Figura 1: Sinal no osciloscópio mostrando o envio serial do caractere A

1
2. O caso da segunda questão, é apenas fazer uma alteração do código desenvolvido
da primeira questão, onde é inserido um botão, que foi escolhido pra ser inserido no
PORTB, pino 0, e dependendo do estado desse botão, troca o envio do caractere "A"para
o caractere "X", de forma detalhada, quando o estado do botão for 0, continua enviando
o caractere "A"a cada 10 milissegundos, quando o estado do botão for 1, envia o caractere
"X"a cada 10 milissegundos.

2
Figura 2: Sinal no osciloscópio mostrando o envio serial do caractere A

Figura 3: Sinal no osciloscópio mostrando o envio serial do caractere X

3
4
3. Inicialmente apenas configuramos os registradores para habilitar a interrupção serial
e o programa principal fica em loop, enquanto todo o processamento é realizado na inter-
rupção da recepção serial. Utilizamos os valores dados pelo datasheet para configurar o
baud rate da comunicação serial.

Entrando na interrupção, o programa compara o valor que chegou com os caracteres


A,S,X e Z. realizando os comandos:
• A → Acende led1
• Z → Apaga led1
• S → Acende led2
• X → Apaga led2
include p16f628a.inc ; Include register definition file
LF EQU 0X0A
CR EQU 0X0D

DEFINE LD1 PORTB,6


DEFINE LD2 PORTB,7
RXR EQU 0X22 ;RECIEVER REGISTER

ORG 0X0000
GOTO START
ORG 0X0004
GOTO INT_USART

START
BANKSEL TRISB
MOVLW B’00111111’
MOVWF TRISB
MOVLW B’00100010’ ;LOW SPEED MODE
MOVWF TXSTA
MOVLW B’00100000’; APENAS INT RX
MOVWF PIE1
MOVLW D’15’
MOVWF SPBRG ; BAUD RATE 9600
BANKSEL INTCON
MOVLW B’11000000’
MOVWF INTCON
MOVLW B’10010000’
MOVWF RCSTA

LOOP
GOTO LOOP

INT_USART

5
BCF PIR1,RCIF
MOVFW RCREG
MOVWF RXR
MOVLW ’A’
SUBWF RXR, W
BTFSC STATUS, Z
BSF LD1 ;ACENDE LED1
MOVLW ’Z’
SUBWF RXR, W
BTFSC STATUS, Z
BCF LD1; APAGA LED1
MOVLW ’S’
SUBWF RXR, W
BTFSC STATUS, Z
BSF LD2; ACENDE LED2
MOVLW ’X’
SUBWF RXR, W
BTFSC STATUS, Z
BCF LD2 ;APAGA LED2
RETFIE
END

4. A quarta questão é uma extensão da terceira mantendo a mesma sintaxe inicial da


terceira. A extensão feita é a comparação do caractere K. Se for mandado ele printa a
string "LUAN E HERYSSON!! :)". Para isso foi feito uma tabela com esses caracteres
e uma função que printa toda uma string. Para isso, utilizamos o registrador PCL para
pegar a string da tabela feita. Na função print temos um registrador que aponta a
posição da string, um registrador que aponta a posição do caractere dentro da string, um
registrador auxiliar e uma flag de final de string. A função chama uma rotina chamada
GET_CHAR que vai buscar o próximo caractere que deve ser printado. Após isso, o
programa chama a subrotina END_TABLE que vai colocar 1 na flag de final de string se
a string tiver acabado, ou seja, se a o caractere for 0x00. Se o a string nao tiver acabado o
caractere é printado na serial, se tiver acabado a função termina. Por fim, temos a função
WAIT_TX, que fica presa nessa função até que o caractere seja completamente mandado
pela serial.
include p16f628a.inc ; Include register definition file
LF EQU 0X0A
CR EQU 0X0D

DEFINE LD1 PORTB,6


DEFINE LD2 PORTB,7
RXR EQU 0X22 ;RECIEVER REGISTER

6
ORG 0X0000
GOTO START
ORG 0X0004
GOTO INT_USART

START
BANKSEL TRISB
MOVLW B’00111111’
MOVWF TRISB
MOVLW B’00100010’ ;LOW SPEED MODE
MOVWF TXSTA
MOVLW B’00100000’; APENAS INT RX
MOVWF PIE1
MOVLW D’15’
MOVWF SPBRG ; BAUD RATE 9600

BANKSEL INTCON
MOVLW B’11000000’
MOVWF INTCON
MOVLW B’10010000’
MOVWF RCSTA

LOOP
GOTO LOOP

INT_USART
BCF PIR1,RCIF
MOVFW RCREG
MOVWF RXR
MOVLW ’A’
SUBWF RXR, W
BTFSC STATUS, Z
BSF LD1 ;ACENDE LED1
MOVLW ’Z’
SUBWF RXR, W
BTFSC STATUS, Z
BCF LD1; APAGA LED1
MOVLW ’S’
SUBWF RXR, W
BTFSC STATUS, Z
BSF LD2; ACENDE LED2
MOVLW ’X’
SUBWF RXR, W
BTFSC STATUS, Z
BCF LD2 ;APAGA LED2
MOVLW ’K’
SUBWF RXR, W

7
BTFSC STATUS, Z
GOTO PRINT_LUAN_HERYSSON
END_INT
RETFIE

PRINT_LUAN_HERYSSON
MOVLW STRING
CALL PRINT
RETFIE

;========================================================

;FUNÇÃO QUE ENVIA AUTOMATICAMENTE UMA TABELA PELA SERIAL;


PRINT
PTB EQU 0X23
POC EQU 0X24 ;POSITION OF CARACTERE
PRT EQU 0X25 ;POSIÇÃO REFERENTE A TABELA
PAV EQU 0X26 ;PRINT AUXILIAR VARIABLE

DEFINE FET 0X21, 0 ; FLAG END TABLE


CLRF POC
BCF FET
MOVWF PTB
SEND
;ENVIA O VALOR DA STRING PARA W
CALL GET_CHAR
; CONFERE SE A STRING TERMINOU
CALL END_TABLE
BTFSC FET
RETURN ;TERMINOU O ENVIO DA TABELA

MOVWF TXREG ; ESCREVE NA SERIAL


CALL WAIT_TX ; ESPERA TERMINAR O ENVIO NA SERIAL
INCF POC ;NEXT CHAR
GOTO SEND

GET_CHAR
MOVFW POC
MOVWF PRT
MOVFW PTB ; PONTEIRO DA POSIÇÃO DA STRING
ADDWF PRT, F
MOVFW PRT
MOVWF PCL

END_TABLE
MOVWF PAV

8
INCF PAV, F
DECF PAV, F
BTFSC STATUS, Z
BSF FET ;END TABLE
RETURN

WAIT_TX
BTFSS PIR1, TXIF
GOTO WAIT_TX
BCF PIR1, TXIF
RETURN
;========================================================

STRING
RETLW LF
RETLW CR
RETLW ’L’
RETLW ’U’
RETLW ’A’
RETLW ’N’
RETLW ’’
RETLW ’’
RETLW ’’
RETLW ’H’
RETLW ’E’
RETLW ’R’
RETLW ’Y’
RETLW ’S’
RETLW ’S’
RETLW ’O’
RETLW ’N’
RETLW ’ !’
RETLW ’ !’
RETLW ’’
RETLW ’:’
RETLW ’)’
RETLW ’0’
RETLW LF
RETLW CR
RETLW 0

END

Você também pode gostar