Prof.MSc.Rodrigo Maximiano Antunes de Almeida
Universidade Federal de ItajubáArquitetura de Microcontroladores
Esquema elétrico e circuitos importantes
Multiplexação nos terminais do microcontrolador
Ex: o oitavo terminal do PIC18F4550.
Pode ser congurado como terminal:
de entrada ou saída referente ao primeiro bit da porta E (RE0)
de leitura analógica pertencente ao quinto conversor analógico
- digital (AN5)
utilizado para enviar um clock externo de comunicação paralela
(CK1SPP)
Arquitetura de Microcontroladores
Registros de conguração do microcontrolador
Registros de conguração do
microcontrolador
Arquitetura de Microcontroladores
Registros de conguração do microcontrolador
//config.h
#ifndef CONFIG_H #define CONFIG_H
// Pll desligado
code char at 0x300000 CONFIG1L = 0x01; // Oscilador c/ cristal externo HS code char at 0x300001 CONFIG1H = 0x0C; // Watchdog controlado por software code char at 0x300003 CONFIG2H = 0x00; // Sem programação em baixa tensão code char at 0x300006 CONFIG4L = 0x00;
Programação dos Periféricos
.
.
.
In theory, there is no dierence between theory and practice; In practice,
there is. Chuck Reid
Programação dos Periféricos
Periféricos disponíveis
Saída
Barramento de Led's
Display de 7 segmentos
Display LCD 2x16
Saídas PWM
Entrada
Teclado 4*4
Conversor AD
Outros
Serial RS232
Tratador de Interrupções
Watchdog
Programação dos Periféricos
Acesso às portas do microcontrolador
O microcontrolador PIC 18F4550 possui 5 portas
PORTA: bidirecional com 7 bits
PORTB: bidirecional com 8 bits
PORTC: bidirecional com 7 bits
PORTD: bidirecional com 8 bits
Programação dos Periféricos
Acesso às portas do microcontrolador
Bit número
PORTB
0
Terminal
Físico
33
1
34
2
35
3
36
4
37
5
38
6
39
7
40
Acesso às portas do microcontrolador
37
Trisb:4
Leitor
Gravador
4
Trisb:4
= 1
= 0
= 0
= 1
< 2volts = 0
> 3volts = 1
PORTB
Programação dos Periféricos
Acesso às portas do microcontrolador
Porta
Endereço dos dados
Endereço de conguração (TRIS)
PORTA
0xF80
0xF92
PORTB
0xF81
0xF93
PORTC
0xF82
0xF94
PORTD
0xF83
0xF95
Acesso às portas do microcontrolador
//inicio do programavoid 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;
Programação dos Periféricos
Acesso às portas do microcontrolador
//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
(;;);
Acesso às portas do microcontrolador
Vantagens no uso dos # denes
Utilização não requer uso do *, pois já está incluso no dene
Economiza memória ram. Criando uma variável é necessário
reservar um espaço para armazenar o valor do ponteiro.
A denição pode ser feita em apenas um arquivo do tipo
header. Os outros arquivos que precisem utilizar estas
denições devem apenas incluir este header.
A mudança de arquitetura é mais simples. Criando apenas um
arquivo com os denes é mais simples migrar o código de uma
arquitetura para outra.
Programação dos Periféricos
Acesso às portas do microcontrolador
//basico.h//funções de bit
#define BitSet(arg,bit) ((arg) |= (1<<bit)) #define BitClr(arg,bit) ((arg) &= ~(1<<bit)) #define BitFlp(arg,bit) ((arg) ^= (1<<bit)) #define BitTst(arg,bit) ((arg) & (1<<bit))
//defines para registros especiais
#define PORTA (*(volatile near unsigned char*)0xF80) #define PORTB (*(volatile near unsigned char*)0xF81) #define PORTC (*(volatile near unsigned char*)0xF82) #define PORTD (*(volatile near unsigned char*)0xF83) #define PORTE (*(volatile near unsigned char*)0xF84) #define TRISA (*(volatile near unsigned char*)0xF92) #define TRISB (*(volatile near unsigned char*)0xF93) #define TRISC (*(volatile near unsigned char*)0xF94) #define TRISD (*(volatile near unsigned char*)0xF95) #define TRISE (*(volatile near unsigned char*)0xF96)
Acesso às portas do microcontrolador
//basico.h#define INTCON (*(volatile near unsigned char*)0xFF2) #define INTCON2 (*(volatile near unsigned char*)0xFF1) #define PIE1 (*(volatile near unsigned char*)0xF9D) #define PIR1 (*(volatile near unsigned char*)0xF9E) #define TMR0L (*(volatile near unsigned char*)0xFD6) #define TMR0H (*(volatile near unsigned char*)0xFD7) #define T0CON (*(volatile near unsigned char*)0xFD5) #define SPPCON (*(volatile near unsigned char*)0xF65) #define SPPCFG (*(volatile near unsigned char*)0xF63) #define ADCON2 (*(volatile near unsigned char*)0xFC0) #define ADCON1 (*(volatile near unsigned char*)0xFC1) #define ADCON0 (*(volatile near unsigned char*)0xFC2)
Programação dos Periféricos
Acesso às portas do microcontrolador
//basico.h#define RCSTA (*(volatile near unsigned char*)0xFAB) #define TXSTA (*(volatile near unsigned char*)0xFAC) #define TXREG (*(volatile near unsigned char*)0xFAD) #define RCREG (*(volatile near unsigned char*)0xFAE) #define SPBRG (*(volatile near unsigned char*)0xFAF) #define SPBRGH (*(volatile near unsigned char*)0xFB0) #define BAUDCON (*(volatile near unsigned char*)0xFB8) #define RCON (*(volatile near unsigned char*)0xFD0) #define WDTCON (*(volatile near unsigned char*)0xFD1) #define T2CON (*(volatile near unsigned char*)0xFCA) #define PR2 (*(volatile near unsigned char*)0xFCB) #define CCP2CON (*(volatile near unsigned char*)0xFBA) #define CCPR2L (*(volatile near unsigned char*)0xFBB) #define CCP1CON (*(volatile near unsigned char*)0xFBD) #define CCPR1L (*(volatile near unsigned char*)0xFBE)
Programação dos Periféricos
Conguração dos periféricos
Term.
Descrição
Congurar
como
Função
2
RA0/AN0
AN0
Potenciômetro / Sen-
sor de Temperatura
4
RA2/AN2/VREF-/CVREF
RA2
Display 2
7
RA5/AN4/SS/C2OUT
RA5
Display 1
8
RE0/AN5/CK1SPP
RE0
RS-LCD / Display 3
9
RE1/AN6/CK2SPP
RE1
EN-LCD
10
RE2/AN7/OESPP
RE2
RW-LCD / Display 4
13
OSC1/CLKI
OSC1
Cristal
14
OSC2/CLKO/RA6
OSC2
16
RC1/T1OSI/CCP2/UOE
CCP2
Aquecedor
17
RC2/CCP1/P1A
CCP1
Ventilador / Buzzer
19
RD0/SPP0
RD0
Barramento de dados
para o LCD/7seg/Led
20
RD1/SPP1
RD1
Conguração dos periféricos
Term.
Descrição
Congurar
como
Função
25
RC6/TX/CK
TX
RS232
26
RC7/RX/DT/SDO
RX
27
RD4/SPP4
RD4
Barramento de dados
para o LCD / 7seg /
Led
28
RD5/SPP5/P1B
RD5
29
RD6/SPP6/P1C
RD6
30
RD7/SPP7/P1D
RD7
33
RB0/AN12/INT0/SDI/SDA RB0
Saídas para
alimentação do
teclado
34
RB1/AN10/INT1/SCK/SCL RB1
35
RB2/AN8/INT2/VMO
RB2
36
RB3/AN9/CCP2/VPO
RB3
37
RB4/AN11/KBI0/CSSPP
RB4
Entradas para leitura
Programação dos Periféricos
Conguração dos periféricos
TRISA = 0b00000010; //configurando os terminais como entrada e saída ADCON1 = 0b00001110; //apenas o primeiro terminal é analógico
TRISB = 0b11110000; //configurando os terminais como entrada e saída INTCON = 0b11000101; //configuração com interrupção habilitada INTCON = 0b00000000; //configuração sem interrupção
INTCON2 = 0b00000001;
SPPCFG = 0b00000000; //RB0-4 são controlados pela porta B, não pelo SPP TRISC = 0b10000000; //os terminais são saídas, apenas RC7 é entrada CCP1CON = 0b00001100; //configura o 2o terminal como PWM
CCP2CON = 0b00001100; //configura o 3o terminal como PWM
TXTA = 0b00101100; //configura a transmissão de dados da serial RCSTA = 0b10010000; //configura a recepção de dados da serial BAUDCON = 0b00001000; //configura sistema de velocidade da serial SPBRGH = 0b00000000; //configura para 56k
SPBRG = 0b00100010; //configura para 56k