Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
Microchip PIC
Índice
Muitas coisas houve já, às quais as pessoas chamaram computadores. Por isso
mesmo, não existe uma definição concreta para o que de facto é um computador.
Os computadores têm, desde o seu aparecimento, ajudado o homem, na
resolução de operações matemáticas. Apesar da história nos contar e mostrar
inúmeros dispositivos de computação matemática, baseados em processos puramente
mecânicos, hoje em dia as pessoas pensam em computadores, como dispositivos
electrónicos.
Um computador pode definir-se como uma máquina que aceita dados, excuta
operações lógicas e devolve resultados. Esta da definição é válida para qualquer
dispositivo que funcione mediante um programa gravado em memória.
Por volta de 1940, foi desenvolvido em Inglaterra o Colossus. Uma poderosa
máquina que seria capaz de descodificar a cifra (Enigma) utilizada pelas tropas
alemãs. Esta cifra era produzida por uma máquina de escrever electromecânica, que
estava ligada a um computador composto por cerca de 1500 válvulas. A base de
codificação era assente em algoritmos de estatística.
Só em 1950 é que os computadores ficaram disponíveis para aplicações
comerciais. Exemplo disso foi o Manchester Mk I (desenvolvido na universidade de
Manchester). Estes computadores eram enormes, ocupando a superfície de um
edifício por completo. As operações executadas eram muito específicas e, por isso
mesmo, associadas directamente ao hardware desenvolvido. Os programas tinham
entre 100 a 1000 operações.
Em 1956, a invenção do transístor por John Bardeen, William Shockley, e
Walter Brattain, valeu-lhes a conquista do prémio Nobel Física. Com esta invenção
foi dado um grande passo no sentido da sucessiva redução do tamanho e eficiência
dos dispositivos electrónicos semicondutores.
Barramento de Endereçamento
Memória
Barramento de Dados
RAM
ROM
(Random
(Read Only
Access
Memory)
Memory)
A família mais utilizada por todo o mundo é a família 16xxx com o popular
16F84. Um microcontrolador que tem sido utilizado nas mais diversas aplicações
electrónicas.
Entradas Saídas
Unidade Central
de
Processamento Armazenamento
Entradas auxiliar
Memória
Memória
Dados
Código de
programa
Entradas Saídas
Unidade
Central de
Processamento
ALU
1
Central Processing Unit - Unidade Central de Processamento
2
Arithmetic Logic Unit - Unidade Lógica e Aritmética
Interfaces - Para ser de algum uso, o computador deverá poder interagir com o
ambiente circundante. Qualquer tipo de dispositivo físico poderá ser controlado, para
além do teclado e monitor.
Memória
Dados
Entradas Saídas
Memória
Unidade
Central de Código de
Processamento Programa
ALU
• Core de 12 bits
• Core de 14 bits
• Core de 16 bits
• Core de 16 bit avançado
Poderá parecer limitativo um chip com tão poucos pinos mas, para a maioria
das aplicações em que o mesmo é proposto, a sua versatilidade, e o seu baixo preço,
tornaram-no muito popular. A maioria das famílias de 12 bits foi apresentada com
3
One Time Programable - Programável Apenas Uma Vez
4
Erasable Programable Read Only Memory - Memória Programável e Apagável
5
Ultra Violeta
6
Flash Erasable Programmable Read-Only Memory - EPROM Flash
A pequena quantidade de memória de cada PIC, e a curta Stack7, fez com que
o uso de compiladores C se tornasse difícil.
7
Pilha de memória
1.3.6.1. OTP
1.3.6.3. FLASH
Trata-se de uma memória não volátil, que pode ser apagada e escrita
electricamente. Todos os PICs mais recentes, incluem este tipo de memória, que se
distingue pela letra F; tais como os 16F84 ou 16F628A.
8
Disponível na Primetec - Engenharia de Sistemas, Lda., www.primetec.pt
• Maior Memória
→ Aumento de memória de programa de 1K a 2K
→ Aumento de memória de dados de 68 para 224 bytes
→ Aumento de memória EEPROM de 64 para 128 bytes
• Maior funcionalidade
→ Oscilador interno de 4MHz/37kHz, para aplicações não críticas
→ Detector de abaixamento de tensão
→ Passível de programação em baixa tensão
9
Consultar a folha de dados do microcontrolador, capítulo de Organização de Memória
Memória de INDF
Dados
TMR0
PCL
STATUS
FSR
ALU PORTA
Registo W
RAM
Fig. 14 – Registos
Fig. 15 - Opcode
Fig. 17 – Oscilador
2.2. Periféricos
Como não é possível incluir todos os periféricos num PIC, o projectista deve
consultar os catálogos da Microchip, de modo a descobrir qual o modelo que inclui no
seu interior, todos (se possível) os periféricos que necessita para o seu projecto.
Apesar da escolha poder parecer complicada, para a grande maioria dos
projectos, os modelos que existem no mercado, adequam-se perfeitamente. Raras são
as ocasiões em que não se encontra um modelo à medida das necessidades
10
Reduced Instruction Set Computer
11
Identificado por W
12
Os dados permanecem, quando a energia é retirada
PIC16F627A/628A PIC16F648A
Banco 0 20h - 7Fh 20h - 7Fh
Banco 1 A0h - FFh A0h - FFh
Banco 2 120h - 14Fh, 170h - 17Fh 120h - 14Fh
Banco 3 1F0h - 1FFh 1F0h - 1FFh
RP1 RP0
Banco 0 0 0
Banco 1 0 1
Banco 2 1 0
Banco 3 1 1
13
GPR - General Purpose Registers
14
SFR - Special Function Registers
Os SFRs são registos usados pelo CPU e pelos periféricos, para informações
de estado e para controlar a operação destes. Estes registos são RAM estática.
15
FSR - File Select Register
16
Bits normalmente chamados de Flags
17
RESET por abaixamento da tensão de alimentação
18
PC - Program Counter
tabela
addwf pcl,f ;adiciona W ao Program Counter - Contador
; de Programa
retlw 'a' ;caracter ASCII 'a'
retlw 'e'
retlw 'i'
retlw 'o'
retlw 'u'
19
Program Counter Low byte
20
positivo ou negativo
21
Program Counter LATch High byte
22
em blocos de 256 bytes
3.4. Stack
A família PIC com core de 14 bits tem uma Stack 23 de 13 bits, que é
exclusivamente usada para guardar endereços de retorno de subrotinas 24 . Esta
estrutura, mostrada na figura 18, é conhecida como Stack de Hardware. Esta Stack não
pertence ao mapa de memória, por isso, o seu conteúdo não pode ser alterado.
Associado a esta Stack, existe um contador de 3 bits, que aponta para o
seguinte registo livre, da mesma. Este Ponteiro de Stack - SP25 não pode ser alterado
por nenhuma instrução, mas é automaticamente incrementado de cada vez que uma
instrução CALL é executada. CALL é similar à instrução GOTO, mas antes de o
endereço de destino ser posto no PC, o valor actual do PC é empurrado para a Stack.
Este é o endereço da instrução depois da instrução CALL, pois o PC já foi
incrementado, e o PIC já está a ler a próxima instrução para o barramento, ao mesmo
tempo que a instrução CALL é executada – ver figura 16 do capítulo 2 (ciclos de
relógio).
23
Pilha ou acumulador de endereços
24
Os cores de 12 bits têm Stack de 11 bits, e os cores de 16 bits têm Stack de 16 níveis de profundidade
25
Stack Pointer
1. Empurra os 13 bits do PC, para o registo da Stack apontado pelo SP. Este
endereço é o da instrução a seguir CALL.
2. O SP é incrementado.
3. O destino da subrotina DELAY 100ms, que é o endereço de entrada na
subrotina, apaga o valor original do PC. Na verdade, isto faz com que a
execução do programa salte para a subrotina.
1. Decremento do SP.
2. Copia o endereço que está no registo de Stack, apontado pelo SP, para o
PC.
3.5.1 Inerente
26
Clear - Limpar
ou então:
¾ Movimento de dados
¾ Manipulação de registos
¾ Controlo de fluxo de programa
¾ Nenhuma operação
¾ Controlo do microcontrolador
¾ Operações lógicas
¾ Operações aritméticas
ou
END
• f - Registos
• d - Destino
0 - Registo W
1 - Registo normal
• k - Constante numérica
• k - Label
• b - Bit
• b - Binário
• d - Decimal
Esta é a instrução que não faz nada. É útil em situações onde o cumprimento
de períodos temporais é absolutamente fundamental.
Nesta janela introduza o nome do projecto que está a criar e escolha uma
directoria para gravar todos os ficheiros relativos ao mesmo. Nesta altura, deverá
aparecer-lhe numa segunda janela, normalmente encostada ao canto superior
esquerdo, toda a informação relativa aos ficheiros do projecto.
6.1.1. Timer 0
6.1.2. Divisores
6.1.3. Timer 1
6.1.6. Timer2
movlw 00h ;
movwf TRISB ; PORTB como outputs
movlw 02h ; Valor para contador
movwf contador1; Grava o valor
movlw 0Bh ; Valor para TMR1H
movwf TMR1H ; Grava o valor
mowlw DBh ; Valor para TMR1L
movwf TMR1L ; Grava o valor
; O valor programado é 3035
; que é = 65536-62500
; 62500 * 8 = 500000us
movlw b'00110101' ; bit 7-6: N/A
; bit 5-4: 11 ->Prescale 1:8
; bit 3: Oscilador do Timer1 desligado
; bit 2: Não sincronizar relógio externo
; bit 1: Relogio interno Fosc/4
; bit 0: Liga o Timer1
movwf T1CON ; Guarda o valor no registo T1CON
bsf PIE1, 0 ; Activa a interrupção TMR1IE
org 0004h
return
mesma contagem:
Para seleccionar que tipo de evento, em que queremos que desencadeie uma
captura, é necessário configurar os bits CCP1M3:CCP1M0 (CCP1CON<3:0>).
Quando uma captura é feita, o bit CCP1IF (PIR<2>) é colocado automaticamente no
nível lógico 1. Se ocorre uma nova captura, sem que o valor do registo CCP1R seja
lido, o valor da captura anterior é perdido.
A tabela seguinte apresenta a lista dos registos que estão associados aos modos
de Captura, Comparador e Timer1.
1
F= [Hz ]
T
Duty Cycle do PWM = (CCPR1L : CCP1CON < 5 : 4 > ) * Tosc * TMR 2 prescaler value
⎛ Fosc ⎞
log⎜ ⎟
⎜ FPWM * TMR 2 prescaler value ⎟
Re solução do PWM = ⎝ ⎠ [bits ]
log(2)
16000000
Baud Rate calculado = = 9615
64(25 + 1)
Fig. 73 – Valores de SPBRG possíveis, para diferentes baud rates, em modo síncrono
- EECON1
- EECON2
- EEDATA (Não implementado fisicamente)
- EEADR
O registo WREN deve ser activado para permitir a escrita. Quando a sequência
de escrita é concluída, a flag EEIF é activada pelo PIC.
Para aplicações em que um relógio externo existe, o pino de OSC1 pode ser
directamente ligado ao mesmo.
7.3. Reset
Alguns registos não são afectados em nenhuma condição de reset; o seu estado
é desconhecido no POR, e não modificado em qualquer outro reset. Os outros registos
são modificados no POR, BOR, MCLR’ e Watchdog normal; não são modificados no
Watchdog SLEEP, pois este reset é visto como um resumo de uma operação normal.
Os bits TO’ e PD’ são activados/desactivados em diferentes situações de reset,
conforme a Tabela 8.1, e são usados pelo software, para saber que tipo de reset
ocorreu.
7.4. Interrupções
O primeiro evento irá causar um Reset, enquanto que os dois últimos são
considerados, uma continuação da execução do programa. Os bits TO’ e PD’ podem
ser usados para determinar a causa do Reset.
Os oito bits de uma porta podem ser lidos ao mesmo tempo, usando a
instrução MOVF portX, W. Os dados são válidos, no momento em que a porta é
lida. Os pinos de cada porta podem ser lidos independentemente, usando as instruções
BTFSC e BTFSS.
As instruções orientadas para a manipulação directa de bits, BCF e BSF, lêem
toda a porta para o CPU, mudam o bit pretendido, e volta a escrever o conteúdo do
CPU de volta para a porta. Tudo num ciclo de relógio. Este método é chamado de Lê-
Modifica-Escreve.
A porta é lida no início de cada ciclo de instrução, e escrita no fim do mesmo
ciclo. Se a escrita é imediatamente seguida de uma leitura, na mesma porta, problemas
poderão ocorrer, porque a porta necessita de tempo para estabilizar. Este problema é
ultrapassado, inserindo uma instrução NOP entre a escrita e a leitura.
Executando duas escritas consecutivas em uma porta, pode originar o mesmo
problema. De novo, inserindo um NOP, resolverá a questão.
Uma Flag é um registo de 1 bit, que pode ser activado (1), ou desactivado (0),
por intermédio de vários tipos de instruções. A activação/desactivação, normalmente,
é feita automaticamente. Depois da execução da instrução, a Flag em questão pode ser
testada, para saber se foi activada ou desactivada. O fluxo/decisão do software escrito,
pode depender destes testes.
Das muitas Flags existentes, nos vários registos atrás mencionados, há duas de
extrema importância, e que devem ser descritas com mais pormenor. São elas a Z
(Zero bit), e a C (Carry bit). Estas encontram-se no registo STATUS.
Caso se queira limpar todos os bits da porta B, de uma só vez, não esquecer que a
porta B está mapeada como um registo normal, e a instrução CLRF pode ser usada
para o efeito:
O resultado é então:
N W Z C
W < N 0x05 0x04 0 1
W = N 0x05 0x05 1 1
W > N 0x05 0x06 0 0
org 0x0000
start
bsf status, 5 ;Banco 1
movlw 0x00 ;carrega W com 0x00
movwf TRISB ;configura porta B
bcf status, 5 ;Banco 0
repete
goto repete ;ciclo infinito
end
Outra maneira de testar se dois bytes são iguais, é usando a instrução XORLW.
O byte a ser testado é XOR’ado com o byte de teste. Se coincidirem, a flag Z será
activada.
Outra das maneiras, é mover o registo para si mesmo, isto é, com a ajuda da
instrução MOVF registo,f. A flag Z é afectada, por conseguinte, se estiver activada
depois desta instrução, o registo é 0x00.
Bit set – BSF, e bit clear – BCF, operam directamente num bit, num
determinado registo. Um exemplo, o bit 3 da porta A pode ser activado:
Um bit num registo pode ser testado usando as instruções BTFSC e BTFSS:
Operações lógicas são bastante úteis se, dois ou mais bits num byte, têm que
ser alterados ou testados, num ciclo de relógio.
→ AND com um byte de todos os bits 1, excepto o bit a mudar para ‘0’
→ OR com ‘0’ deixa o bit no mesmo estado
→ OR com ‘1’ resulta em ‘1’
A instrução RLF pode ser usada para deslocar o conteúdo do registo para a
esquerda, um bit de cada vez. Sempre que a instrução é executada, o byte desloca-se
uma posição para a esquerda, o bit mais à esquerda é movido para a flag de Carry, e o
conteúdo da flag de Carry é carregado no bit menos significante do registo.
A instrução RRF tem exactamente o mesmo procedimento, mas na direcção
oposta.
Por vezes, poderá ser necessário fazer circular um registo, sendo um requisito
para aplicações industriais, ou quando alimentando um display de LED’s.
A instrução RLF/RRF mantém o valor inicial do registo, fazendo o ciclo
completo através da Carry, e de volta, para o bit menos significativo.
Uma vez que o conteúdo da Carry é reciclado, de cada vez que usamos a
instrução RLF/RRF, a Carry deverá ser posta num estado conhecido (‘1’ ou ‘0’). Para
o fazer, basta usar a instrução BCF/BSF no bit 0 do registo STATUS (flag de Carry).
org 0x0000
O processador soma o valor hexadecimal ao PC, onde este vai ser o apontador
para o código de 7-segmentos, que irá ser posteriormente posto na saída da porta B.
A instrução ADDWF soma 8 bits aos 8 bits baixos do PC, e não afecta os 5
bits altos.
• Grava o registo W
• Grava o registo STATUS
• Executa a rotina de interrupção
• Devolve os valores ao STATUS
• Devolve os valores ao W