• Nenhum resultado encontrado

Registros de conguração do microcontrolador

No documento ELT024-NotasAulaLimpo (páginas 50-54)

A maioria dos terminais dos microcontroladores podem ser congurados para trabalhar de diversas maneiras. Esta conguração é realizada através de registros especiais. Estes registros são posições de memória pré-denidos pelo fabricante. Para conhecer quais são e o que fazem é preciso recorrer ao datasheet do componente.

Além dos registros de conguração dos terminais existem registros que indicam como o mi- crocontrolador deve operar. O microcontrolador PIC18f4550 possui dez registros que controlam seu modo de operação, velocidade, modo de gravação, etc. Estes registros são apresentados na Figura 3.6.

Dos registros apresentados na Figura 3.6, quatro precisam necessariamente ser congurados para que o sistema possa funcionar. Dois deles tem relação com a conguração do sistema de clock: um especica qual é a fonte do sinal de clock, que no caso da placa em questão é um cristal externo, e ooutro indica qual o prescaler a ser usado (PLL).

Figura 3.6: Registros de conguração do microcontrolador PIC 18F4550

Além de congurar a frequência básica do clock é necessário desligar o watchdog. Este é um circuito para aumentar a segurança do sistema embarcado desenvolvido. Para funcionar corretamente o programa deve ser preparado para tal nalidade. Ele será explicado em detalhes na seção 4.13 e por isso será mantido desligado nos próximos exemplos.

A ultima conguração necessária é desabilitar a programação em baixa tensão. Devido às ligações feitas na placa, deixar esta opção ligada impede o funcionamento da placa enquanto estiver ligada ao gravador. Abaixo o trecho de código que realiza estas congurações para o compilador SDCC.

code char at 0x300000 CONFIG1L = 0x01; // Pll desligado

code char at 0x300001 CONFIG1H = 0x0C; // Oscilador c/ cristal externo HS

code char at 0x300003 CONFIG2H = 0x00; // Watchdog controlado por software

code char at 0x300006 CONFIG4L = 0x00; // Sem programação em baixa tensão

A primeira coluna de números indica a posição do registro que armazena as congurações. A segunda coluna representa os códigos utilizados para conguração. Para conhecer as demais opções de congurações devemos consultar o manual do usuário.

Estas congurações são dependentes do compilador a ser usado. A seguir demonstramos os códigos necessários para o compilador C18 da Microchip(R).

#pragma config FOSC = HS // Oscilador c/ cristal externo HS

#pragma config CPUDIV = OSC1_PLL2 // Pll desligado

#pragma config WDT = OFF // Watchdog controlado por software

#pragma config LVP = OFF // Sem programação em baixa tensão

Notar que as diretivas utilizadas são completamente diferentes, mas realizam o mesmo trabalho.

Capítulo 4

Programação dos Periféricos

In theory, there is no dierence between theory and practice; In practice, there is. - Chuck Reid

Periféricos são os componentes, circuitos ou sistemas ligados ao microcontrolador, interna ou externamente. Eles podem ser utilizados para realizar interface entre o homem e o equipamento ou incluir funcionalidades extras ao sistema, como comunicação, segurança, etc.

Os periféricos de saída1 que serão abordados neste curso serão:

ˆ Barramento de Led's(4.3) ˆ Display de 7 segmentos(4.4) ˆ Display LCD 2x16(4.6) ˆ Saídas PWM(4.9)

Entre os periféricos de entrada2 temos:

ˆ Leitura de teclas(4.5) ˆ Conversor AD(4.8)

Além de sistemas de entrada e saída de dados será abordado um dispositivo de comunicação (RS232), um tratador de Interrupção(4.12), um Timer(4.10) e um dispositivo de segurança: Watchdog(4.13).

4.1 Acesso às "portas" do microcontrolador

O microcontrolador possui "portas" que permitem o interfaceamento do meio externo para o meio interno. Algumas portas podem trabalhar como receptoras ou transmissoras de sinais. Algumas podem operar dos dois modos sendo necessário congurá-las antes de sua utilização.

O microcontrolador PIC 18F4550 possui 5 portas ˆ PORTA: bidirecional com 7 bits

1Periféricos que fornecem informações aos usuários ou enviam comandos da a placa eletrônica para o meio

externo

ˆ PORTB: bidirecional com 8 bits ˆ PORTC: bidirecional com 7 bits ˆ PORTD: bidirecional com 8 bits

ˆ PORTE: 3 bits bidirecionais e 1 bit apenas entrada

Cada porta esta ligada à dois endereços de memória. O primeiro armazena o valor que queremos ler do meio externo ou escrever para o meio externo dependendo da conguração. O segundo endereço realiza esta conguração indicando quais bits serão utilizados para entrada e quais serão utilizados para saída (Tabela 4.1).

Tabela 4.1: Endereços de memória para as portas do PIC 18F4550 Porta Endereço dos da-dos Endereço(TRIS) de conguração

PORTA 0xF80 0xF92

PORTB 0xF81 0xF93

PORTC 0xF82 0xF94

PORTD 0xF83 0xF95

PORTE 0xF84 0xF96

Aqui o conceito de ponteiros se faz extremamente necessário. Já que conhecemos os ende- reços xos onde as portas se encontram, podemos criar ponteiros para tais endereços de forma que possamos utilizar as portas como se fossem variáveis. Exemplo:

//inicio do programa

void main(void) interrupt 0 {

//definimos como:

//unsigned char: pois os 8 bits representam valores //volatile: as variáveis podem mudar a qualquer momento //near: indica posicionamento do registro esta na memória

volatile near unsigned char *PORTD = 0xF83;

volatile near unsigned char *TRISD = 0xF95;

//configurando todos os pinos como saídas // 0 = saída (Output)

// 1 = entrada (Input)

*TRISD = 0b00000000;

//liga apenas os quatro últimos leds

*PORTD = 0b11110000;

//mantém o sistema ligado indefinidamente

for(;;); }

Notar que por serem ponteiros, sempre que precisarmos utilizar o valor tais variáveis é necessário que coloquemos o asterisco.

Uma outra maneira de manipular as portas é criar denes que permitem o uso das portas como variáveis, sem a necessidade de utilizar ponteiros de modo explicito, nem asteriscos no código.

//defines para portas de entrada e saída

#define PORTD (*(volatile near unsigned char*)0xF83) #define TRISD (*(volatile near unsigned char*)0xF95)

//inicio do programa

void main(void) interrupt 0 {

//configurando todos os pinos como saídas

TRISD = 0b00000000;

//liga apenas os quatro últimos leds

PORTD = 0b11110000;

//mantém o sistema ligado indefinidamente

for(;;); }

Como estamos criando um dene é uma boa prática de programação utilizar apenas letras maiúsculas para diferenciá-lo de uma variável comum.

Notem que usamos dois asteriscos no dene. É isto que permite que utilizemos o dene como uma variável qualquer, sem precisar de usar um asterisco a todo momento, como no caso dos ponteiros.

A segunda abordagem (com dene) é preferida em relação à primeira pois, dependendo do compilador, gera códigos mais rápidos além de economizar memória. Além disso permite que a denição seja feita apenas uma vez e utilizada em todo o programa.

No documento ELT024-NotasAulaLimpo (páginas 50-54)

Documentos relacionados