Você está na página 1de 4

DAS 5305 - Informática Industrial I

Roteiro de Laboratório
Comunicação Serial no PIC 18F4550

1 Introdução
As atividades práticas exploram recursos da EUSART do microcontrolador PIC 18F4550 e de
programas para PC, com programação em linguagem C. Os seguintes recursos são utilizados:
• biblioteca de porta serial para MS-Windows;
• biblioteca de porta serial para compilador MCC18 (Microchip);
• escrita em visor LCD;
• interrupção de porta serial.
Para realização das atividades, os seguintes recursos são necessários:
• ambiente MPLAB v. 8.0 configurado para PIC 18F4550;
• compilador da linguagem C: MCC18 (disponı́vel no sı́tio da Microchip);
• documentação da biblioteca de comunicação serial, disponı́vel no endereço
www.das.ufsc.br/~werner/das5305/microControladores/PIC
• códigos-fonte disponı́veis no mesmo endereço acima.

2 Atividades
1. Obtenha o arquivo “aula Serial.rar” no endereço indicado acima, e execute o programa contido
no diretório “aula Serial” no kit de desenvolvimento Microgenios, bem como o programa
“serialConsole” a partir do ambiente Dev-C++ em PC. Mude a taxa de comunicação original
para 2400 bps, obtendo na documentação os passos necessários para tal modificação.
2. Modifique o programa do PIC para que o recebimento de caracteres seja feito com tratador
de interrupção, da seguinte forma:
• tratador com prioridade alta;
• atribuição de valor “1” a um flag especialmente criado como um atributo de bitfield para
que o programa principal realize uma espera ocupada no recebimento. A definição de
bitfields tem a seguinte sintaxe:
// Exemplo de declaraç~
ao e uso de um campo de bits
#define ON 1
struct flags
{
unsigned int bit1: 1; // cada membro de flags tem apenas 1 bit
unsigned int bit2: 1;
unsigned int bit3: 1;
} Semaforo; // declaraç~
ao de uma inst^
ancia
Semaforo.bit1 = ON; // atribuindo valor a um bit do semáforo
3. Modifique o programa anterior para realizar a transmissão com interrupções. Em vez de
manter o programa principal em espera ocupada, faça-o realizar a passagem (com “rotação”)
de um caracter pelo LCD, continuamente.

A Funções para uso do LCD


A biblioteca do visor de LCD a ser usada dispõe das seguintes funções:

extern void lcd_init(void);


extern void lcd_write(unsigned char);
extern void lcd_clear(void);
extern void lcd_puts(const rom char *);
extern void lcd_puts2(char *);
extern void lcd_putch(char);
extern void lcd_goto(unsigned char);
extern void lcd_putASCII(unsigned short);

Observe que não há funções prontas para escrita de variáveis inteiras (tipo int) e reais (tipo
float). Nesses casos, é preciso transformar as variáveis em strings, que são vetores de caracteres.
A definição de uma variável apta a manipular strings é feita conforme o exemplo a seguir:

char myString[10];

No exemplo, o número máximo de caracteres a ser armazenado é 9, pois as funções de manipulação


colocam 00H ao final de uma string para sinalizar o seu tamanho.
Para realizar as conversões de tipo e manipulação de strings, o compilador MCC18 dispõe de funções
descritas no documento MCC18 C Compiler Libraries, nas seções Data Conversion Functions e
Memory and String Manipulation Functions. O documento está disponı́vel no sı́tio da Microchip.
As seguintes tabelas fornecem um resumo das funções disponı́veis:

Figura 1: Funções de conversão de tipos (obtido de MCC18 C Compiler Libraries).


Figura 2: Funções de manipulação de strings (obtido de MCC18 C Compiler Libraries).

B Funções para uso da porta serial


As funções do compilador MCC18 para uso da porta serial estão descritas no documento MCC18 C
Compiler Libraries (ver acima). Para referência, as tabela abaixo apresenta um resumo das funções
disponı́veis. Recomenda-se também consultar o código fonte das funções na área de instalação do
MCC18, no diretório:

C:\MCC18\src\pmc_common\USART

C Tratador de interrupção no PIC 18F4550


Os trechos de código a seguir foram extraı́dos do exemplo de interrupções distribuı́do com o com-
pilador MCC18. Serão úteis para a obtenção da solução do problema de tratamento da serial por
interrupções.

void main ()
{
...
RCONbits.IPEN = 1; //enable priority levels
INTCONbits.GIEH = 1; //enable interrupts
...
}
Figura 3: Funções de uso da porta serial (obtido de MCC18 C Compiler Libraries).

//------------ High priority interrupt vector

#pragma code InterruptVectorHigh = 0x08


void InterruptVectorHigh (void)
{
_asm
goto InterruptHandlerHigh //jump to interrupt routine
_endasm
}

//--------------- High priority interrupt routine

#pragma code
#pragma interrupt InterruptHandlerHigh

void InterruptHandlerHigh ()
{
if (INTCONbits.TMR0IF)
{ //check for TMR0 overflow
INTCONbits.TMR0IF = 0; //clear interrupt flag
Flags.Bit.Timeout = 1; //indicate timeout
LATBbits.LATB0 = !LATBbits.LATB0; //toggle LED on RB0
}
}