20

Click here to load reader

Pic18xx

  • Upload
    moschen

  • View
    176

  • Download
    0

Embed Size (px)

Citation preview

Page 1: Pic18xx

Um resumo do Microcontrolador

PIC18xx

Autor: Pedro Inácio

Revisão: Rui Antunes

Dezembro/2007

Page 2: Pic18xx

2

1. Introdução

1.1 PIC-Programmable Interrupt Controller

O PIC é um microcontrolador fabricado exclusivamente pela empresa Microchip, que

se divide em várias famílias. Com arquitectura de 8 bits têm-se por ordem crescente

de performance e dimensão o PIC10, PIC12, PIC16 e PIC18. Com arquitectura de

16 bits têm-se os microcontroladores PIC24F e PIC24H e os controladores de sinal

dsPIC30 e dsPIC33. Este documento refere-se à família PIC18xx, embora

genericamente, possa ser aplicado a todas as famílias de 8 bits e de forma mais

abstracta às de 16 bits.

1.2 A família PIC18xx

Na Figura 1.1 representa-se, como exemplo, o 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

Page 3: Pic18xx

3

Note-se que cada pino não tem uma única função. Dependendo das necessidades

de cada aplicação, o utilizador poderá utilizar cada uma das funções de certo grupo

de pinos. Por exemplo os pinos 26, 27 e 28 podem ser usados como GPIO (General

Purpose Input Output) – entrada/saída normal, ou como PGM, PGC ou PGD, para a

programação ICSP (In Circuit Serial Programming) – programação sem remoção do

microcontrolador do circuito. Os pinos são específicos de uma determinada função

integrada em certos modelos pelo que diferem para cada microcontrolador.

1.3 Programação do PIC

A maioria dos microcontroladores recebe como programa o ficheiro binário gerado

por uma linguagem compilada. Esta programação pode ser feita dentro do circuito

com um mecanismo que desabilita o funcionamento e reescreve a área de memória

de programa com o novo código, ou ainda removendo o microcontrolador do circuito

e inserindo-o num programador externo.

A Microchip produz um interface de programação/depuração chamado ICD2, que

juntamente com o IDE (Integrated Development Environment) – ambiente de

desenvolvimento integrado (chamado MPLAB), permitem escrever o código,

compilar, programar e depurar sem sequer desligar o circuito.

Existem outros métodos de programação por programadores universais como o ALL-

11 e o PRESTO, em que é necessário remover o microcontrolador, compilar o

código e levar ambos ao programador, que reescreve o código (flash).

1.4 Configuração

Os microcontroladores são configurados por fuses ou bits de configuração.

Estes podem ser configurados no IDE (como no caso do MPLAB), num programador

universal, ou no código (sobrepõe o MPLAB, mas não funciona no programador

ALL-11).

De seguida descrevem-se algumas das configurações mais comuns:

Page 4: Pic18xx

4

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

frequência 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-frequência (HS). Ao usar o

PLL pode multiplicar-se a frequência. Por exemplo: usando um cristal de 12MHz e a

PLL com divisor de 4, atinge-se a frequência 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 frequência de entrada é dividida por 4 e é disponibilizada

no pino OSC2 (Figura 1.2).

Page 5: Pic18xx

5

Nos modos ECIO e ECPIO o pino OSC2 é poupado para uso geral como RA6

(Figura 1.3).

� 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 frequência

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 frequência por

4 e disponibiliza no pino OSC2.

Figura 3: Divisor de frequência

Figura 4: Pino de uso geral

Page 6: Pic18xx

6

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 frequência por 4 e disponibiliza no pino OSC2 (Figura 1.4).

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

Figura 5: Divisor de frequência

Figura 6: Pinos OSC1 e RA6

Page 7: Pic18xx

7

Configurações Gerais

Port A/D Enable:

� Porto configurado como I/O digital

� Porto configurado como entradas analógicas (ADC)

Master Clear

� Porto configurado como GPIO

� Porto configurado como MCLR

Brownout

� Desactivado

� Especificar uma tensão mínima de limite

WDT

� Desactivado

� Especificar um tempo de intervalo entre checkpoints

1.5 Memória

Registos Um registo é um local na memória do PIC, que pode ser lida e escrita, e dependendo do endereço, pode ter um significado especial no comportamento do programa se for um SFR (Special Function Register – registo de função especial), ou ser apenas um pedaço de memória de uso geral. Bancos de Memoria O banco de memória 0 corresponde ao acesso à memória 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

Page 8: Pic18xx

8

porto B é configurado para saída excepto os pinos 0 e 7 que são de entrada. Os dispositivos actuais só possuem este dispositivo para compatibilidade e os mais recentes já não o possuem, pelo que o código só deve referir o TRIS quando se refere a dispositivos antigos ou ao reutilizar código 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 função especial, pelo que deve ser tomado cuidado ao se escrever em todo o porto. As instruções de escrita bit a bit são uma prática mais eficaz, segura e perceptível. A atribuição de nomes inteligíveis aos pinos que realizam uma função específica também é recomendada em prol da facilidade de compreensão e depuração do código.

W – Working Register (Acumulador) O Working register ou Acumulador é o registo onde tudo normalmente acontece. É o espaço de memória mais volátil do PIC, pois poucas operações garantem a manutenção do seu conteúdo. O conteúdo que se deseje preservar deve então ser imediatamente copiado para um local seguro. A analogia a reter para boa prática é imaginar o Working register como uma espécie de ardósia onde se escrevem os resultados dos cálculos.

Figura 7: Esquema de um pino

Page 9: Pic18xx

9

2. Exemplos de programação (Assembly e C)

Enunciam-se seguidamente alguns exemplos de programação em, respectivamente, linguagem Assembly e C: Exemplo 1: Escrever na memória Pretende-se escrever o valor 06h no endereço 85h no banco 1. BSF 03h,5 ;Banco 1 MOVLW 06h ;Coloca 00110 no W MOVWF 85h ;Coloca W no 85h BCF 03h,5 ;Banco 0 BSF 03h,5 – coloca 1 (set) no bit 5 do endereço 03h MOVLW 06h – escreve o valor 06h no W MOVWF 85h – coloca o conteúdo do W no endereço 85h BCF 03h,5 – coloca 0 (clear) no bit 5 do endereço 03h bit_set(0x03,5) – coloca 1 (set) no bit 5 do endereço 03h *0x85 = 0x06 – valor literal 06h no endereço 85h bit_clear(0x03,5) – coloca 1 (set) no bit 5 do endereço 03h ou write_bank(1, 0x85, 0x06); escreve o valor 06h no endereço 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 03h,5 ;Banco 1 MOVLW 00h ;Escreve 0 no W MOVWF 85h ;Escreve W no 85h/TRISA :definir o porto A para saída BCF 03h,5 ;Banco 0 MOVLW 02h ;Escreve 00000010 no W MOVWF 05h ;Escreve W no 05h/PORTA :escrever W no porto A BSF 03h,5 – coloca 1 (set) no bit 5 do endereço 03h MOVLW 00h – coloca o valor 00h no registo W MOVWF 85h – coloca o conteúdo do registo W no endereço 85h que corresponde

ao TRISA BCF 03h,5 – coloca 0 (clear) no bit 5 do endereço 03h MOVLW 02h – escreve o valor literal 00000010 no registo W

Page 10: Pic18xx

10

MOVWF 05h – coloca o conteúdo do registo W no endereço 05h que corresponde ao PORTA

bit_set(0x03,5) – coloca 1 (set) no bit 5 do endereço 03h *0x85 = 0x00 – escreve o valor 06h no endereço 85h bit_clear(0x03,5) – coloca 1 (set) no bit 5 do endereço 03h *0x05 = 0x02 – escreve o valor 02h no endereço 05h ou write_bank(1, 0x85, 0x00); escreve o valor 00h no endereço 85h no banco 1 write_bank(0, 0x05, 0x02); escreve o valor 02h no endereço 05h no banco 0 ou set_tris_a(0x00); definir o porto A como saída output_high(PIN_A0); ligar o bit 1 do porto A Exemplo 3: Loops e delays Pretende-se controlar a temporização de atrasos através de ciclos e instruções directas. MOVLW 0FFh ;Coloca 0 no W MOVWF 08h ;Coloca W no 08h CONTADOR EQU 08h ;Define CONTADOR como o endereço de memoria 08h CICLO ;Define uma marcação no código DECFSZ CONTADOR,1 ;Subtrai 1 ao valor no endereço designado por ;contador e ignora a próxima instrução de o valor ;resultante da subtracção for 0 GOTO CICLO ;Salta para a posição marcada pelo nome CICLO ;As instruções seguintes serão executadas quando o valor ;de CONTADOR chegar a 0 e a instrução de salto for ;ignorada #byte contador = 0x08 // Define CONTADOR como o endereço de memoria 08h contador = 0xFF; // Escreve o valor 255 no CONTADOR do{ // Repete o bloco de instruções enquanto a condição se // verificar contador--; // Decrementa CONTADOR }while(contador > 0); // Define a condição de repetição

Page 11: Pic18xx

11

Assumindo um relógio interno de 40MHz, tem-se um clock de instrução de 10MHz e período de 100ns. As instruções DECFSZ e GOTO são 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á então de 20000/400 = 50 ou 32h. Na linguagem C é mais difícil efectuar a contagem de ciclos, pois a maioria dos compiladores não esclarece a relação entre o código escrito e o código máquina correspondente. Na maioria das linguagens C para o microcontrolador PIC existe uma instrução de atraso declarada por: delay_us(20); pode ainda usar-se um bloco de linguagem Assembly no código C: int8 contador=0x32; #asm CICLO DECFSZ CONTADOR,1 GOTO CICLO #endasm Exemplo 4: Funções e Subrotinas Pretende-se agora definir e chamar subrotinas. Define-se uma rotina que guarda um valor numa localização de memória, e chama-se do bloco principal.

; Guarda o valor do endereço 09h no endereço 30h ROTINA ;Nome da subrotina MOVFW 09h ;Escreve o conteúdo do endereço 09h no W MOVWF 30h ;Escreve o conteúdo do W no endereço 30h RETURN ;Retorna ao ponto onde a rotina foi chamada ;... MOVLW 56h ;Escreve 56h no W MOVWF 09h ;Escreve o conteúdo do W no endereço 09h CALL ROTINA ;Chama a subrotina #byte objecto = 0x09 //Define objecto como o endereço de memória 09h void guarda (int8 valor){ //cabeçalho da função *0x30 = valor; //escreve o valor recebido no endereço 30h } void main(){ objecto = 0x56; //Coloca o valor 56h no objecto guarda(objecto); //chama a função para guardar o valor do endereço 09h }

Page 12: Pic18xx

12

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 EQU FD8h TRISB EQU F93h PORTB EQU F81h INICIO MOVLW 01h MOVWF TRISB ;Coloca o bit 0 do porto B para entrada CICLO BTFSS PORTB,0 ;Testa o bit 0 do porto B e salta a próxima instrução se for ;1 GOTO CICLO ;Se o bit 0 estiver a 0 testa de novo ;Se o bit 0 estiver a 1 BSF PORTB,7 ;Coloca o bit 7 a 1 MOVLW 00h MOVWF TRISB ;Configura todo o porto B como porto de saída BSF PORTB,0 ;Coloca o bit 0 a 0 GOTO INICIO ;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: Adição e subtracção Pretende-se verificar as operações básicas da adição e da subtracção, usando operadores no acumulador MOVLW 30 ;W=30 MOVWF 08h ;08h=30 MOVLW 25 ;W=25 ADDLW 25 ;W=50 SUBLW 20 ;W=30 SUBWF 08h ;W=0

Page 13: Pic18xx

13

#byte f = 0x08 main(){ int8 acumulador = 25; f = 30; acumulador += 25; acumulador -= 20; acumulador += f; } Exemplo 7: Interrupção por Temporizador Pretende-se usar um temporizador (timer) com interrupção de overflow temporizar 1 segundo. ORG 00h ;Vector de Reset GOTO MAIN ;Evita sobrepor o vector de interrupção com código ORG 08h ;Vector de Interrupção GOTO LOW_ISR ;Evita sobrepor o vector de interrupção prioritário com ;código, neste caso é desnecessário, pois não é usado ISR ;Tratamento de interrupção BTFSS INTCON,5 GOTO FIM_ISR MOVLW 0FFh ;Escreve FFh no W MOVWF PORTB ;Escreve o conteúdo do registo W no porto B BCF TMR0IF ;Limpa a flag para permitir a activação da interrupção FIM_ISR ;Fim do tratamento de interrupção RETFIE MAIN BCF IPEN ;Desabilita prioridade de interrupções BSF GIE ;Habilita interrupções BSF TMR0IE ;Habilita interrupção do timer BCF TMR0ON ;Pára o Timer0 BSF T08BIT ;Configura o contador para 16bits BCF T0CS ;Configura a fonte para clock interno BCF PSA ;Usa divisor de frequência MOVLW 06h IORWF T0CON,1,1 ;Divide a frequência por 128 MOVLW 98h MOVWF TMR0H MOVLW 96h MOVWF TMR0L

Page 14: Pic18xx

14

BSF TMR0ON ;Inicia o Timer0 ;.... ; Ao fim de 1 segundo o programa será interrompido e todos os pinos do porto B estarão a ‘1’, seguindo imediatamente de onde havia sido interrompido. Assume-se uma frequência interna de 40MHz #pragma code INT_VECTOR = 0x08 timer0_isr(){ PORTB=0xFF; TMR0IF=0; } void main(){ IPEN=0; //Desabilita prioridade de interrupções GIE=1; //Habilita interrupções TMR0IE=1; //Habilita interrupção do timer TMR0ON=0 //Pára o Timer0 T08BIT=1; //Configura o contador para 16bits T0CS=0; //Configura a fonte para clock interno PSA=0; //Usa divisor de frequência T0CON|=0x06; //Divide a frequência por 128 TMR0H=0x98; TMR0L=0x96; TMR0ON=1; //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); // ... }

Page 15: Pic18xx

15

3. Interrupções e registos associados

INTCON bit 7 GIE/GIEH: Global Interrupt Enable bit Quando IPEN = 0: 1 = Activa todas as interrupções 0 = Desactiva todas as interrupções Quando IPEN = 1: 1 = Activa todas as interrupções com alta prioridade 0 = Desactiva todas as interrupções com alta prioridade bit 6 PEIE/GIEL: Peripheral Interrupt Enable bit Quando IPEN = 0: 1 = Activa todas as interrupções periféricas 0 = Desactiva todas as interrupções periféricas Quando IPEN = 1: 1 = Activa todas as interrupções periféricas com alta prioridade 0 = Desactiva todas as interrupções periféricas com alta prioridade bit 5 TMR0IE: TMR0 Overflow Interrupt Enable bit 1 = Activa a interrupção do timer 0 0 = Desactiva a interrupção do timer 0 bit 4 INT0IE: INT0 External Interrupt Enable bit 1 = Activa a interrupção externa 0 0 = Desactiva a interrupção externa 0 bit 3 RBIE: RB Port Change Interrupt Enable bit 1 = Activa a interrupção do porto B 0 = Desactiva a interrupção do porto B bit 2 TMR0IF: TMR0 Overflow Interrupt Flag bit 1 = O registo TMR0 chegou ao máximo/activou interrupção (para reactivar a detecção/interrupção, deve manualmente colocar-se a 0, ou a detecção/interrupção não volta a disparar) 0 = O registo TMR0 não chegou ao máximo/activou interrupção bit 1 INT0IF: INT0 External Interrupt Flag bit 1 = A interrupção INT0 foi activada (para reactivar a interrupção, deve manualmente colocar-se a 0, ou a interrupção não volta a activar) 0 = A interrupção INT0 não foi activada

Page 16: Pic18xx

16

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 estão desabilitados 0 = Todos os pull-ups do PORTB são controlados pelo valor do latch de cada porto bit 6 INTEDG0: External Interrupt 0 Edge Select bit 1 = INT0 activo na transição positiva 0 = INT0 activo na transição negativa bit 5 INTEDG1: External Interrupt 1 Edge Select bit 1 = INT1 activo na transição positiva 0 = INT1 activo na transição negativa bit 4 INTEDG2: External Interrupt 2 Edge Select bit 1 = INT2 activo na transição positiva 0 = INT2 activo na transição 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 interrupção externa 2 0 = Desactiva a interrupção externa 2

Page 17: Pic18xx

17

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

Page 18: Pic18xx

18

bit 4 TXIE: EUSART Transmit Interrupt Enable bit 1 = Activa a interrupção de transmissão do EUSART 0 = Desactiva a interrupção de transmissão do EUSART bit 3 SSPIE: Master Synchronous Serial Port Interrupt Enable bit 1 = Activa a interrupção do MSSP (SPI/I2C) 0 = Desactiva a interrupção do MSSP (SPI/I2C) IPR bit 6 ADIP: A/D Converter Interrupt Priority bit 1 = A interrupção do ADC tem prioridade alta 0 = A interrupção do ADC tem prioridade baixa bit 5 RCIP: EUSART Receive Interrupt Priority bit 1 = A interrupção de recepção do EUSART tem prioridade alta 0 = A interrupção de recepção do EUSART tem prioridade baixa bit 4 TXIP: EUSART Transmit Interrupt Priority bit 1 = A interrupção de transmissão do EUSART tem prioridade alta 0 = A interrupção de transmissão do EUSART tem prioridade baixa bit 3 SSPIP: Master Synchronous Serial Port Interrupt Priority bit 1 = A interrupção do MSSP (SPI/I2C) tem prioridade alta 0 = A interrupção do MSSP (SPI/I2C) tem prioridade baixa RCON bit 7 IPEN: Interrupt Priority Enable bit 1 = Activa os níveis de prioridade das interrupções 0 = Inactiva os níveis de prioridade das interrupções 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 = Não foi executado RESET (não editável) 0 = Foi executado RESET (Deve ser colocado a 0 por software após um brown-out) bit 3 TO: Watchdog Time-out Flag bit 1 = Aplicado no início, ou após CLRWDT ou SLEEP 0 = O watchdog timer fez RESET

Page 19: Pic18xx

19

bit 2 PD: Power-Down Detection Flag bit 1 = Aplicado no início, ou após CLRWDT 0 = Aplicado após SLEEP bit 1 POR: Power-on Reset Status bit(2) 1 = Não foi executado Power-on Reset (não editável) 0 = Foi executado Power-on Reset (Deve ser colocado a 0 por software após um Power-on Reset) bit 0 BOR: Brown-out Reset Status bit 1 = Não foi executado Brown-out Reset (não editável) 0 = Foi executado Brown-out Reset (Deve ser colocado a 0 por software após um Brown-out Reset)

4. Características e funções do PIC18xx

Master Clear (MCLR) O pino MCLR é a forma de externamente inicializar o dispositivo. Este pino, quando atribuído a esta função não pode ser escrito por software. Power-on Reset (POR) Esta função ocorre quando o valor de tensão do pino VDD sobe acima de um determinado nível, após o qual é determinado que o dispositivo encontra-se efectivamente ligado. Esta função assegura que o código é correctamente iniciado. Brown-out Reset (BOR) Esta função ocorre quando o valor de tensão do pino VDD desce abaixo de um nível pré-configurado, em que se reinicia o funcionamento. Watchdog Timer (WDT) Esta função permite reiniciar automaticamente o dispositivo após um intervalo de tempo pré-configurado. Devem ser introduzidos checkpoints para reiniciar a contagem em zonas do código que assegurem que existe tempo de execução suficiente para o programa correr normalmente. Ciclos de instrução 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 relógio. Por exemplo, para um oscilador de 20MHz com PLL de 2, tem-se uma

Page 20: Pic18xx

20

frequência interna de 40MHz. A frequência de instrução será então de 10Mhz e o período de 100ns.

5. Referências

• http://www.microchip.com

• http://www.pic-tools.com

Figura 8: Pipeline