49
AUTOR Maurício Madeira Oliveira Página pessoal (fonte): www.seguidorsolar.com.br Este curso pode ser usado e divulgado, sem fins comerciais, citar fonte e autor Microcontrolador – 16F84A (Revisado em 14/04/2011) Os microcontroladores (μC) podem ser chamados de microcomputadores de um só chip , são usados , pelos mais diversos equipamentos eletrônicos , como: Instrumentos de medidas, celulares, DVD, alarmes, eletrônica embarcada, televisores, controle-remoto, agendas eletrônicas, GPS, micro-ondas, máquinas de costura e bordar, etc. Possui em uma única pastilha (ci), memória de dados, temporizadores, canal serial, vários canais de I/O, eeprom, pwm, uart, usb, conversor AD e etc. Arquiteturas usadas em microcontroladores: Existe a tradicional Von Newman, baseada em um único barramento por onde trafegam dados e instruções (8051) e Harvard que prevê varias vias de comunicação entre CPU e periféricos permitindo a realização de várias operações simultâneas, os microcontroladores PIC da Microchip se baseiam nesta arquitetura. No PIC 16F84 os dados são de 8 bits e as instruções são de 14 bits. Com esta facilidade em uma palavra de 14 bits podemos ter código de instrução (opcode) , onde vai atuar e o eventual operando ou dado. Criou-se uma terminologia chamada RISC (reduced instruction set computer) que no PIC são aproximadamente 35 instruções. Pinagem do PIC 16F84A (18 pinos): RA0 – entrada ou saída PORTA (P17). RA1 – entrada ou saída PORTA (P18). RA2 – entrada ou saída PORTA (P01).

Microcontrolador – 16F84A (Revisado em 14/04/2011)

  • Upload
    others

  • View
    3

  • Download
    0

Embed Size (px)

Citation preview

AUTOR Maurício Madeira Oliveira

Página pessoal (fonte): www.seguidorsolar.com.br Este curso pode ser usado e divulgado, sem fins comerciais, citar fonte e autor

Microcontrolador – 16F84A

(Revisado em 14/04/2011)

Os microcontroladores (µC) podem ser chamados de microcomputadores de um só chip , são usados , pelos mais diversos equipamentos eletrônicos , como: Instrumentos de medidas, celulares, DVD, alarmes, eletrônica embarcada, televisores, controle-remoto, agendas eletrônicas, GPS, micro-ondas, máquinas de costura e bordar, etc. Possui em uma única pastilha (ci), memória de dados, temporizadores, canal serial, vários canais de I/O, eeprom, pwm, uart, usb, conversor AD e etc. Arquiteturas usadas em microcontroladores: Existe a tradicional Von Newman, baseada em um único barramento por onde trafegam dados e instruções (8051) e Harvard que prevê varias vias de comunicação entre CPU e periféricos permitindo a realização de várias operações simultâneas, os microcontroladores PIC da Microchip se baseiam nesta arquitetura. No PIC 16F84 os dados são de 8 bits e as instruções são de 14 bits. Com esta facilidade em uma palavra de 14 bits podemos ter código de instrução (opcode) , onde vai atuar e o eventual operando ou dado. Criou-se uma terminologia chamada RISC (reduced instruction set computer) que no PIC são aproximadamente 35 instruções. Pinagem do PIC 16F84A (18 pinos):

RA0 – entrada ou saída PORTA (P17). RA1 – entrada ou saída PORTA (P18). RA2 – entrada ou saída PORTA (P01).

RA3 – entrada ou saída PORTA (P02). RA4 – entrada ou saída PORTA (P03), também é entrada do Timer zero. RB0 – entrada ou saída PORTB (P06), também é interrupção externa. RB1 – entrada ou saída PORTB (P07). RB2 – entrada ou saída PORTB (P08). RB3 – entrada ou saída PORTB (P09). RB4 – entrada ou saída PORTB (P10). RB5 – entrada ou saída PORTB (P11). RB6 – entrada ou saída PORTB (P12). RB7 – entrada ou saída PORTB (P13). RB4 a RB7 – também sinalizam interrupção por mudança de estado. VDD – alimentação ( 2V a 6V, típico 5V) (P14). VSS – referência de terra (P05). MCLR\ - entrada de reset (em nível 0) (P04). OSC1/CLKIN – cristal ou entrada de clock externo (P16). OSC2/CLKOUT – cristal ou saída do clock/4 quando usado sinal externo (P15). Principais características: 1 K (1024) palavras de 14 bits para programa. 68 bytes de uso geral. 64 bytes de EEPROM para dados. Stack com 8 níveis. 35 instruções. 15 registros especiais em RAM (SFR’s) para controle do chip e periféricos. Timer 8 bits e prescaler. 13 pinos entrada/saída (cfe. config.) PORTA e PORTB. Alta capacidade de corrente nos pinos. Capacidade de gerenciar até 4 interrupções. Watch Dog para recuperação e reset em caso de travamento de software. Memória de programa protegida contra cópias. Modo sleep, economia de energia. Várias opções de osciladores. O microcontrolador 16F84A pode operar de DC até 20 Mhz ( ou até 10 MHz no 16F84). Vamos usar em nossos estudos um clock de 4 MHz (a cristal), o que nos proporciona um ciclo de máquina de 1 uS. O PIC divide o sinal de clock por 4 internamente gerando as fases Q1, Q2, Q3 e Q4, que somadas formam 1 ciclo de máquina: Tc = 1/(Fosc/4) ou Tc = (1/Fosc) x 4 A característica de buscar a informação em um ciclo de e executa-la no ciclo seguinte chama-se PIPELINE, as instruções são executadas em 1uS, com exceção das instruções que alteram o PC (program counter) , que usam dois ciclos.

NOTA: OS DIAGRAMAS QUE SEGUEM NÃO TÊM O N° DO PINO. QUALQUER DÚVIDA VERIFICAR OS MESMOS NA PÁGINA UM. Os circuitos de CLOCK : O PIC pode operar com 4 modos diferentes de osciladores, a saber: a) RC (resistor-capacitor): modo simples e de baixo custo, mas que oferece instabilidade

na frequência, com variação do VCC e da temperatura, recomendado em aplicações

onde a precisão do clock não é importante. Nota: na saída osc2 colocar um ociloscópio ou frequencimetro, para ajustar a frequência de operação do sistema (por ex.: 4Mhz em osc1 terei 1Mhz em osc2). b) XT (modo cristal): de 100Khz a 4Mhz.

Nota: as ligações entre os pinos do ci, cristal e capacitor , devem ser as mais curtas possíveis. c) HS (modo cristal): acima de 4Mhz.

Podemos usar cristal ou ressoador cerâmico. A ligação elétrica é idêntica a do modo XT.

d) LP (modo cristal) : baixa potência < 200 Khz .

OBS.: também podemos um circuito de clock externo , gerado por um oscilador qualquer que entrando por osc1 ira determinar a frequência de trabalho para um ou mais PIC . O circuito de Reset : a) O PIC pode ser resetado ao alimentá-lo, basta ligar o pino (MCLR\) em Vcc, esta seria

a forma mais básica:

OBS.: acima, temos o circuito mínimo de POR (power-on-reset). b) Um circuito mais elaborado, seria com uma chave para reset manual, quando

necessário.

Nota: o pic possui ainda um sistema que gera 72 mS fixo, após o final do POR usado, ficando por mais este tempo em reset.

Nota: quando utilizamos o modo XT, LP ou HS, o timer de partida do oscilador (OST) é automaticamente acionado por 1024 períodos do oscilador, para sair do reset; isto garante a estabilização do cristal ou resonador. As memórias do PIC: A família PIC possui em sua arquitetura, segmentos de memória separados para programas e dados, e inclusive com palavras de tamanho diferentes. O PC (programa counter) da família 16Cxxx tem 13 bits, permitindo memória de programa de até 8Kbytes (2 exp.13). O pic 16F84A possui apenas 1K (000 até 3FFh). Qualquer referência a outras posições de memória será deslocada para este bloco de 1K. No reset do PC ele aponta para o endereço 000 e ao atender uma interrupção o PC é carregado com o endereço 004h. a) Memória de programa – devido a estrutura Havard ela pode ter palavras de 12,14ou 16

bits, no caso do 16F84 o tamanho da palavra manipulada na memória é de 14 bits; esta área reservada do microcontrolador é onde será gravado o programa de controle do mesmo ,em alguns modelos temos uma eprom, no CI em estudo a memória é do tipo FLASH, o que nos permite gravar e apagar centenas de vezes esta memória, tornando-se o ci mais indicado para desenvolvimento de sistemas.

b) Stack (pilha): local separado da memória de programa para salvar endereços do PC, para o qual o programa principal retornara após executar interrupções ou subrotinas que forem chamadas. O stack salva só o endereço de retorno, as condições do microcontrolador têm que serem tratadas pelo usuário. O stack do 16F84 tem 8 níveis , ou seja se passar deste número de interrupções ou subrotinas ele perdera a mais antiga.

c) Memória de dados: nada mais é do que uma área de RAM, utilizada para guardar as

variáveis e registradores usados pelo sistema microcontrolado, no PIC esta área é separada em bancos de memória, no caso do 16F84 temos o banco 0 e banco 1, que são selecionados pelos bits RP1 e RP0 do registro STATUS que veremos adiante.

d) SFR (special function registers – registros especiais de controle): são usados pela CPU e ou periféricos para controlar o funcionamento do chip conforme o desejado. Se dividem em 2 tipos , controle e uso da CPU e controle e uso dos periféricos. São lidos e escritos tanto pelo usuário como pelo hardware, ocupam espaço na RAM, e podem estar em um ou em ambos os bancos de memória, e são acessados através de seu endereço.

e) Registradores de uso geral: área destinada ao armazenamento de variáveis definidas

pelo usuário, para serem escritas ou lidas pelo programa. O tamanho desta área de RAM depende do PIC usado.

f) EEPROM: alguns PIC possuem esta memória especial não volátil (o 16F84 possui uma

de 64 bytes), que podemos usar para escrever ou lerem dados.

Memória de dados e RAM de uso geral:

BANCO 0 BANCO 1

As interrupções do PIC: Uma interrupção, para a execução do programa que estiver em curso, é desviado para o endereço 0004h no caso do PIC, onde teremos uma rotina de interrupção que será

executada pelo microcontrolador, e após voltara para a instrução seguinte a que foi atendida a interrupção (o PC guarda o último end.+1 para o retorno). No PIC 16F84 as interrupções podem acontecer por: Overflow do timer 0. Fim de escrita na EEPROM. Interrupção externa pelo pino RB0/INT. Mudança nos pinos RB4 a RB7. Como trata-las será descrito nos registradores e rotinas adiante. Os registros de controle da CPU: Estudaremos a seguir os registros STATUS, OPTION, INTCON, e registros de controle das portas. Com eles e que inicializamos nosso microcontrolador. a) STATUS : Configura a página de memória atual (banco 0 ou 1), flags da ULA e forma

do ültimo reset. BIT 7 IRP Seleciona bancos - no 16F84 sempre em 0 BIT 6 RP1 No 16F84 manter em 0 BIT 5 RP0 Seleciona

bancos 0=banco 0 e 1=banco1

BIT 4 TO\ Bit sinaliza time out/ 1=power-up,clrwdt,sleep, 0=time-out do watch dog BIT 3 PD\ Power Down/1=power-up,clrwdt, 0=inst.sleep BIT 2 Z Bit sinalizador 0,1 reg.estac/vlr.0 se =0 oreg.dif.de 0 BIT 1 DC Digit carry/borrow BIT 0 C Carry/borrow b) OPTION: Configura prescaler, timer, e outras opções. Na programação usa-se option-

reg, pois em PICs mais antigos existia uma instrução option. BIT 7 RPBU\ Habilita os pull-up portB 1=desab. 0=hab. BIT 6 INTEDG Como aceitara int.externa (RB0) 1=borda de susbida 0=borda de descida BIT 5 TOCS Fonte do clock do timer 0 1=pino RA4/TOCKI 0=clock interno (f/4) BIT 4 TOSE Como o clock ext.inc.timer 0 1=borda descida 0=borda susbida BIT 3 PSA Atribuição do prescaler 1=Watch dog 0=timer 0 BIT 2 PS2 PS2 BIT 1 PS1 PS1 VER TABELA ABAIXO BIT 0 PS0 PS0

PS2 PS1 PS0 TIMER 0 WATCH DOG 0 0 0 1 para 2 1 para 1 0 0 1 1 para 4 1 para 2 0 1 0 1 para 8 1 para 4 0 1 1 1 para 16 1 para 8 1 0 0 1 para 32 1 para 16 1 0 1 1 para 64 1 para 32 1 1 0 1 para 128 1 para 64 1 1 1 1 para 256 1 para 128

Nota: para assegurar uma taxa de 1:1 na frequência de contagem do timer0 direcionar o prescaler para Watch dog . c) INTCON: serve para configurar e identificar as interrupções. BIT 7 GIE Habil.geral das int. 0=desab. 1=hab. BIT 6 EEIE Habil.da int.de final de escrita 0=int.não será tratada 1=int.será tratada BIT 5 TOIE Hab.de overflow timer 0=nào tratada 1=int.será tratada BIT 4 INTE Hab.da int.externa RB0 0=int.não será tratada 1=int.será tratada BIT 3 RBIE Hab.da int.mudança RB4 a RB7 0=int.não será tratada 1=int.será tratada BIT 2 TOIF Identificação de over.timer 0 0=não ocorreu 1=ocorreu BIT 1 INTF Identificação da int.externa RB0 0=não ocorreu 1=ocorreu BIT 0 RBIF Identificação da int.por mudança de estado 0=não ocorreu 1=ocorreu

d) TRIS: registros de configuração das portas de IO (Port B e Port A) , através do TRIS e

que determinamos se determinado pino de uma porta será entrada ou saída. Para programar a porta A usamos o TRISA, e a porta B o TRISB, quando queremos que o pino seja entrada setamos (1) o bit correspondente ao pino no registro, se queremos que seja uma saída resetamos (0) o bit correspondente ao pino no registro TRIS.

TRISA BIT 7 NC BIT 6 NC BIT 5 NC BIT 4 RA4 Pino 3 0=saída 1=entrada BIT 3 RA3 Pino 2 0=saída 1=entrada BIT 2 RA2 Pino 1 0=saída 1=entrada BIT 1 RA1 Pino 18 0=saída 1=entrada BIT 0 RA0 Pino 17 0=saída 1=entrada

TRISB BIT 7 RB7 Pino 13 0=saida 1=entrada BIT 6 RB6 Pino 12 0=saida 1=entrada BIT 5 RB5 Pino 11 0=saida 1=entrada BIT 4 RB4 Pino 10 0=saida 1=entrada BIT 3 RB3 Pino 9 0=saida 1=entrada BIT 2 RB2 Pino 8 0=saida 1=entrada BIT 1 RB1 Pino 7 0=saida 1=entrada BIT 0 RB0 Pino 6 0=saida 1=entrada e) PCL e PCLATH: O PCL é o registro que armazena os 8 bits menos significativos do

PC e o PCLATH os 5 bits mais significativos, o programador pode acessar o PCL (mas com cuidado para não travar o µC)) . o PCLATH só é acessado pelo hardware do µC).

PCL BIT 7 Escrita e leitura BIT 6 Escrita e leitura BIT 5 Escrita e leitura BIT 4 Escrita e leitura BIT 3 Escrita e leitura BIT 2 Escrita e leitura BIT 1 Escrita e leitura BIT 0 Escrita e leitura

f) Portas de I/O (PORTA e PORTB): o estado destas portas é acessado diretamente em

posições distintas da memória. E cada bit pode ser testado individualmente , se for entrada verificaremos qual o nível de tensão presente no mesmo, e se for saída poderemos determinar o valor que queremos para cada pino.

PORTA BIT 4 I/O Schmidt trigger Open

drain In timer0

BIT 3 I/O TTL BIT 2 I/O TTL BIT 1 I/O TTL BIT 0 I/O TTL

PORTB BIT 7 I/O TTL Pode gerar int.ext.por mudança de estado BIT 6 I/O TTL Pode gerar int.ext.por mudança de estado BIT 5 I/O TTL Pode gerar int.ext.por mudança de estado BIT 4 I/O TTL Pode gerar int.ext.por mudança de estado BIT 3 I/O TTL BIT 2 I/O TTL BIT 1 I/O TTL BIT 0 I/O Schmidt trigger Int.externa Nota: todos os pinos do PORTB possuem Pull-up interno, e para ser habilitado globalmente o bit 7 (RPBU\) do OPTION deve ser zerado. Individualmente apenas os bits de entrada terão pull-ups habilitados.

TIMER 0: contador de 8 bits na memória que pode ser acessado para escrita ou leitura. O seu incremento pode ser interno (Fclock/4, logo T=1/(fclock/4)),o que em um clock de 4Mhz será um pulso a cada 1uS . Também pode ser incrementado externamente pelo pino RA4 (TOKI). Nosso TIMER 0 pode ser usado de duas formas, temporizador ou contador. BIT 7 ESCRITA/LEITURA BIT 6 ESCRITA/LEITURA BIT 5 ESCRITA/LEITURA BIT 4 ESCRITA/LEITURA BIT 3 ESCRITA/LEITURA BIT 2 ESCRITA/LEITURA BIT 1 ESCRITA/LEITURA BIT 0 ESCRITA/LEITURA

Modo timer (sinal interno): ao ajustar TOCS=0 no OPTION, o timer será incrementado a cada ciclo de máquina (4Mhz 1uS). E por lógica de programação, faremos o controle de transbordo do contador através da interrupção (T0IE) ou através T0IF que quando igual a 1 ocorreu overflow e se igual a 0 não ocorreu. Modo contador (sinal externo RA4) : o timer 0 incrementará sua contagem a cada pulso presente no pino TOCKI. Para ser incrementado na borda de subida fazer TOSE=0 e na borda de descida TOSE=1. g) WATCH DOG (cão de guarda): timer especial que funciona com um clock RC interno

e independente do clock do µC). O tempo normal de transbordo do WDT é de 18 mS, mas pode variar com a temperatura e a tensão de alimentação. Ele resetara o µC) sempre que ocorrer o overflow, isto impede que haja travamento no uso do µC) em circuitos críticos, pois o programador devera implementar uma subrotina para dar clear no WDT, antes do transbordo de seu contador (instrução clrwdt) cujo o valor básico é FFh (pode assumir outros valores com o uso do prescaler). O WDT é selecionado durante a gravação do PIC para estar ativo ou não.

h) PRESCALER: um registro de 8 bits que pode dividir o sinal de clock , tando do timer 0

como do WDT por 256 , conforme tabela anexa ao registro OPTION. Nota: quando queremos uma contagem de 1:1 no timer 0 devemos atribuir o prescaler ao WDT que tem esta relação. J) INDF e FSR: registro para endereçamento indireto; onde o INDF e o registro onde eu darei os comandos, e no fsr o endereço que estes comandos irão atuar. Exemplo: clrf indf - se no FSR eu estiver com o valor 18h, o clear dado no registro indf ira zerar a posição 18h da RAM de uso geral. k) EEPROM: já sabemos que o PIC 16F84 possui esta memória de 64 bytes, que pode ser usada como memória de dados. Sua vantagem é que não perde as informações , mesmo sem

alimentação. Pode ser usado para gravar diversas informações em circuitos de controle remoto, telefones, alarmes e etc. Possui 4 registros importantes para seu funcionamento, são eles: EEADR, EEDATA, EECON1 e EECON2. EEADR registro do endereço para escrita ou leitura. EEDATA tem duas funções, escrevemos o dado a ser gravado, no endereço escolhido, ou teremos o dado lido da eeprom. EECON1 registro que controla as operações de escrita e leitura. BIT 4 EEIF Identificação da int.de fim de escita 0=não ocorreu 1=ocorreu BIT 3 WRERR Identificação de erro durante a escrita 0=não ocorreu 1=ocorreu BIT 2 WREN Habilitação de escrita na eeprom 0=não disponível 1=dispon. BIT 1 WR Inicio de escrita 0=escrita terminou/zerada pelo hardware 1=inicia BIT 0 RD Inicio da leitura 0=leitura teminou/zerada pelo hardware 1=inicia

EECON2 é um registro que não sofre ajustes, é usado durante o processo de escrita da eeprom, será visto nos modelos de programas adiante. K) POWER-DOWN (modo sleep): o µC) entra em estado inerte de 7mA de consumo cai para 60uA. Para entrar neste modo basta usar a instrução sllep. Para sair deste estado basta um reset externo pelo MCLR\ , time out no WDT , interrupção externa RB0, ou por fim de escrita na eeprom, ou por mudança de estado no PORTB (RB7 a RB4). Nota 1 : o PIC 16F84 possui no endereço 2007 da memória de programa, 14 bits que os gravadores preenchem, com informações determinadas pelo usuário. BIT 13 CP código de proteção a BIT 4 CP código de proteção BIT 3 PWRTE\ 1=Habilitado 0=desabilitado BIT 2 WDTE 1=WDT Habilitado 0=desabilitado BIT 1 FOSC1 Seleciona tipo de oscilador BIT 0 FOSC2 Seleciona tipo de oscilador

Tabela de escolha do tipo de oscilador: FOSC1 FOSC2 TIPO 0 0 LP 0 1 XT 1 0 HS 1 1 RC

Nota 2: nos endereços 2000h a 2003h, armazena-se 4 nibles (4 bits) sendo um em cada posição de memória, que servem como identificação, check-sum, ou outro código desejado

pelo usuário. Estas informações só podem ser lidas durante a gravação ou verificação do µC). Estes valores são escritos pelo gravador. Ex.: ID (identificação) 2E7Fh = 0010 1110 0111 1111 , teremos : 2000h xxxxxxxxxx0010 2001h xxxxxxxxxx1110 2002h xxxxxxxxxx0111 2003h xxxxxxxxxx1111 Agora que já conhecemos nosso microcontrolador, vamos começar nosso aprendizado através de programas, que vão nos levar ao conhecimento das principais características de um µC), tais como : temporização , contador, sensoreamento, controle de display e cargas diversas. Mas as possibilidades de uso de um µC) são quase ilimitadas e fascinantes, e com a prática e perseverança , seremos capazes de desenvolver sistemas de alto grau de complexidade. Vamos escrever programas e comentá-los , juntamente com o circuito que será controlado pelo µC), assim poderemos fixar as principais instruções e seu uso lógico. Em vários livros e data sheets , temos algumas convenções que nos facilitam o entendimento das instruções em linguagem de máquina de um µC). No PIC temos convenções que o compilador MPASM e MPASMWIN reconhecem. 1) O que for escrito após; “ é considerado comentário. 2) Constante decimal D’valor’ ou d’valor’ , ex.: d’20’ 3) Constante binária B’xxxx’ ex.: 0110 = B’0110’ 4) Constante hexadecimal 0x’valor’ou valorH, ex.: 0x’12’ ou 12H, se a constante hexa for

uma das letras A até F , terá que ser precedia de um 0 ; ex.: A = 0AH 5) A letra f será um registro entre 0 e 127 (0 a 7FH). 6) W ou w registro Work (Acumulador no 8031). 7) A letra b será um bit entre 0 e 7 usado em uma operação. 8) A letra k representa uma constante ou um rótulo (label). 9) A letra d o destino da instrução. Se d = 0 o resultado é armazenado em W, se d = 1 o

resultado é armazenado no próprio registro indicado (f). 10) Algumas dicas para entender como é formada as instruções: File = f , literal = l na instrução e k no argumento, destino = d, work = w, bit = b, teste = t, skip = s (pulo), set =s, clear = c, zero = z . Também temos as ações especificas como: Add =soma, and= lógica e, clr= limpar, com =complemento, dec= decrementar , inc = incrementar, ior= lógica ou , mov= mover, rl = rotacionar 1 bit a esquerda (left), rr = rotacionar um bit a direita (right), sub = subtração , swap = inversão entre os nibles de um byte, xor = lógica ou exclusivo. Agora podemos construir os nomes das instruções, vamos a uns exemplos: DECF = decrementar (dec) um registrador (f). DECFSZ = decrementar (dec) o registrador (F) e pula (Skip) se o resultado for zero (z). Após algum treino ficaremos campeões (retirado de Desbravando o PIC-editora Érica).

TABELA DE INSTRUÇÕES

INSTRUÇÃO OPERANDO DESCRIÇÃO CICLOS ADDWF f,d Soma W e f 1 ANDWF f,d And entre W e f 1 CLRF f Zera f 1 CLRW Zera w 1 COMF f,d Complementa f 1 DECF f,d Decrementa f 1 DECFSZ f,d Decrem.f pula se f=0 1(2) INCF f,d Incrementa f 1 INCFSZ f,d Increm.f pula se f = 0 1(2) IORWF f,d OR entre W e f 1 MOVF f,d Move f 1 MOVWF f Move W para f 1 NOP Nenhuma operação 1 RLF f,d Roda esq.pelo carry 1 RRF f,d Roda dir. pelo carry 1 SUBWF f,d Subtrai W de f 1 SWAPF f,d Troca nibles em f 1 XORWF f,d XOR entre W e f 1 BCF f,b Zera bit b em f 1 BSF f,b Seta bit b em f 1 BTFSC f,b Se bit b=0 em f,pula 1(2) BTFSS f,b Se bit b=1 em f,pula 1(2) ADDLW k Soma W e k 1 ANDLW k And entre W e k 1 CALL k Chama sub-rotina 2 CLRWDT Zera timer Watch dog 1 GOTO k Desvia p/label k 1 IORLW k OR entre W e k 1 MOVLW k W=k 1 RETFIE Retorna de interrup. 2 RETLW k Retorna c/ w = k 2 RETURN Retorna de sub-rotina 2 SLEEP Entra em modo sleep 1 SUBLW k Subtrai k de W 1 XORLW k Xor entre W e k 1

PROGRAMAS EXEMPLOS Vamos ao nosso primeiro programa; ao lado de cada comando teremos o

comentário do que ele executa no funcionamento do projeto proposto.

Nota: O esquema elétrico que segue é o básico usado em todas as montagens. O mesmo será omitido nos esquemas dos exemplos, sendo mostrado apenas o que deve ser incrementado em cada novo exemplo.

O cristal usado têm freqüência de 4 MHz, os capacitores C1 e C2 20 pF, C3 é um capacitor eletrolítico de 10µF e R1 10kΩ, o jumper JP1 (normalmente aberto) é fechado e aberto novamente, quando quiser fazer um reset manual.

a) Sensoriamento e acionamento de LED. Neste projeto iremos testar uma chave normalmente aberta (nosso sensor) , e se a mesma estiver aberta ligara o LED(D2) e fechada ligara o LED(D1). Vejamos o circuito abaixo:

O mesmo é bem simples, mas aprenderemos conceitos importantes de programação do PIC através das instruções que usaremos. Iremos sugerir um modelo padrão de formulário para programação mais adiante , o que facilita e organiza o trabalho do projetista, pois poderá montar uma pasta com o diagrama lógico e o programa de seus projetos. Importante salientar que o programa deve ser digitado no bloco de notas (note pad) ou no editor do próprio MPLAB. Vamos ao programa: (foi digitado no bloco de notas) list p=16F84 ;para qual o processador o código será gerado radix dec ;padrão decimal para vlrs.s/identificação include <P16F84A.INC> ;anexa arquivo def.16F84A> l1 equ 2 ;nome do pino 2 da portB l2 equ 1 ;nome do pino 1 da portB s1 equ 1 ;nome do pino 1 da portA

org 0 ;define início do progrma no end.0 goto início ;desvia para o label(rótulo) início org 4 ;inicio das interrupções (reservada)

retfie ;retorno da interrupção início: ;aqui neste label começa o programa movlw B'00000000' ;w=0h movwf INTCON ;registro intcon=0h,ou seja todas int.desab. bsf STATUS,RP0 ;seta bit RP0 no reg.status, sel.banco 1 movwf TRISB ;trisb=0h,todos pinos conf.saidas portB movlw B'11111111' ;w=ffh movwf TRISA ;TRISA=B'11111'os pinos portA serão entradas movlw B'11011000' ;w=D8h movwf OPTION_REG ;usa-se este nome p/o registrador,estudar ;com as tabelas como configuramos o option bcf STATUS,RP0 ;clear bit RP0 volto para o banco 0 movlw B'00000000' ;w=0h movwf PORTB ;garanto zero nos pinos do portB no

;inicio/portB=w principal: ;aqui vou começar as rotinas de controle btfss PORTA,s1 ;se pino 1 portA=1 salta próxima linha goto test1 bsf PORTB,l2 ;liga pino 2 portB goto desl1 ;vai p/label desl1 (desliga1) test1: bsf PORTB,l1 ;liga pino 1 portB goto desl2 ;vai p/label desl2 (desliga2) desl1: bcf PORTB,l1 ;desliga pino 1 portB goto principal desl2: bcf PORTB,l2 ;desliga pino 2 portB goto principal end ;fim de programa Após a digitação do programa em assembler, iremos compilar o mesmo no MPLAB (solução completa da MICROCHIP), conforme explicações nos anexos. Se não tivermos nenhum erro de programação, iremos verificar o funcionamento do mesmo gravando o arquivo gerado em hexadecimal (código de máquina) no PIC16F84A, com um dos gravadores sugeridos. Se não funcionar conforme o esperado, analisar o circuito lógico e o programa, pois só a solução de sistemas simples nos dará experiência e a base necessária para projetos mais complexos (todos circuitos e programas desta apostila foram testados).

b) Seqüencial de 4 LEDS. Neste programa iremos aprender a fazer bases de tempo (temporização), usando ciclos de máquina para obtermos o tempo desejado entre o ligar e desligar de cada LED da seqüência. Usaremos o PORTB como saída, sendo definido em nosso programa o P0B até o P3B os pinos que usaremos para acionamento de LED1 (D1) até LED4 (D4) respectivamente. Vamos ao circuito :

O programa : list p=16F84 ;para qual o processador o código será gerado radix dec ;padrão decimal para vlrs. s/ identificação include <P16F84A.INC> ;anexa arquivo def.16F84A> l1 equ 0 ;nome do pino 0 da portB l2 equ 1 ;nome do pino 1 da portB l3 equ 2 ;nome do pino 2 da portB l4 equ 3 ;nome do pino 3 da portB x equ 0CH ;define var.aux.x no end 0Ch da RAM y equ 0DH ;define var.aux.y no end 0Dh da RAM j equ 0EH ;define var.aux.j no end 0Eh da RAM org 0 ;define início do progrma no end.0 goto início ;desvia para o label(rótulo) início org 4 ;inicio das interrupções (reservada) retfie ;retorno da interrupção

início: ;aqui neste label começa o programa movlw B'00000000' ;w=0h movwf INTCON ;registro intcon=0h,ou seja todas int.desab. bsf STATUS,RP0 ;seta bit RP0 no reg.status,sel.banco 1 movwf TRISB ;trisb=0h,todos pinos conf.saidas portB movlw B'11111111' ;w=ffh movwf TRISA ;TRISA=B'11111'os 5 pinos serão entradas ; portA movlw B'11011000' ;w=D8h movwf OPTION_REG ;usa-se este nome p/o registrador,estudar ;com as tabelas como configuramos o option bcf STATUS,RP0 ;clear bit RP0 volto para o banco 0 movlw B'10001000' ;w=88h

movwf PORTB ;garanto zero nos pinos do portB no ; inicio/portB=w principal: ;aqui vou começar as rotinas de controle rrf PORTB ;rotaciona a direita o registo portB call time goto principal time: ;inicio da rotina de tempo (aprox.500mS) movlw 2 ;w=2 decimal (1uS) movwf j ;j=w (1uS) time1: movlw 250 ;w=250 decimal (1uS) movwf x ;x=w (1uS) time2: movlw 248 ;w=248 decimal (1uS) movwf y ;y=w (1uS) time3: nop ; (1uS) decfsz y ; decrem.y se y=0 salta prox.inst.(2uS se salta) ; (1us se não salta) goto time3 ; (2uS) decfsz x ; (1uS ou 2uS) goto time2 ; (2uS) decfsz j ; (1uS ou 2uS) goto time1 ; (2uS) return ; (2uS) end ;fim de programa ; COMO FUNCIONA A ROTINA DE TEMPO ; Tempo usado por cada instrução da rotina:

; call=2uS nop=1uS ; movlw=1uS decfsz=1uS ; movwf=1uS goto=2uS ; total: 2+1+1+1+1+1+1+1+2x250x[(248x4uS)+2+2+1+1]+2+2+1+1+1+1=0,499021uS==0,5 S ; note que os loops me garantem chegar ao tempo desejado, estude para entender ; o funcionamento deste método. Note que não usamos o timer do PIC. c) Contador de sinal externo (RA4/TOCKI). Neste exemplo iremos utilizar nosso µC) para contar um determinado número de pulsos externos , em nosso caso serão 10, quando isto acontecer nosso timer 0 ira gerar uma interrupção no µC, a mesma será resolvida pelo software , que ligara um led (representando uma carga qualquer) por 250mS, e após desligara, voltando para rotina principal do µC como contador. Também aproveitaremos para ativar um display de 7 segmentos (de led) para fixarmos mais este conceito. O circuito :

O programa deste circuito nos introduz a vários comandos importantes do µC em estudo, que também são usados em quase todos µC da MICROCHIP.

;------------------------------------------------------------------------------ ; FORMULÁRIO PADRÃO PARA USO EM PROGRAMAÇÃO COM ; MICROCONTROLADORES ; DA LINHA PIC ( MICROCHIP ). COM USO DO COMPILADOR MPASWIN. ;------------------------------------------------------------------------------ ; ** Os registros da CPU serão escritas com letras maiúsculas, e a- ; pós " ; " os comentários não serão considerados pelo compilador. ;------------------------------------------------------------------------------ ; PROJETO : CONTADOR DE SINAL EXTERNO DATA : 08/10/2002 ;------------------------------------------------------------------------------ ; AUTOR :Maurício Madeira Oliveira ;------------------------------------------------------------------------------ list p=16F84 ;para qual processador o código será gerado radix dec ;padrão decimal para valores sem identificação include <p16f84a.inc> ;anexa arquivo def.16F84A ;------------------------------------------------------------------------------ ; TABELA DE DEFINIÇÕES DE RAM E CONSTANTES (defino nomes associados a ; valores) ;------------------------------------------------------------------------------ x equ 0CH ; define variável auxiliar x na ram 0Ch (hexadecimal) y equ 0DH ; define variável auxiliar y na ram 0Dh (hexadecimal) STEMP equ 0EH ; define variável p/colocar vlrs.temporarios do status l1 equ 7 ; define led1 ligado ao pino 7 do portB ; variáveis acima são exemplos do uso da diretriz EQU ;------------------------------------------------------------------------------ ; TABELA DE MONTAGEM DO DISPLAY ;------------------------------------------------------------------------------ ; ; a=RB0 define segmento do display ligado ao pino 0 do portB ; b=RB1 " " " " " " " 1 do portB ; c=RB2 " " " " " " " 2 do portB ; d=RB3 " " " " " " " 3 do portB ; e=RB4 " " " " " " " 4 do portB ; f=RB5 " " " " " " " 5 do portB ; g=RB6 " " " " " " " 6 do portB ; ; fica em binario: B'0gfedcba', para escrever n.7 ==> B'00000111' ou B'00000cba' ; , para escrever n.6 ==> B'01111101' ou B'0gfedc0a' , etc. ; ; a

; ******* ; f * * b ; * g * ; ******* DISPLAY ; e * * c ; * * ; ******* ; d ;------------------------------------------------------------------------------ ;------------------------------------------------------------------------------ ; MEMÓRIA DE PROGRAMA ;------------------------------------------------------------------------------ org 0 ; define inicio do programa a partir do end. 0h goto inicio ; desvia o progrma para o label (rótulo) início ;------------------------------------------------------------------------------ ; INÍCIO DA ROTINA DE INTERRUPÇÃO ;------------------------------------------------------------------------------ org 4 ; sempre inicia no end.4h as interrup.no PIC swapf STATUS,W movwf STEMP ; stemp=w=status (c/nibles invertidos) bsf PORTB,l1 ; ligo led1 pino 7 do portB movlw 0x0F6 ; w=F6h movwf TMR0 ; tmr0=w=F6h call tempo bcf PORTB,l1 ; desligo led1 swapf STEMP,W movwf STATUS ; move vlrs.stemp p/status (inv.nibles/fica correto) bcf INTCON,T0IF ; zera o indicador de overflow p/iniciar novam. retfie ; comando de retorno de interrupção ;------------------------------------------------------------------------------ ; INÍCIO DO PROGRAMA ;------------------------------------------------------------------------------ inicio: ; inicialização do uC movlw B'10000000' ; w=10000000b movwf INTCON ; INTCON=w , GIE esta habilitada bsf STATUS,RP0 ; seleciono banco1 movlw B'11111000' ; w=11111000b movwf OPTION_REG ; OPTION=w , T0CS=1 contagem por RA4 , externa movlw B'11111111' ; w=FFh movwf TRISA ; trisa=w , portA entrada movlw B'00000000' ; w=0 movwf TRISB ; trisb=w , portB saídas

bcf STATUS,RP0 ; seleciono banco0 movwf PORTA ; portA=w=0 movwf PORTB ; portB=w=0 principal: movlw 0x0F5 ; w=0F5h movwf TMR0 ; timer0=w bcf INTCON,T0IF ; reset no bit indicador de overflow bsf INTCON,T0IE ; seto o bit de interrupção do timer0 loop: movf TMR0,0 ; w=tmr0 call certo ; sub-rotina de conversão p/7 segmentos movwf PORTB ; portB=w nop goto loop certo: andlw B'00001111' ; and w p/limitar em 4 bits vlr.contador sublw 0x0E ; subtrai de 14 o vlr.w(vlr.do tmr0 acertado) addwf PCL ; soma valor de w com pcl, saltando p/ instrução ; necessária p/escrita do número correto ;'0gfedcba' sequência dos segmentos retlw B'01100111' ; retorna 9 retlw B'01111111' ; retorna 8 retlw B'00000111' ; retorna 7 retlw B'01111100' ; retorna 6 retlw B'01101101' ; retorna 5 retlw B'01100110' ; retorna 4 retlw B'01001111' ; retorna 3 retlw B'01011011' ; retorna 2 retlw B'00000110' ; retorna 1 retlw B'00111111' ; retorna 0 tempo: ; rotina de 250mS movlw 250 ; w=250d movwf x temp1: movlw 248 ; w=248d movwf y temp2: nop decfsz y goto temp2 decfsz x goto temp1 return end

d) Escrevendo em um display de cristal liquido (LCD). Vamos aprender a usar um LCD para escrever a frase CURSO DE MICROCONTROLADOR. Vários conceitos importantes sobre o uso deste serão abordados. Vamos conhecer um pouco sobre o LCD : 1) Pinagem padrão.

Comandos para inicialização do display (seguir a tabela abaixo): MÓDULO TIPO INST. TEMPO INST. TEMPO INST. TEMPO INST. TEMPO INST. TEMPO 1 LINHA 7X5 18X5 30 15mS 30 15mS 6 40uS 0E 40uS 1 40uS 2 LINHAS 7X5 18X5 38 15mS 38 15mS 6 40uS 0E 40uS 1 40uS

Existem outros módulos com mais linhas e mais colunas. Procurar outras bibliografias e referências técnicas . Em nosso projeto exemplo iremos usar os 8 bits de dados, mas é possível usarmos apenas 4 bits para enviarmos as informações para o LCD, usamos o nible

mais significativo D7 a D4 (pinos 14 a 11) para a comunicação, por ex.: enviar a instrução 14 , primeiro envio 1(0001) e após o 4 (0100) note que também envio primeiro o nible mais significativo, se estivesse usando os 8 bits enviaria direto 14 (00010100). 3) Agora iremos descrever quais os pinos do uC iremos usar para gerar os sinais de controle e transferência de dados para o LCD. Usaremos a porta A para gerar os sinais de controle e a porta B para enviarmos dados e instruções. PINO Controla Comentários PA.0 RS 1=dado 0=inst. PA.1 CS 1=enable 0=disable PB.0 D0 bmS PB.1 D1 PB.2 D2 PB.3 D3 PB.4 D4 PB.5 D5 PB.6 D6 PB.7 D7 BmS

4)Diagrama lógico do circuito com LCD.

5) Vamos ao programa que ira controlar o LCD e escrever a mensagem escolhida, vamos com isto aprender os conceitos necessários para o funcionamento correto do display.

;------------------------------------------------------------------------------ ; FORMULÁRIO PADRÃO PARA USO EM PROGRAMAÇÃO COM ; MICROCONTROLADORES ; DA LINHA PIC ( MICROCHIP ). COM USO DO COMPILADOR MPASWIN. ;------------------------------------------------------------------------------ ; ** Os registros da CPU serão escritas com letras maiúsculas, e a- ; pós " ; " os comentários não serão considerados pelo compilador. ;------------------------------------------------------------------------------ ; PROJETO : Display-LCD DATA : 29/10/2002 ;------------------------------------------------------------------------------ ; AUTOR :Mauricio Madeira Oliveira ;------------------------------------------------------------------------------ list p=16F84 ;para qual processador o código será gerado radix dec ;padrão decimal para valores sem identificação include <p16f84a.inc> ;anexa arquivo def.16F84A ;------------------------------------------------------------------------------ ; TABELA DE DEFINIÇÕES DE RAM E CONSTANTES (defino nomes associados a valores) ;------------------------------------------------------------------------------ x equ 0Ch ; define variável auxiliar x na ram 0Ch (hexadecimal) y equ 0Dh ; define variável auxiliar y na ram 0Dh (hexadecimal) con0 equ 0h ; controle do sinal RS (LCD) através do PA.0 con1 equ 1h ; controle do sinal CS (LCD) através do PA.1 ;Definição de caracteres que serão usados: M equ 0x4D I equ 0x49 ; C equ 0x43 R equ 0x52 O equ 0x4F N equ 0x4E T equ 0x54 L equ 0x4C A equ 0x41 D equ 0x44 U equ 0x55 S equ 0x53 E equ 0x45 # equ 0x23 ;------------------------------------------------------------------------------ ; MEMÓRIA DE PROGRAMA ;------------------------------------------------------------------------------

org 0 ; define inicio do programa a partir do end. 0h goto início ; desvia o progrma para o label (rótulo) início ;------------------------------------------------------------------------------ ; INÍCIO DA ROTINA DE INTERRUPÇÃO ;------------------------------------------------------------------------------ org 4 ; sempre inicia no end.4h as interrup.no PIC

; rotinas ............................... retfie ; comando de retorno de interrupção ;------------------------------------------------------------------------------ ; INÍCIO DO PROGRAMA ;------------------------------------------------------------------------------ início: movlw B'00000000' ; w=0 movwf INTCON ; inticon=w int.desabilitadas bsf STATUS,RP0 ; sel.banco1 movwf TRISB ; portB def.para saída movlw B'11111100' ; w=11111100 movwf TRISA ; PA.0 e PA.1 def.saidas , demais input movlw B'11011000' ; w=11011000b movwf OPTION_REG ; option=w (verif.naa tabela as atribuições) movlw B'00000000' ; w=o bcf STATUS,RP0 ; sel.banco0 movwf PORTA ; portA=w movwf PORTB ; portB=w principal: ;inicialização do display LCD bcf PORTA,con0 ; portA P0=0, RS=0 ,LCD recebe instrução movlw 0x38 ; w=38h movwf PORTB ; portB=instrução 38 p/ o LCD call tempo ; rotina de 20mS movlw 0x38 ; movwf PORTB ; Verificar tabela de configuração LCD call tempo ; movlw 0x06 ; w=o6h movwf PORTB ; portB=inst. 06 p/ o LCD call tempo movlw 0x0E ; w=0Eh movwf PORTB ; portB=inst. 0E p/ o LCD call tempo movlw 0x01 ; w=01h movwf PORTB ; portB=inst. 01 p/ o LCD call tempo

movlw 0x80 ; w=80h movwf PORTB ; portB=inst. 80 p/ o LCD, iniciar na 1.linha ; e 1.coluna do LCD

call time ; rotina de 40uS (pode ter tempo menor p/esta ; inst.)

esc1: ; rotina de escrita na primeira linha do LCD bcf PORTA,con0 movlw 0x80 movw f PORTB call time bsf PORTA,con0 ; portA P0=1, RS=1 , LCD recebe dados movlw 0x43 ; letra C movwf PORTB call time movlw U movwf PORTB call time movlw R movwf PORTB call time movlw S movwf PORTB call time movlw O movwf PORTB call time movlw # movwf PORTB call time movlw D movwf PORTB call time movlw E movwf PORTB call time movlw # movwf PORTB call time bcf PORTA,con0 ; porta P0=0, RS=0 , LCD recebe inst. Movlw 0x0C0 ; w=C0h Movwf PORTB ; cursor vai p/2.linha, 1.coluna do LCD call time bsf PORTA,con0 movlw M movwf PORTB

call time movlw I movwf PORTB call time movlw 0x43 movwf PORTB call time movlw R movwf PORTB call time movlw O movwf PORTB call time movlw 0x43 movwf PORTB call time movlw O movwf PORTB call time movlw N movwf PORTB call time movlw T movwf PORTB call time movlw R movwf PORTB call time movlw O movwf PORTB call time movlw L movwf PORTB call time movlw A movwf PORTB call time movlw D movwf PORTB call time movlw O movwf PORTB call time movlw R movwf PORTB call time aqui: goto aqui

tempo: ; rotina de 20mS bsf PORTA,con1 ; gera sinal (alto) p/ CS do LCD bcf PORTA,con1 ; gera sinal (low ) p/ CS do LCD movlw 250 ; w=250d, 1uS movwf x ; x=w , 1uS temp1: movlw 18 ; 1uS movwf y ; 1uS temp2: nop ; 1uS decfsz y ; decrementa y de 1,se>0 exec.prox.inst. goto temp2 ; se=0 salta prox.inst. decfsz x ; 1uS goto temp1 ; 1uS return ; 1uS time: ; rontina de 4uS bsf PORTA,con1 ; gera sinal (alto) p/ CS do LCD bcf PORTA,con1 ; gera sinal (low ) p/ CS do LCD movlw 38 ; w=38d movwf x tim1: nop decfsz x goto tim1 return end e) Acionando um motor de passo (stepper motor). Vamos controlar através do microcontrolador um motor de passo com 5 terminações, sendo um dos fios terminais o comum (ligaremos a +Vcc) e os demais fios terminais correspondem aos 4 enrolamentos do motor, cada um será ligado ao coletor de um transistor NPN (BC548). Assim iremos controlar o sentido de rotação (horário ou anti-horário) e a velocidade do mesmo. Com esta aplicação poderemos explorar mais algumas das possibilidades de uso do microcontrolador, robótica, aplicações industriais, e etc. O diagrama lógico abaixo, mostra o circuito , e sua simplicidade, pois iremos controlar o sentido e velocidade de rotação através de um programa.

O programa para este circuito é de fácil entendimento, basta analisar as instruções

usadas e os comentários ao lado de cada uma, note que usamos apenas 4 portas de I/O, sobrando recursos para circuitos bem mais complexos. ;------------------------------------------------------------------------------ ; FORMULÁRIO PADRÃO PARA USO EM PROGRAMAÇÃO COM ; MICROCONTROLADORES ; DA LINHA PIC ( MICROCHIP ). COM USO DO COMPILADOR MPASWIN. ;------------------------------------------------------------------------------ ; ** Os registros da CPU serão escritas com letras maiúsculas, e a- ; pós " ; " os comentários não serão considerados pelo compilador. ;------------------------------------------------------------------------------ ; PROJETO : Controle de motor de passo DATA : 09/11/2002 ;------------------------------------------------------------------------------ ; AUTOR :Mauricio Madeira Oliveira ;------------------------------------------------------------------------------ list p=16F84 ;para qual processador o código será gerado radix dec ;padrão decimal para valores sem identificação include <p16f84a.inc> ;anexa arquivo def.16F84A ;------------------------------------------------------------------------------ ; TABELA DE DEFINIÇÕES DE RAM E CONSTANTES (defino nomes associados a valores) ;------------------------------------------------------------------------------ x equ 0Ch ; define variável auxiliar x na ram 0Ch (hexadecimal) y equ 0Dh ; define variável auxiliar y na ram 0Dh (hexadecimal)

n equ 0Eh ; define variável auxiliar n na ram 0Eh (hexadecimal) ; variáveis acima são exemplos do uso da diretriz EQU ;------------------------------------------------------------------------------ ;------------------------------------------------------------------------------ ; MEMÓRIA DE PROGRAMA ;------------------------------------------------------------------------------ org 0 ; define inicio do programa a partir do end. 0h goto início ; desvia o progrma para o label (rótulo) início ;------------------------------------------------------------------------------ ; INÍCIO DA ROTINA DE INTERRUPÇÃO ;------------------------------------------------------------------------------ org 4 ; sempre inicia no end.4h as interrup.no PIC ; rotinas ............................... retfie ; comando de retorno de interrupção ;------------------------------------------------------------------------------ ; INÍCIO DO PROGRAMA ;------------------------------------------------------------------------------ início : movlw B'00000000' ; w=0d movwf INTCON ; desabilito todas as interrupções movlw B'10001000' ; w=88h movwf OPTION_REG ; option=w , verificar tabela bsf STATUS,RP0 ; seleciono banco1 movlw B'00000000' ; w=0d movwf TRISB ; portB=saida movlw B'11111111' ; w=ffh movwf TRISA ; portA=entrada bcf STATUS,RP0 ; seleciono banco0 movlw B'00000000' ; w=0d movwf PORTB ; portB=0d movwf PORTA ; portA=0d HORARIO: Movlw 100 ; w=100d Movwf n ; n=100d HORA1: Movlw B'00001000' ; w=8h movwf PORTB call TIME ; chama rotina de tempo call CON1 ; chama rotina de controle1 movlw B'00000100' ; w=4d movwf PORTB

call TIME call CON1 movlw B'00000010' ; w=2d movwf PORTB call TIME call CON1 movlw B'00000001' ; w=1d movwf PORTB call TIME call CON1 goto HORA1 ANTIHORA: movlw 100 movwf n ANTI1: Movlw B'00000001' ; w=1h Movwf PORTB call TIME ; chama rotina de tempo call CON2 ; chama rotina de controle2 movlw B'00000010' ; w=2d movwf PORTB call TIME call CON2 movlw B'00000100' ; w=4d movwf PORTB call TIME call CON2 movlw B'00001000' ; w=8d movwf PORTB call TIME call CON2 goto ANTI1 TIME: movlw 100 ; w=100d movwf x ; x=w TIM1: movlw 248 ; w=248d movwf y ; y=w TIM2: nop decfsz y ;dec.y,pula prox.inst.se =0 goto TIM2 decfsz x goto TIM1 return CON1:

decfsz n return goto ANTIHORA CON2: decfsz n return goto HORARIO end Memória EEPROM . Agora vamos ao estudo dos registros de escrita e leitura da EEPROM do PIC em estudo. O 16F84 possui 64 Bytes que posso usar como memória de dados, e que diferente da RAM não perco as informações com a falta de alimentação . Esta memória facilita o projeto de circuitos, tais como : discadores telefônicos , códigos para sistemas de alarmes, ajustes em controle remoto, coletor de dados, etc. Iremos descrever o uso básico para leitura e escrita de dados. Temos 4 registros especiais para esta finalidade, são eles : EEADR – endereço desejado para leitura ou escrita na EEPROM. EEDATA – dado a escrever ou dado lido da EEPROM. EECON1 – registro de controle 1. EECON2 – registro de controle 2. 1) Escrevendo na EEPROM. - Coloco o endereço de escrita no EEADR ( 0 a 63 ou 0 a 3Fh). - O dado a ser escrito coloco em EEDATA. - Desabilito as interrupções (GIE = 0). - Habilito a escrita setando o bit WREN no registro EECON1. - Carrego o registro EECON2 com os valores 0x55 e 0xAA nesta seqüência(obrigatório). - A escrita deve ser iniciada setando o bit WR no registro EECON2. - Devo resetar o bit WREN no registro EECON1 (isto ira proteger o processo de escrita). - Agora aguardamos o bit WR ir para 0 , e após continuamos nossas rotinas ou usamos a

interrupção de escrita (bit EEIE no registro INTCON, associado ao bit EEIF do EECON1), para controle do final de escrita.

- Caso algum erro de escrita ocorra no processo o bit WRERR do registro EECON1 será setado.

Nota : o registro EECON1 e descrito em Registros de controle da CPU em páginas anteriores. Vamos a um trecho de programa de escrita , iremos escrever no endereço 01h da EEPROM o valor 1Ch (00011010). escrita: bcf STATUS,RP0 ; seleciono banco0 movlw 0x1 ; w=1h

movwf EEADR ; EEADR=w=1h movlw 0x1C ; w=1Ch movwf EEDATA ; EEDATA=w=1Ch bsf STATUS,RP0 ; seleciono banco1 para EECON1 bcf INTCON,GIE ; desabilito as int. bsf EECON1,WREN ; hab. escrita na EEPROM movlw 55H ; w=55h movwf EECON2 ; EECON2=55h movlw 0AAH ; w0=AAh movwf EECON2 ; EECON2=AAh bsf EECON1,WR ; inicia processo de escrita bcf EECON1,WREN ; desab. esc. EEPROM, não interfere na ; escrita(agora) controle: ; escolho uma rotina de controle de fim de ; escrita , vamos implementar uma bem simples ; (como exemplo) btfss EECON1,EEIF ; se bit EEIF=1 pula próxima instrução goto controle bcf EECON1,EEIF ; zero o bit EEIF (para novo controle de ; escrita) bsf INTCON,GIE ; habilito novamente as interrupções return Nota : este exemplo não tem o controle de erros , o ideal e fazer uma rotina usando a interrupção de fim de escrita e de erros. 2) Lendo na EEPROM. Podemos ler os dados a qualquer momento, bastando seguir os passos abaixo. - O endereço a ser lido deve ser colocado em EEADR. - A leitura deve ser habilitada setando o bit RD no registro EECON1. - O dado lido será colocado em EEDATA. Vamos a um trecho de programa onde iremos ler o dado contido no endereço 01h, o qual escrevemos no trecho anterior (escrita), e colocar a informação lida (1C, no caso) no endereço 10h na RAM de uso geral. leitura: bcf STATUS,RP0 ; seleciono banco0, onde esta EEADR movlw 0x1C ; w=1Ch movwf EEADR ; EEADR= w bsf STATUS,RPO ; sel.banco1 onde esta EECON1 bsf EECON1,RD ; hab. leitura bcf STATUS,RP0 ; volto ao banco0 onde esta EEDATA movf EEDATA,0 ; w= EEDATA que é o dado lido

movwf 0x10 ; disponibilizo o dado no end.10h da ; RAM de uso geral, para uso qualquer return Não esgotamos de forma alguma, neste curso inicial a gama de recursos e aplicações de um MICROCONTROLADOR , mas esperamos ter conseguido iniciar nossos alunos neste campo maravilhoso da eletrônica atual , onde software e hardware andam juntos, onde o limite praticamente é criatividade e perseverança do projetista.

BIBLIOGRAFIA Microcontroladores – PIC , Engenheiro Vidal Pereira da Silva Jr. , edição independ. 1997. Desbravando o PIC , David José de Souza , Editora Érica. 2000. Microchip – Data Sheet , Microchip Technology Inc. 2001. Circuito Digitais , Herbert Taub , Editora McGRAW-HILL 1984. Display LCM , Polígrafos diversos (colhidos na Internet). Motor de Passo , Polígrafos diversos (colhidos na Internet). Sites : www.microchip.com www.mosaico-eng.com.br www.vidal.com.br www.ic-prog.com ( site com vários modelos de programadores e software gratuito).

AUTOR Maurício Madeira Oliveira

Página pessoal (fonte): www.seguidorsolar.com.br Este curso pode ser usado e divulgado, sem fins comerciais, citar fonte e autor

Sistemas Numéricos

Conjunto de regras que nos permitem ler ou escrever qualquer número, usando poucos símbolos. Base de um sistema de numeração : um fator importante para qualquer sistema de numeração é o número de elementos necessários para formar um conjunto padrão que auxilie a contagem. Esse número é chamado base do sistema de numeração. Assim quando falamos base dez, estamos pensando na formação de conjuntos com dez elementos. Em circuitos digitais usamos o sistema de numeração binário, isto é, base dois. Em programação em linguagem de máquina , e outras, usamos além da base decimal e binária, a base octal, hexadecimal e outras se forem necessárias. Sistema numérico decimal (posicional) – quando escrevemos o número 127 (127 na base 10), podemos decompo-lo da seguinte forma:

127 = 100 + 20 + 7 = 1 x 10² + 2 x 10 ¹+ 7 x 100

Notamos que para cada posição do número 127 formado pelos algarismos 1, 2 e 7 temos um peso correspondente a sua posição da esquerda para direita de valores 0, 1, 2, ...,n ; conforme o exemplo acima, ou seja, genericamente o número abaixo : abcd (B=base) = a (B)³ + b (B)² + c (B)¹ + d (B) ° = abcd (base=10) onde B é o valor da base do número em uso , seja decimal, binário, hexadecimal , etc. , após o cálculo teremos convertido o mesmo para a base decimal. Vejamos alguns exemplos: 2560 (10) = 2 . 10³ + 5 . 10² + 6 . 10¹ + 0 . 10° = 2560 1101 (2 ) = 1 . 2³ + 1 . 2² + 0 . 2¹ + 1 . 2° = 8 + 4 + 0 + 1 = 13 1C (16) = 1 . 16¹ + C . 16° = 16 + 12 = 28 27 ( 8 ) = 2 . 8¹ + 7 . 8° = 23 A conversão é bem simples, como notamos nos exemplos. Mesmo sem apresentarmos os símbolos (algarismos ou letras) que representam as bases mais usadas em circuitos digitais, conseguimos resolver os exemplos.

TABELA

BASE REPRESENTAÇÃO BINÁRIA 0,1 DECIMAL 0,1,2,3,4,5,6,7,8,9

HEXA 0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F OCTAL 0,1,2,3,4,5,6,7

Vamos, através de exercícios exemplos fazer algumas conversões entre base 10 e outros. 16 (10) _____( 2 ) , converter 16 na base 10, para 16 base binária.

16 2 0 8 2 bms 0 4 2 0 2 2 0 1 BMS

A resposta será 10000 ( 2 ) . 16 (10) _____( 8 ) , converter 16 na base 10, para 16 na base octal.

16 8 0 2 bms BMS

A resposta será 20 ( 8 ) . 16 (10) ____(16) , converter 16 na base 10, para 16 na base hexadecimal.

16 16 0 1 bms BMS

A resposta será 10 (16). Uma regra simples para converter um número binário para hexadecimal e octal . Exemplo : 21 (10) 10101 (2) , para converter para octal agrupo de três em três digitos e converto através da soma das potências, ou seja:

10 101 2 ( 8 ) 5 ( 8 ) = 25 ( 8 )

21 (10) 10101 (2) , para converter para hexa agrupo de quatro em quatro digitos e converto através da soma das potências, ou seja:

OOO1 O101 1 (16) 5 (16) = 15 (16 )

Assim podemos verificar que 00010101 (B) = 21 (10) = 25 ( 8 ) = 15 (16) .

Operações Aritméticas Binárias Adição : 8 (10) + 7 (10) = 15 (10) 00001000 + 00000111 __________ 00001111 00001111 (2) = 15 (10) 11 (T) 6 (10) + 7 (10) = 13 (10) 00000110 (A) + 00000111 (B) __________ 00001101 00001101 (2) = 13 (10) (Soma) OBS.: na soma binária 1+1 = 0 e vai 1 , como no exemplo acima, veja tabela abaixo :

A B Soma Transporte 0 0 0 0 0 1 1 0 1 0 1 0 1 1 0 1

Subtração : 1 ( T ) 9 (10) – 4 (10) = 5 (10) 00001001 ( A ) - 00000100 ( B ) _________ 00000101 ( Subtração )

OBS.: na subtração 0 –1 =1 e o digito posterior é quem empresta um, veja tabela abaixo :

A B Subtração Transporte 0 0 0 0 0 1 1 1 1 0 1 0 1 1 0 0

Subtração por complemento de 2 (C2) : Primeiro vamos saber o que é complemento de 1 (C1) ; 1001 (2) C1 0110 (2) , ou seja, C1 é a inversão do valor dos BITS . Agora vamos entender o C2 : C2 = C1 + 1 ou seja , C2 de 1001 (2) será : 0110 ( C1 de 1001) + 0001 _______ 0111 ( C2 de 1001) Agora vamos calcular 9 (10 ) – 5 ( 10 ) = 4 ( 10 ) por C2 : 1) 5 (10) = 101 (2) C1 = 010 (2) C2 = 010 (2) + 1 (2) = 011 (2) ou ( - 5 (10) ) 2) 9 (10) = 1001 (2) , então :

11

1001 + 0011 ______ 1100 agora desprezo o BIT mais significativo e terei 0100 (2) = 4 (10) que é a resposta da subtração . Multiplicação : Como se faz com números decimais,

8 1000 x 3 x 0011 ____ _______

24 1000 +1000 ________ 11000 que é a resposta do produto. Divisão : Lembrando ,

Dividendo A B Divisor C Quociente

Vamos dividir 16 (10) por 4(10) : 1) Ache o C2 do divisor ( em nosso caso 4 ). 4 (10) 100 C1 011 C2 011 + 1 = 100 A nossa divisão é feita através de somas sucessivas ( subtração por C2) e controle da soma do quociente, vejamos a tabela abaixo: 2) Nosso dividendo 16 (10) = 10000 (2) , então : Dividendo 010000 Quociente 000000 C2 + 100 + 1 ________ _________ RP1 010100 000001 + 100 + 1 _________ __________ RP2 011000 000010 + 100 + 1 _________ ___________ RP3 011100 000011 + 100 + 1 _________ ___________ RP4 100000 000100 Note que o bit de controle RPx foi para um, este é o momento de parar, e a resposta será o valor do quociente no caso 100 (2) = 4 (10) .

Como usar o PIC 16F628 no lugar do PIC 16F84 Para ficar atualizado, este manual tem que mencionar como os iniciantes substituem o PIC 16F84 pelo PIC16F628. No site www.seguidorsolar.com.br já esta disponível uma prévia do curso de Microcontrolador PIC 16F628, com exemplos comentados. O curso todo vai ser postado brevemente (estou finalizando o mesmo). Mas lá vai o que deve ser feito: 1°) Mudar o endereço inicial da memória RAM (GPR o GPRS) do usuário, no 16F84 começa com 0x0C no 16F628 começa em 0x20. Vejamos; neste manual no exemplo c (seqüencial) usamos no início do programa: . . .

x equ 0CH ;define var.aux.x no end 0Ch da RAM y equ 0DH ;define var.aux.y no end 0Dh da RAM j equ 0EH ;define var.aux.j no end 0Eh da RAM Passaremos a usar: x equ 20H ;define var.aux.x no end 20h da RAM y equ 21H ;define var.aux.y no end 21h da RAM j equ 22H ;define var.aux.j no end 22h da RAM Isto é necessário, pois os bancos de memória são diferentes. Veja a figura abaixo:

2°) Coloque esta linha de comandos no programa exemplo que está implementado para 16F84 : __CONFIG _CP_OFF & _PWRTE_OFF & _BODEN_OFF & _MCLRE_ON & INTRC_OSC_NOCLKOUT & _LVP_OFF

Exemplo como estava para o 16F84: list p=16F84 ;para qual processador o código será gerado radix dec ;padrão decimal para valores sem identificação include <p16f84a.inc> ;anexa arquivo def.16F84A

Como vai ficar para ser usado o PIC16F628: list p=16F628 ;para qual processador o código será gerado radix dec ;padrão decimal para valores sem identificação include <p16F628A.inc> ;anexa arquivo def.16F628A

__CONFIG _CP_OFF & _PWRTE_OFF & _BODEN_OFF & _MCLRE_ON & _INTRC_OSC_NOCLKOUT & _LVP_OFF

Pode-se usar o PIC 16F628 em todos os exemplos deste manual, após as mudanças acima.

AUTOR Maurício Madeira Oliveira

Página pessoal (fonte): www.seguidorsolar.com.br Este curso pode ser usado e divulgado, sem fins comerciais, citar fonte e autor

USO DO MPLAB

1) Criação de um projeto.

Uma vez aberto o programa MPLAB IDE, na área de trabalho, seleciona-se no menu principal:

Project => New

Figura1

Quando a caixa de dialogo (dialog Box) => New Project surgir, introduz-se no campo =>

Project Name, digita-se o nome escolhido para o projeto, por exemplo, exemplo1. No campo => Project

Directory, digitar => c:\0pic\projetos2011 (ou outro diretório, ou procurar usando o browse); ver figura 2.

Figura 2

Agora deve-se associar um microcontrolador ao projeto. Na barra de menus, clicar em configure =>

select device (figura 3) e configura a caixa de dialogo (neste exemplo foi escolhido o PIC 16F628A),

conforme figura 4.

Figura 3

Figura 4

Ao novo projeto criado será associado o arquivo em assembler (extensão.asm), ou seja, o

programa que fará funcionar o microcontrolador e o circuito associado ao mesmo. Se o arquivo ainda não

tiver sido criado, basta clicar em files => new e criá-lo, após devemos salvar com um nome como

“exemplo1.asm” em um diretório conveniente (exemplo: c:\0pic\projetos2011 ou outro qualquer).

Para associar o arquivo ao projeto, basta adicionar na caixa de diálogo onde aparece

source files => clicar no botão direito do mouse => add e após escolher no diretório o arquivo em asembler a

ser usado, veja figura 5.

Figura 5

Na figura 5 é possível verificar que ao clicar no botão direito do mouse sobre a pasta que se quer

associar ou excluir algum arquivo, irá abrir outra caixa de diálogo e ações onde se usa o botão esquerdo para

executá-las.

Após digitar o código fonte (programa em assembler) e se não houver erros de digitação pressionar

na barra de status o botão build all => (ver figura 6) ou Project => Build All. Se tudo estiver ok, uma

caixa de status com barra de progresso em verde irá aparecer ou uma em vermelho se houver erros (não

analisa a lógica). Também irá criar vários arquivos com extensões diferentes na pasta exemplo1, tais como,

exemplo1.hex, exemplo1.lst, exemplo1.err e etc.

Figura 6