Você está na página 1de 20

Um resumo do

Microcontrolador
PIC18xx

Autor: Pedro Incio


Reviso: Rui Antunes

Dezembro/2007

1.

Introduo

1.1 PIC-Programmable Interrupt Controller


O PIC um microcontrolador fabricado exclusivamente pela empresa Microchip, que
se divide em vrias famlias. Com arquitectura de 8 bits tm-se por ordem crescente
de performance e dimenso o PIC10, PIC12, PIC16 e PIC18. Com arquitectura de
16 bits tm-se os microcontroladores PIC24F e PIC24H e os controladores de sinal
dsPIC30 e dsPIC33. Este documento refere-se famlia PIC18xx, embora
genericamente, possa ser aplicado a todas as famlias de 8 bits e de forma mais
abstracta s de 16 bits.

1.2 A famlia PIC18xx


Na

Figura

1.1

representa-se,

como

exemplo,

diagrama de

pinos

do

microcontrolador PIC18F2550, em que se pode ver que se trata de um DIP28 (Dual


Inline Package 28) duas filas de 14 pinos totalizando 28.

Figura 1: Diagrama de pinos do Microcontrolador PIC18F2550

Note-se que cada pino no tem uma nica funo. Dependendo das necessidades
de cada aplicao, o utilizador poder utilizar cada uma das funes de certo grupo
de pinos. Por exemplo os pinos 26, 27 e 28 podem ser usados como GPIO (General
Purpose Input Output) entrada/sada normal, ou como PGM, PGC ou PGD, para a
programao ICSP (In Circuit Serial Programming) programao sem remoo do
microcontrolador do circuito. Os pinos so especficos de uma determinada funo
integrada em certos modelos pelo que diferem para cada microcontrolador.

1.3 Programao do PIC


A maioria dos microcontroladores recebe como programa o ficheiro binrio gerado
por uma linguagem compilada. Esta programao pode ser feita dentro do circuito
com um mecanismo que desabilita o funcionamento e reescreve a rea de memria
de programa com o novo cdigo, ou ainda removendo o microcontrolador do circuito
e inserindo-o num programador externo.
A Microchip produz um interface de programao/depurao chamado ICD2, que
juntamente com o IDE (Integrated Development Environment) ambiente de
desenvolvimento integrado (chamado MPLAB), permitem escrever o cdigo,
compilar, programar e depurar sem sequer desligar o circuito.
Existem outros mtodos de programao por programadores universais como o ALL11 e o PRESTO, em que necessrio remover o microcontrolador, compilar o
cdigo e levar ambos ao programador, que reescreve o cdigo (flash).

1.4 Configurao
Os microcontroladores so configurados por fuses ou bits de configurao.
Estes podem ser configurados no IDE (como no caso do MPLAB), num programador
universal, ou no cdigo (sobrepe o MPLAB, mas no funciona no programador
ALL-11).
De seguida descrevem-se algumas das configuraes mais comuns:

Oscilador
O PIC necessita de uma fonte de sincronismo. Existem muitas formas de a obter.
Existe normalmente um PLL com um divisor. Dividir por PLL significa multiplicar a
frequncia de entrada pelo factor seleccionado.


XT Crystal/Resonator

XTPLL Crystal/Resonator with PLL enabled

HS High-Speed Crystal/Resonator

HSPLL High-Speed Crystal/Resonator with PLL enabled

Nestes modos utilizado um cristal de baixa (XT) ou alta-frequncia (HS). Ao usar o


PLL pode multiplicar-se a frequncia. Por exemplo: usando um cristal de 12MHz e a
PLL com divisor de 4, atinge-se a frequncia interna de 48MHz.

Figura 2: Circuito do oscilador

EC External Clock with FOSC/4 output

ECIO External Clock with I/O on RA6

ECPLL External Clock with PLL enabled and FOSC/4 output on RA6

ECPIO External Clock with PLL enabled, I/O on RA6

Neste modo requer-se uma fonte externa de sincronismo.


Nos modos EC e ECPLL, a frequncia de entrada dividida por 4 e disponibilizada
no pino OSC2 (Figura 1.2).

Figura 3: Divisor de frequncia


Nos modos ECIO e ECPIO o pino OSC2 poupado para uso geral como RA6
(Figura 1.3).

Figura 4: Pino de uso geral




INTHS Internal Oscillator used as microcontroller clock source, HS Oscillator


used as USB clock source

INTXT Internal Oscillator used as microcontroller clock source, XT Oscillator


used as USB clock source

INTIO Internal Oscillator used as microcontroller clock source, EC Oscillator


used as USB clock source, digital I/O on RA6

INTCKO Internal Oscillator used as microcontroller clock source, EC Oscillator


used as USB clock source, FOSC/4 output on RA6

Estes modos fazem uso do oscilador interno.


O modo INTHS usa o oscilador de 8MHz e um divisor para gerar a frequncia
seleccionada, e INTXT usa o oscilador de 31kHz.
OS modos INTIO e INTCKO usam o oscilador de 8MHz, mas o primeiro poupa os
pinos RA6 e RA7 para GPIO e o segundo poupa o pino RA7, divide a frequncia por
4 e disponibiliza no pino OSC2.
5

Nos PIC com USB o pino OSC1 sempre usado para entrada de sincronismo
externo para o controlador USB.

RC External Resistor/Capacitor with FOSC/4 output on RA6

RCIO External Resistor/Capacitor with I/O on RA6

Nestes modos o oscilador composto por um schmitt-trigger interno e por uma


malha RC externa.
O modo RC divide a frequncia por 4 e disponibiliza no pino OSC2 (Figura 1.4).

Figura 5: Divisor de frequncia

O modo RCIO poupa o pino RA6 para GPIO (Figura 1.5)

Figura 6: Pinos OSC1 e RA6

Configuraes Gerais
Port A/D Enable:


Porto configurado como I/O digital

Porto configurado como entradas analgicas (ADC)

Master Clear


Porto configurado como GPIO

Porto configurado como MCLR

Brownout


Desactivado

Especificar uma tenso mnima de limite

WDT


Desactivado

Especificar um tempo de intervalo entre checkpoints

1.5 Memria
Registos
Um registo um local na memria do PIC, que pode ser lida e escrita, e dependendo
do endereo, pode ter um significado especial no comportamento do programa se for
um SFR (Special Function Register registo de funo especial), ou ser apenas um
pedao de memria de uso geral.
Bancos de Memoria
O banco de memria 0 corresponde ao acesso memria geral e o banco 1
corresponde aos registos.
TRIS
Este registo controla o sentido da porta respectiva. Por exemplo se TRISA = 255 =
11111111, o porto A configurado para entrada, se TRISB = 129 = 10000001, o
7

porto B configurado para sada excepto os pinos 0 e 7 que so de entrada.


Os dispositivos actuais s possuem este dispositivo para compatibilidade e os mais
recentes j no o possuem, pelo que o cdigo s deve referir o TRIS quando se
refere a dispositivos antigos ou ao reutilizar cdigo antigo.
PORT
Cada um destes registos controla um porto. O esquema de cada pino encontra-se
representado na Figura 1.6. Normalmente cada porto composto por 8 bits (mas
podem ser menos), ou ainda algum destes estar a ser usado por uma funo
especial, pelo que deve ser tomado cuidado ao se escrever em todo o porto. As
instrues de escrita bit a bit so uma prtica mais eficaz, segura e perceptvel. A
atribuio de nomes inteligveis aos pinos que realizam uma funo especfica
tambm recomendada em prol da facilidade de compreenso e depurao do
cdigo.

Figura 7: Esquema de um pino

W Working Register (Acumulador)


O Working register ou Acumulador o registo onde tudo normalmente acontece. o
espao de memria mais voltil do PIC, pois poucas operaes garantem a
manuteno do seu contedo. O contedo que se deseje preservar deve ento ser
imediatamente copiado para um local seguro.
A analogia a reter para boa prtica imaginar o Working register como uma espcie
de ardsia onde se escrevem os resultados dos clculos.

2.

Exemplos de programao (Assembly e C)

Enunciam-se seguidamente alguns exemplos de programao em, respectivamente,


linguagem Assembly e C:
Exemplo 1: Escrever na memria
Pretende-se escrever o valor 06h no endereo 85h no banco 1.
BSF
MOVLW
MOVWF
BCF

03h,5
06h
85h
03h,5

;Banco 1
;Coloca 00110 no W
;Coloca W no 85h
;Banco 0

BSF 03h,5 coloca 1 (set) no bit 5 do endereo 03h


MOVLW 06h escreve o valor 06h no W
MOVWF 85h coloca o contedo do W no endereo 85h
BCF 03h,5 coloca 0 (clear) no bit 5 do endereo 03h
bit_set(0x03,5) coloca 1 (set) no bit 5 do endereo 03h
*0x85 = 0x06 valor literal 06h no endereo 85h
bit_clear(0x03,5) coloca 1 (set) no bit 5 do endereo 03h
ou
write_bank(1, 0x85, 0x06); escreve o valor 06h no endereo 85h no banco 1
Exemplo 2: Escrever num porto, ligando o bit 1
Pretende-se colocar o bit 1 do porto A a 1.
BSF
MOVLW
MOVWF
BCF
MOVLW
MOVWF

03h,5
00h
85h
03h,5
02h
05h

;Banco 1
;Escreve 0 no W
;Escreve W no 85h/TRISA :definir o porto A para sada
;Banco 0
;Escreve 00000010 no W
;Escreve W no 05h/PORTA :escrever W no porto A

BSF 03h,5 coloca 1 (set) no bit 5 do endereo 03h


MOVLW 00h coloca o valor 00h no registo W
MOVWF 85h coloca o contedo do registo W no endereo 85h que corresponde
ao TRISA
BCF 03h,5 coloca 0 (clear) no bit 5 do endereo 03h
MOVLW 02h escreve o valor literal 00000010 no registo W
9

MOVWF 05h coloca o contedo do registo W no endereo 05h que corresponde


ao PORTA
bit_set(0x03,5) coloca 1 (set) no bit 5 do endereo 03h
*0x85 = 0x00 escreve o valor 06h no endereo 85h
bit_clear(0x03,5) coloca 1 (set) no bit 5 do endereo 03h
*0x05 = 0x02 escreve o valor 02h no endereo 05h
ou
write_bank(1, 0x85, 0x00); escreve o valor 00h no endereo 85h no banco 1
write_bank(0, 0x05, 0x02); escreve o valor 02h no endereo 05h no banco 0
ou
set_tris_a(0x00); definir o porto A como sada
output_high(PIN_A0); ligar o bit 1 do porto A
Exemplo 3: Loops e delays
Pretende-se controlar a temporizao de atrasos atravs de ciclos e instrues
directas.
MOVLW
0FFh ;Coloca 0 no W
MOVWF
08h ;Coloca W no 08h
CONTADOR EQU 08h ;Define CONTADOR como o endereo de memoria 08h
CICLO

;Define uma marcao no cdigo

DECFSZ CONTADOR,1 ;Subtrai 1 ao valor no endereo designado por


;contador e ignora a prxima instruo de o valor
;resultante da subtraco for 0
GOTO CICLO
;Salta para a posio marcada pelo nome CICLO
;As instrues seguintes sero executadas quando o valor
;de CONTADOR chegar a 0 e a instruo de salto for
;ignorada
#byte contador = 0x08
contador = 0xFF;
do{
contador--;
}while(contador > 0);

// Define CONTADOR como o endereo de memoria 08h


// Escreve o valor 255 no CONTADOR
// Repete o bloco de instrues enquanto a condio se
// verificar
// Decrementa CONTADOR
// Define a condio de repetio

10

Assumindo um relgio interno de 40MHz, tem-se um clock de instruo de 10MHz e


perodo de 100ns. As instrues DECFSZ e GOTO so ambas de 2 ciclos, logo cada
loop demora 4 ciclos, ou seja 400ns. Para um atraso de 20us, o valor a escolher
para o contador ser ento de 20000/400 = 50 ou 32h.
Na linguagem C mais difcil efectuar a contagem de ciclos, pois a maioria dos
compiladores no esclarece a relao entre o cdigo escrito e o cdigo mquina
correspondente. Na maioria das linguagens C para o microcontrolador PIC existe
uma instruo de atraso declarada por:
delay_us(20);
pode ainda usar-se um bloco de linguagem Assembly no cdigo C:
int8 contador=0x32;
#asm
CICLO
DECFSZ CONTADOR,1
GOTO CICLO
#endasm
Exemplo 4: Funes e Subrotinas
Pretende-se agora definir e chamar subrotinas. Define-se uma rotina que guarda um
valor numa localizao de memria, e chama-se do bloco principal.
ROTINA
MOVFW
09h
MOVWF
30h
RETURN
;...
MOVLW
56h
MOVWF
09h
CALL ROTINA

; Guarda o valor do endereo 09h no endereo 30h


;Nome da subrotina
;Escreve o contedo do endereo 09h no W
;Escreve o contedo do W no endereo 30h
;Retorna ao ponto onde a rotina foi chamada
;Escreve 56h no W
;Escreve o contedo do W no endereo 09h
;Chama a subrotina

#byte objecto = 0x09

//Define objecto como o endereo de memria 09h

void guarda (int8 valor){


*0x30 = valor;
}

//cabealho da funo
//escreve o valor recebido no endereo 30h

void main(){
objecto = 0x56;
guarda(objecto);
}

//Coloca o valor 56h no objecto


//chama a funo para guardar o valor do endereo 09h

11

Exemplo 5: Leitura de portos


Pretende-se ler de um porto e alterar a sua direccionalidade. O programa espera que
o bit 0 do porto B esteja a 1 e coloca o bit 7 do mesmo porto a 1. Depois retorna o bit
0 a 0;
STATUS
TRISB
PORTB

EQU
EQU
EQU

FD8h
F93h
F81h

INICIO
MOVLW
MOVWF

01h
TRISB

;Coloca o bit 0 do porto B para entrada

CICLO
BTFSS

PORTB,0

GOTO

CICLO

BSF
PORTB,7
MOVLW
00h
MOVWF
TRISB
BSF
PORTB,0
GOTOINICIO

;Testa o bit 0 do porto B e salta a prxima instruo se for


;1
;Se o bit 0 estiver a 0 testa de novo
;Se o bit 0 estiver a 1
;Coloca o bit 7 a 1
;Configura todo o porto B como porto de sada
;Coloca o bit 0 a 0
;Repete o programa

while(true){
set_tris_b(0x01);
while(!input(PIN_B0)){}
set_tris_b(0x00);
output_low(PIN_B0);
output_high(PIN_B7);
}
Exemplo 6: Adio e subtraco
Pretende-se verificar as operaes bsicas da adio e da subtraco, usando
operadores no acumulador
MOVLW
MOVWF
MOVLW
ADDLW
SUBLW
SUBWF

30
08h
25
25
20
08h

;W=30
;08h=30
;W=25
;W=50
;W=30
;W=0

12

#byte f = 0x08
main(){
int8 acumulador = 25;
f = 30;
acumulador += 25;
acumulador -= 20;
acumulador += f;
}
Exemplo 7: Interrupo por Temporizador
Pretende-se usar um temporizador (timer) com interrupo de overflow temporizar 1
segundo.
ORG
GOTO

00h
MAIN

;Vector de Reset
;Evita sobrepor o vector de interrupo com cdigo

ORG
GOTO

08h
LOW_ISR

;Vector de Interrupo
;Evita sobrepor o vector de interrupo prioritrio com
;cdigo, neste caso desnecessrio, pois no usado

ISR
BTFSS
GOTO
MOVLW
MOVWF
BCF
FIM_ISR
RETFIE

INTCON,5
FIM_ISR
0FFh
PORTB
TMR0IF

;Tratamento de interrupo
;Escreve FFh no W
;Escreve o contedo do registo W no porto B
;Limpa a flag para permitir a activao da interrupo
;Fim do tratamento de interrupo

MAIN
BCF
BSF
BSF

IPEN
GIE
TMR0IE

;Desabilita prioridade de interrupes


;Habilita interrupes
;Habilita interrupo do timer

BCF
BSF
BCF
BCF
MOVLW
IORWF
MOVLW
MOVWF
MOVLW
MOVWF

TMR0ON
T08BIT
T0CS
PSA
06h
T0CON,1,1
98h
TMR0H
96h
TMR0L

;Pra o Timer0
;Configura o contador para 16bits
;Configura a fonte para clock interno
;Usa divisor de frequncia
;Divide a frequncia por 128

13

BSF
TMR0ON
;Inicia o Timer0
;....
; Ao fim de 1 segundo o programa ser interrompido e todos os pinos do porto B
estaro a 1, seguindo imediatamente de onde havia sido interrompido. Assume-se
uma frequncia interna de 40MHz
#pragma code INT_VECTOR = 0x08
timer0_isr(){
PORTB=0xFF;
TMR0IF=0;
}
void main(){
IPEN=0;
GIE=1;
TMR0IE=1;
TMR0ON=0
T08BIT=1;
T0CS=0;
PSA=0;
T0CON|=0x06;
TMR0H=0x98;
TMR0L=0x96;
TMR0ON=1;
//
...
}

//Desabilita prioridade de interrupes


//Habilita interrupes
//Habilita interrupo do timer
//Pra o Timer0
//Configura o contador para 16bits
//Configura a fonte para clock interno
//Usa divisor de frequncia
//Divide a frequncia por 128
//Inicia o Timer0

ou
#int_timer0
timer0_isr(){
output_port_b(0xFF);
}
void main(){
interrupt_active(int_timer0);
setup_timer(RTCC_INTERNAL|RTCC_DIV_2|RTCC_16_BIT);
set_timer0(0x9896);
//
...
}

14

3.

Interrupes e registos associados

INTCON
bit 7 GIE/GIEH: Global Interrupt Enable bit
Quando IPEN = 0:
1 = Activa todas as interrupes
0 = Desactiva todas as interrupes
Quando IPEN = 1:
1 = Activa todas as interrupes com alta prioridade
0 = Desactiva todas as interrupes com alta prioridade
bit 6 PEIE/GIEL: Peripheral Interrupt Enable bit
Quando IPEN = 0:
1 = Activa todas as interrupes perifricas
0 = Desactiva todas as interrupes perifricas
Quando IPEN = 1:
1 = Activa todas as interrupes perifricas com alta prioridade
0 = Desactiva todas as interrupes perifricas com alta prioridade
bit 5 TMR0IE: TMR0 Overflow Interrupt Enable bit
1 = Activa a interrupo do timer 0
0 = Desactiva a interrupo do timer 0
bit 4 INT0IE: INT0 External Interrupt Enable bit
1 = Activa a interrupo externa 0
0 = Desactiva a interrupo externa 0
bit 3 RBIE: RB Port Change Interrupt Enable bit
1 = Activa a interrupo do porto B
0 = Desactiva a interrupo do porto B
bit 2 TMR0IF: TMR0 Overflow Interrupt Flag bit
1 = O registo TMR0 chegou ao mximo/activou interrupo (para reactivar a
deteco/interrupo, deve manualmente colocar-se a 0, ou a deteco/interrupo
no volta a disparar)
0 = O registo TMR0 no chegou ao mximo/activou interrupo
bit 1 INT0IF: INT0 External Interrupt Flag bit
1 = A interrupo INT0 foi activada (para reactivar a interrupo, deve manualmente
colocar-se a 0, ou a interrupo no volta a activar)
0 = A interrupo INT0 no foi activada

15

bit 0 RBIF: RB Port Change Interrupt Flag bit(1)


1 = Um dos pinos do porto B mudou de estado
0 = Nenhum dos pinos do porto B mudou de estado
INTCON2
bit 7 RBPU: PORTB Pull-up Enable bit
1 = Todos os pull-ups do PORTB esto desabilitados
0 = Todos os pull-ups do PORTB so controlados pelo valor do latch de cada porto
bit 6 INTEDG0: External Interrupt 0 Edge Select bit
1 = INT0 activo na transio positiva
0 = INT0 activo na transio negativa
bit 5 INTEDG1: External Interrupt 1 Edge Select bit
1 = INT1 activo na transio positiva
0 = INT1 activo na transio negativa
bit 4 INTEDG2: External Interrupt 2 Edge Select bit
1 = INT2 activo na transio positiva
0 = INT2 activo na transio negativa
bit 2 TMR0IP: TMR0 Overflow Interrupt Priority bit
1 = TMR0 tem prioridade alta
0 = TMR0 tem prioridade baixa
bit 0 RBIP: RB Port Change Interrupt Priority bit
1 = PORTB tem prioridade alta
0 = PORTB tem prioridade baixa
INTCON3
bit 7 INT2IP: INT2 External Interrupt Priority bit
1 = INT2 tem prioridade alta
0 = INT2 tem prioridade baixa
bit 6 INT1IP: INT1 External Interrupt Priority bit
1 = INT1 tem prioridade alta
0 = INT1 tem prioridade baixa
bit 4 INT2IE: INT2 External Interrupt Enable bit
1 = Activa a interrupo externa 2
0 = Desactiva a interrupo externa 2

16

bit 3 INT1IE: INT1 External Interrupt Enable bit


1 = Activa a interrupo externa 1
0 = Desactiva a interrupo externa 1
bit 1 INT2IF: INT2 External Interrupt Flag bit
1 = A interrupo INT2 foi activada (para reactivar a interrupo, deve manualmente
colocar-se a 0, ou a interrupo no volta a activar)
0 = A interrupo INT2 no foi activada
bit 0 INT1IF: INT1 External Interrupt Flag bit
1 = A interrupo INT1 foi activada (para reactivar a interrupo, deve manualmente
colocar-se a 0, ou a interrupo no volta a activar)
0 = A interrupo INT1 no foi activada
PIR1
bit 6 ADIF: A/D Converter Interrupt Flag bit
1 = A converso A/D terminou (para reactivar a interrupo, deve manualmente
colocar-se a 0, ou a interrupo no volta a activar)
0 = A converso A/D no terminou
bit 5 RCIF: EUSART Receive Interrupt Flag bit
1 = O buffer de recepo EUSART, RCREG, est cheio (este bit colocado a 0
lendo o buffer)
0 = O buffer de recepo EUSART est vazio
bit 4 TXIF: EUSART Transmit Interrupt Flag bit
1 = O buffer de recepo EUSART, TXREG, est cheio (este bit colocado a 0
escrevendo no buffer)
0 = O buffer de recepo EUSART est vazio
bit 3 SSPIF: Master Synchronous Serial Port Interrupt Flag bit
1 = A transmisso/recepo terminou (para reactivar a interrupo, deve
manualmente colocar-se a 0, ou a interrupo no volta a activar)
0 = Aguardando transmisso/recepo
PIE1
bit 6 ADIE: A/D Converter Interrupt Enable bit
1 = Activa a interrupo do ADC
0 = Desactiva a interrupo do ADC
bit 5 RCIE: EUSART Receive Interrupt Enable bit
1 = Activa a interrupo de recepo do EUSART
0 = Desactiva a interrupo de recepo do EUSART

17

bit 4 TXIE: EUSART Transmit Interrupt Enable bit


1 = Activa a interrupo de transmisso do EUSART
0 = Desactiva a interrupo de transmisso do EUSART
bit 3 SSPIE: Master Synchronous Serial Port Interrupt Enable bit
1 = Activa a interrupo do MSSP (SPI/I2C)
0 = Desactiva a interrupo do MSSP (SPI/I2C)
IPR
bit 6 ADIP: A/D Converter Interrupt Priority bit
1 = A interrupo do ADC tem prioridade alta
0 = A interrupo do ADC tem prioridade baixa
bit 5 RCIP: EUSART Receive Interrupt Priority bit
1 = A interrupo de recepo do EUSART tem prioridade alta
0 = A interrupo de recepo do EUSART tem prioridade baixa
bit 4 TXIP: EUSART Transmit Interrupt Priority bit
1 = A interrupo de transmisso do EUSART tem prioridade alta
0 = A interrupo de transmisso do EUSART tem prioridade baixa
bit 3 SSPIP: Master Synchronous Serial Port Interrupt Priority bit
1 = A interrupo do MSSP (SPI/I2C) tem prioridade alta
0 = A interrupo do MSSP (SPI/I2C) tem prioridade baixa
RCON
bit 7 IPEN: Interrupt Priority Enable bit
1 = Activa os nveis de prioridade das interrupes
0 = Inactiva os nveis de prioridade das interrupes
bit 6 SBOREN: BOR Software Enable bit
Se BOREN1:BOREN0 = 01:
1 = BOR est activo
0 = BOR est desactivado
Se BOREN1:BOREN0 = 00, 10 or 11:
Bit est desactivado
bit 4 RI: RESET Instruction Flag bit
1 = No foi executado RESET (no editvel)
0 = Foi executado RESET (Deve ser colocado a 0 por software aps um brown-out)
bit 3 TO: Watchdog Time-out Flag bit
1 = Aplicado no incio, ou aps CLRWDT ou SLEEP
0 = O watchdog timer fez RESET
18

bit 2 PD: Power-Down Detection Flag bit


1 = Aplicado no incio, ou aps CLRWDT
0 = Aplicado aps SLEEP
bit 1 POR: Power-on Reset Status bit(2)
1 = No foi executado Power-on Reset (no editvel)
0 = Foi executado Power-on Reset (Deve ser colocado a 0 por software aps um
Power-on Reset)
bit 0 BOR: Brown-out Reset Status bit
1 = No foi executado Brown-out Reset (no editvel)
0 = Foi executado Brown-out Reset (Deve ser colocado a 0 por software aps um
Brown-out Reset)

4.

Caractersticas e funes do PIC18xx

Master Clear (MCLR)


O pino MCLR a forma de externamente inicializar o dispositivo. Este pino, quando
atribudo a esta funo no pode ser escrito por software.
Power-on Reset (POR)
Esta funo ocorre quando o valor de tenso do pino VDD sobe acima de um
determinado nvel, aps o qual determinado que o dispositivo encontra-se
efectivamente ligado. Esta funo assegura que o cdigo correctamente iniciado.
Brown-out Reset (BOR)
Esta funo ocorre quando o valor de tenso do pino VDD desce abaixo de um nvel
pr-configurado, em que se reinicia o funcionamento.
Watchdog Timer (WDT)
Esta funo permite reiniciar automaticamente o dispositivo aps um intervalo de
tempo pr-configurado. Devem ser introduzidos checkpoints para reiniciar a
contagem em zonas do cdigo que assegurem que existe tempo de execuo
suficiente para o programa correr normalmente.
Ciclos de instruo
O clock interno dividido por 4 para gerar o sincronismo de pipeline, conforme
ilustrado na figura 8. Isto significa que cada ciclo de programa corresponde a 4 ciclos
de relgio. Por exemplo, para um oscilador de 20MHz com PLL de 2, tem-se uma
19

frequncia interna de 40MHz. A frequncia de instruo ser ento de 10Mhz e o


perodo de 100ns.

Figura 8: Pipeline

5.

Referncias

http://www.microchip.com

http://www.pic-tools.com

20

Você também pode gostar