sábado, 19 de janeiro de 2008

Título:Livro básico sobre Microcontroladores PICs.
Autor:
Luiz Bertini
Texto:Aprenda sobre
microcontroladores PIC de uma forma rápida e básica.

Capitulo 1 - A teoria inicial

Antes de falar em
microcontroladores vamos definir algumas coisas para o aprendizado ficar mais fácil:

-bit é um dígito que corresponde a 0 ou 1.
-byte é uma
sequencia de bits, com oito no total.
-
word é uma palavra com mais de 8 bits (algo como um bytão...).
-
nibble é uma palavra com 4 bits (algo como um bytinho...).
-o famoso flag é um bit dentro de um registrador.
-um registrador é um endereço na memória que tem cada bit de seu byte (oito
digitos) com uma função. E os registradores servem para ajustar, definir e mostrar o funcionamento do PIC.


Final do capítulo 1, já decorou... 19/01/2008

Capitulo 2 - Os principais registradores

Nos estaremos baseando este curso no
PIC16F628 e ele será todo escrito de memória, vai ser um teste para mim e, espero, um aprendizado para voce.

São três os registradores mais importantes do
PIC16F628:

-o
status
-o
intcon
-o
option ou option_reg

O registrador
status: ele é responsável por ns os resultados das operações lógicas e aritméticas do microcontrolador. Através da leitura e escrita em seus flags podemos saber o estado em que está o microcontrolador. Lendo alguns de seus flags, com o Z, o C e o DC, podemos construir programas mais curtos, inteligentes e eficientes.

O registrador
intcon: ele é responsável pelo controle das interrupções que o pic pode sofrer. Uma interupção é um sinal lógico, interno ou externo, que fará o pic mudar o que está fazendo e ir para um determinado endereço, normalmente 4 em decimal.

O
regitrador option ou option_reg: ele tem estes dois nomes pois , em pics antigos, havia uma intrução chamada option e para evitar problemas convencionou-se chamá-lo de option_reg. Ele define algumas opções de funcionamento do PIC. Como exemplo podemos citar o controle do timer0 e do prescaler. Um prescaler é um divisor.

Final do capítulo 2. 21/01/2008

Capítulo 3: Os registradores que comandam as entradas e
saídas (I/O).

Temos no
PIC16F628 dois registradores específico para definir se os pinos serão entradas ou saídas. Estes registradores recebem o nome de TRIS.

As
entradas e saídas estão juntas em um barramento que recebe o nome de PORT.

No nosso caso temos o
portA e o portB.

O porta define as portas ligadas em um conjunto de I/Os.
O
portb define outro conjunto de I/Os.

Para comandar o porta temos o registrador
TRISA e para comandar o portb temos o registrador TRISB

Cada registrador destes tem 8 bits ou 8 flags, e o nível deles, se zero ou um é que definirá se
aI/O (que nada mais é que um terminal ou pino do CI) será uma entrada ou uma saída.

Se o flag for 1 o pino será entrada.
Se o pino for 0 o pino será
saída.

23/01/2008

É através destas I/Os, que conseguimos nos comunicar com os PICs. É importante lembrar que eles entendem sinais de padão TTL, ou seja, 1 e igual a 5 volts e 0 é igual a 0 volts (para simplificar).

Algumas destas I/Os tem mais de uma função e estas funções serão definidas através, do correto ajuste dos registradores do PIC. Só para adiantar um pouco as coisas, existem mais registradores que fazem parte do PIC. Vamos estudá-los quando for necessário.

Normalmente se usa o porta como entrada e o portb como saída, mas esta não é uma regra geral e sim, mais um costume de muitos programadores.

25/01/08

Falamos que o nível 0 corresponde a zero volts e o nível 1 a cinco volts e isto deve ficar bem claro para o leitor, pois embora o estudo do PIC possa parecer apenas para aprender a programação (ou seja o software) também existe e é imprescindível, o hardware que é o próprio componente PIC, e todos os outros componentes ligados a ele, como resistores, capacitores, leds, etc...
De nada adianta voce conhecer todas as instruções se não sabe conectar o pic de forma que ele seja a parte ativa de um circuito.

A maioria da pessoas que fazem programação gostam de trabalhar com a base hexadecimal. Mas o que é isto voce pergunta? É uma base numérica onde contamos desde o zero até o número 15, dando um total de 16 números diferentes.
Normalmente usamos a base decimal, onde contamos do zero ao 9 e temos dez números diferentes.

Veja o decimal:

0= zero
1=um
2=dois
3=três
4=quatro
5=cinco
6=seis
7=sete
8=oito
9=nove

Veja agora o hexadecimal:
0=zero
1=um
2=dois
3=três
4=quatro
5=cinco
6=seis
7=sete
8=oito
9=nove
10=A
11=B
12=C
13=D
14=E
15=F

Dá para perceber a diferença...

Mas como eu estava dizendo muito programadores, técnicos, engenheiros, ou xeretas, como eu, gostam de usar a base hexadecimal, eu prefiro usar a base decimal e, quando necessário trabalhar em binário.

Binário é outro sistema de numeração com base igual a dois, ou seja só temos dois números, o número 0 (zero) e o número 1(um).

Veja:

0=zero
1=um

Voce pode pensar que com isto não dá para fazer nada, mas está enganado, na realidade o mais próximo do que o microcontrolador entende é isto, uma sequência de zeros e uns...

Como o pic trabalha com oito bits, ou seja, um byte, vamos dar uma olhada no binário usando o bits:

00000000=zero
00000001=um
00000010=dois
00000011=três
00000100=quatro

e por aí vai...

No cabeçalho de um programa voce pode optar em trabalhar com a base decimal, hexadecimal ou octal (que tem 8 dígitos), mas durante o programa voce pode usar qualquer base, como o binário, contanto que informe o PIC que esta fazendo esta mudança.

Nas próximas lições veremos como converter de um sistema para o outro e de como começar a fazer o primeiro programa para um PIC.

27/01/2008

Capítulo 4 - Tipos de memória.

Embora este seja um capítulo curto e simples é importante que voce o entenda bem, para não confundir as bolas, ou digo, as memórias, depois...

Existem diversos tipos de memórias:

Memórias ROM - é um tipo de memória que só pode ser gravada uma vez. Voce pode encontrar este tipo de memória na placa de seu micro, se ele for velhinho, pois é numa memória destas que fica guardado a "cara" do setup. A informações que voce muda ficam numa outra memória.

Memórias RAM - Podem ser gravadas e lidas diversas vezes, só que perdem toda a informação quando a alimentação delas é cortada. Numa memória similar a esta ficam os dados que voce altera no setup e é por isto que voce perde tudo quando a bateria "fica bichada".

Memória EPROM - podem ser gravadas e apagadas. Para apagá-las é necessário o uso de luz ultravioleta.

Memórias EAROM - Voce pode escrever e ler esta memória e, se quiser apagá-la, basta aplicar um nível correto de tensão no pino correto. Foi muito usada em TVs antigas.

Memórias EEPROM ou E2PROM - são as memórias que permitem gravaão, leitura e regravação, mais utilizadas atualmente. Uma memória bem comum é a 24C08. Elas mantém a informação mesmo sem a alimentação. Tem gente que chama estas memórias de serial eprom ou serial e2prom. Isto se deve ao fato de grande parte delas serem gravadas com um protocolo (forma de comunicação) serial, conhecido como I2C.

Memórias FLASH - é a memória mais rápida, gravação e regravação e tem uma infinidade de usos. Existem variações deste tipo de memória, mas a que nos interessa ressaltar aqui são as que não perdem os dados mesmo sem a alimentação. Alguns chamam de flash e2prom.

09/02/2008

Capítulo 5 - Registradores

O registrador W.

O registrador W é extremamente útil no PIC, pois é através dele que fazemos diversas partes de um programa.
O nome registrador W vem de “Registrador Work”, que traduzindo, quer dizer trabalho.

É através dele que carregamos os outros registradores com valores diversos e corretoss para um perfeito funcionamento de nosso projeto.

Caso desejamos colocar um determinado valor em um registrador de uso geral (GPR), primeiro temos que “carregar” o registrador W e depois passar para o outro registrador.

Para carregarmos o registrador W usamos as instruções:

MOVWF e MOVLW

CATEGORIA DE REGISTRADORES

Os microcontroladores PICs possuem dois tipos de registradores, além dos registradores W, estes registradores são chamados de “GPR e SFR”, e normalmente, são indicados pela letra f (minúsculo).

Ao contrário do registrador W, eles estão implementados dentro da memória RAM. As siglas significam o seguinte:

GPR = General Purpose Register = Registrador de Propósito Geral (mais fácil -> Registrador de Uso Geral).

SFR = Special Function Register = Registrador para Funções Especiais.

f = file register = Registrador de Arquivo.

Normalmente se usa “f” tanto para identificar registros “SFR” como “GPR”.

Um registro é um endereço de memória, que pode receber um nome.

Como os microcontroladores usados são de 8 bits o registro pode ter um valor entre 0 a 255 em decimal (28 = 255) ou de 0000 0000 a 1111 1111 em binário ou de 0 a FFH em hexadecimal.

No caso do PIC 16F84 ou do 16F628, este registro tem que estar em uma posição da memória entre 0 a 127 em decimal ou 0000 0000 a 0111 1111 em binário ou 0 à 7FH em hexadecimal.

Temos um espaço na memória RAM, de uso geral, que vai de 12 a 79 em decimal ou 0CH a 4FH em hexadecimal o que nos deixa um espaço de 68 bytes para o PIC 16F84 no banco 0 espelhado no banco 1.

Temos um espaço de memória RAM, de uso geral, que vai de 32 a 128 no banco 0 o que dá 96 bytes, temos um espaço de 160 a 240 no banco 1 o que dá 80 bytes e de 288 a 335 no banco 2, o que dá 47 bytes para o PIC 16F628. Temos assim o valor de 96 + 80 + 47 bytes disponíveis no PIC 16F628.

Importante: Um registrador é um endereço na memória RAM.

O ideal é darmos um nome a este registrador. Todo registrador pode assumir um valor entre 0 a 255 em decimal.

Também é importante perceber que podemos definir um endereço ou uma variável em decimal, binário ou hexadecimal, exemplo:

128 em decimal é igual a 10000000, em binário que é igual às 80H.

Em binário fica mais fácil visualizarmos o estado de cada bit, por exemplo, você saberia como estariam os bits se coloca-se no “INTCON” o valor 154 em decimal?

Podemos escrever nosso programa usando como base numérica o decimal, o octal, o binário ou o hexadecimal. Mas, precisamos avisar o microcontrolador em qual base vamos trabalhar.

O número máximo de registradores de um microcontrolador irá depender do tipo de microcontrolador.

Cabe lembrar que teremos os registradores SFR que definirão as características de funcionamento do microcontrolador (como exemplo podemos citar o INTCON, o TRISA, o STATUS) e os GPR que são registradores de uso geral e normalmente “criados” pelo programador. No caso do PIC 16F84 estes registradores de uso geral se limitam a 15.


17/02/2008


Capítulo 6: O watch dog

O watch dog é um contador interno do pic, que não precisa do cristal e que não está amarrado em ninguem. Mas para que isto? Ele serve de proteção para o circuito que o pic irá controlar ou para o operador da máquina que o pic controla.
Imagine que voce fez um software para comandar um elevador e entra um ruído e faz com que o pic trave e seu oscilado a cristal pare, o que aconteceria? O elevador deixaria de funcionar. Mas com o watch dog funcionando e setado nos fusíveis ou bits de configuração do pic, isto não acontecerá. Por que? Pois ele continuará contando e resetará o pic fazendo ele começar a funcionar novamente e o elevador funcionar novamente.

Voce deve sempre estar atento ao watch dog, particularmente quando seu programa tem muitas subrotinas para gerar tempo, caso não coloque a função clrwdt seu tempo de contagem(próximo há 18 milisegundos) estourará e ele resetára o pic e seu software não funcionará.

Mais um pouco:

Como eu já havia dito anteriormente neste livro, o watch dog é um timer ou temporizador independente do clock do PIC ou de qualquer outro componente externo.

Ele sempre esta contando e o seu tempo total de contagem é de, aproximadamente, 18ms.

Este tempo pode variar de acordo com a temperatura e flutuação na alimentação (olha o ripple novamente). Mas, o importante é saber que quando o tempo de contagem excede 18ms, ele estoura (daí você vê uma pequena fumaça subindo da bancada), ou melhor, dizendo, ocorre um overflow e ele reseta o PIC e assim o programa começa tudo de novo.

A função dele é evitar que algum travamento no programa, causado por hardware ou software, seja resolvido depois de um reset do microcontrolador.

Imagine um dimmer (controlador de intensidade luminosa) constituído com um PIC. Em determinado momento um pico de energia faz com que a luz, que estava bem fraquinha, fique com o seu brilho máximo devido há um “travamento” do PIC. O watch dogreseta” ele e o brilho volta ao normal se o seu programa foi feito para isto.

Isto apenas é um exemplo, imagine a importância do watch dog em sistemas ligados à segurança.

Mas, meus programas vão ficar limitados a rodarem em 18ms? É claro que não. Basta você usar a instrução CLRWDT, e o registrador WDT, que faz a contagem da watch dog, será resetado e não acontecerá o overflow nem o reset do PIC. Mas, se o seu programa travar, ele não passará por esta instrução e o overflow acontecerá.

A instrução CLRWDT é extremamente útil quando precisamos criar sub-rotinas de tempo, traduzindo para o português correto, ela é importante se pretendermos fazer um timer com o PIC.

O watch dog pode ser ligado ou desligado, ou melhor, dizendo, pode ser ativado ou desativado em apenas duas condições:

- com uma linha de comando no cabeçalho do programa;

- na hora da gravação do PIC.

Se você usar a instrução sleep (acorda o meu filho ou filha) e se acontecer um estouro, o microcontrolador retornará na instrução seguinte ao sleep.

Você pode associar o watch dog ao prescaler, que é um divisor ajustável, e aumentar o período dele para até 2,2 segundos aproximadamente (não tenho cronômetro).

Vamos estudar o prescaler daqui a pouco. Agora vamos salientar que apenas duas instruções zeram o watch dog e fazem com que ele recomece a contar.

As funções são:

SLEEP Þ zera o watch dog e coloca o PIC em modo econômico.

CLRWDT Þ zera o watch dog evitando o overflow ou estouro e o reset do PIC.

23/08/2008

Capitulo 7 - O Prescaler.

Antes de tudo o prescaler é um divisor. No caso dos PICs é um divisor que pode ter o seu fator de divisão ajustado.

O prescaler que é um divisor pode ser atribuído, ou seja, pode estar conectado ao TMR0 (timer 0) ou ao watch dog. Para definirmos isto precisamos atribuir um valor ao bit 3 ou flag 3 do registrador Option.

Se o valor do bit 3 for 1 a prescaler estará ligado e dividindo a contagem do watch dog.

Se for 0 o prescaler será atribuído ao TMR0.

Podemos perceber a importância dos registradores, vamos estudá-los mais profundamente em um próximo capítulo. Tudo ao seu tempo.

O bit 0, o bit 1 e o bit 2 do registrador Option definem a taxa de divisão do prescaler. Já aviso que esta taxa é diferente para a watch dog e para o TMR0.

Estes bits tem nomes próprios, vamos vê-los:

O bit 3 recebe o nome de PSA.

O bit 0 tem o nome de PS0.

O bit 1 tem o nome de PS1.

O bit 2 tem o nome de PS2.

Você pode ler ou escrever o valor nestes flags do registrador Option.

Podemos perceber que de acordo com os valores nas posições PS2, PS1 e PS0, teremos um fator de divisão.

Também podemos perceber que a máxima divisão do Timer0 será por 256, e a máxima divisão do watch dog será por 128.

Nas nossas experiências iremos “ver” estas divisões na prática.

Capitulo 8 - a pilha ou stack.


O stack consiste em uma pilha com oito posições diferentes. Também podemos dizer que ele tem oito níveis diferentes. O stack nesta família de PICs não é acessível ao programador.

Sua função é armazenar a posição em que o programa parou ou foi desviado, para executar uma sub-rotina e fazer o programa voltar para a posição imediatamente seguinte, após realizar a sub-rotina.

Ele trabalha junto com o PC que é o programa Counter ou Contador de Programa.

Basicamente falando o PC conta as linhas do programa que estão sendo executadas e seu funcionamento é praticamente transparente ao usuário ou ao programador.

Toda vez que uma instrução Call é usada, o PC armazena o valor PC+1 na Stack, isto para saber em qual linha do programa deve voltar.

A mesma coisa acontece quando usamos interrupções.

Como temos apenas 8 níveis, não podemos ter mais de 8 instruções de desvio acontecendo ao mesmo tempo, pois as chamadas acima da oitava serão armazenadas sobre as outras e aí o programa não saberá para onde ir.

Os oitos níveis no Stack são montados da seguinte forma:

- nível 8 Þ 8ª chamada call.

- nível 7 Þ 7ª chamada call.

- nível 6 Þ 6ª chamada call.

- nível 5 Þ 5ª chamada call.

- nível 4 Þ 4ª chamada call.

- nível 3 Þ 3ª chamada call.

- nível 2 Þ 2ª chamada call.

- nível 1 Þ 1ª chamada call.

- terminada a 8ª chamada este espaço ficará vago.

- terminada a 7ª chamada este espaço ficará vago e assim, sucessivamente.

A pilha é montada de baixo para cima e desmontada de cima para baixo.

Como na série 16 dos microcontroladores PIC não podemos ver o estado da pilha, é muito importante prestar atenção em quantas chamadas se está usando. Caso o Stack esteja cheio e uma chamada seja feita, o nível 1 já era, ou melhor, o endereço que estava no nível 1 já era, e o seu programa também.

O PC não voltará para o lugar correto ao chegar ao nível 1.

As únicas instruções que tem acesso à pilha são Call, Return, Retlw e Retfie além da interrupção.

Um Call e uma interrupção guardam endereços de retorno no Stack.

A instrução “GOTO” não armazena endereço no Stack.

Se você for usar interrupções em seu programa, considere a pilha com apenas 7 níveis, pois se não fizer isto e acontecer uma interrupção com os 8 níveis ocupados, haverá um estouro da pilha e o seu programa não funcionará.

Usou interrupção, deixe um nível vazio no Stack.

23/08/2008