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 Os microcontroladores (uC) podem ser chamados de microcomputadores de um só chip , são usados , pelos mais diversos equipamentos eletrônicos , como: Videocassetes, celulares, dvd, alarmes, eletrônica embarcada, televisores, controle-remoto, agendas eletrônicas, etc. Possuem em uma única pastilha (ci), memória de dados, temporizadores, canal serial, vários canais de I/O, eeprom, pwm 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 fase 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. 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 alimentar o mesmo, através do pino MCLR\ ligado 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ão deslocadas 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, tornandose 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 tem 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 ler 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 BIT 6 BIT 5 IRP RP1 RP0 BIT 4 BIT 3 BIT 2 BIT 1 BIT 0 TO\ PD\ Z DC C Seleciona bancos - no 16F84 sempre em 0 No 16F84 manter em 0 Seleciona 0=banco 0 e 1=banco1 bancos Bit sinaliza time out/ 1=power-up,clrwdt,sleep, 0=time-out do watch dog Power Down/1=power-up,clrwdt, 0=inst.sleep Bit sinalizador 0,1 reg.estac/vlr.0 se =0 oreg.dif.de 0 Digit carry/borrow Carry/borrow b) OPTION : Configura prescaler, timer, e outras opções. Na programação usa-se optionreg , pois em PICs mais antigos existia uma instrução option. BIT 7 BIT 6 BIT 5 BIT 4 BIT 3 BIT 2 BIT 1 BIT 0 RPBU\ INTEDG TOCS TOSE PSA PS2 PS1 PS0 Habilita os pull-up portB 1=desab. 0=hab. Como aceitara int.externa (RB0) 1=borda de susbida Fonte do clock do timer 0 1=pino RA4/TOCKI Como o clock ext.inc.timer 0 1=borda descida Atribuição do prescaler 1=Watch dog PS2 PS1 VER TABELA ABAIXO PS0 0=borda de descida 0=clock interno (f/4) 0=borda susbida 0=timer 0 PS2 PS1 0 0 0 0 1 1 1 1 PS0 0 0 1 1 0 0 1 1 TIMER 0 0 1 para 2 1 1 para 4 0 1 para 8 1 1 para 16 0 1 para 32 1 1 para 64 0 1 para 128 1 1 para 256 WATCH DOG 1 para 1 1 para 2 1 para 4 1 para 8 1 para 16 1 para 32 1 para 64 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 BIT 6 BIT 5 BIT 4 BIT 3 BIT 2 BIT 1 BIT 0 GIE EEIE TOIE INTE RBIE TOIF INTF RBIF Habil.geral das int. 0=desab. 1=hab. Habil.da int.de final de escrita 0=int.não será tratada 1=int.será tratada Hab.de overflow timer 0=nào tratada 1=int.será tratada Hab.da int.externa RB0 0=int.não será tratada 1=int.será tratada Hab.da int.mudança RB4 a RB7 0=int.não será tratada 1=int.será tratada Identificação de over.timer 0 0=não ocorreu 1=ocorreu Identificação da int.externa RB0 0=não ocorreu 1=ocorreu 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 BIT 6 BIT 5 BIT 4 BIT 3 BIT 2 BIT 1 BIT 0 NC NC NC RA4 RA3 RA2 RA1 RA0 Pino 3 Pino 2 Pino 1 Pino 18 Pino 17 0=saída 0=saída 0=saída 0=saída 0=saída 1=entrada 1=entrada 1=entrada 1=entrada 1=entrada TRISB BIT 7 BIT 6 BIT 5 BIT 4 BIT 3 BIT 2 BIT 1 BIT 0 RB7 RB6 RB5 RB4 RB3 RB2 RB1 RB0 Pino 13 Pino 12 Pino 11 Pino 10 Pino 9 Pino 8 Pino 7 Pino 6 0=saida 0=saida 0=saida 0=saida 0=saida 0=saida 0=saida 0=saida 1=entrada 1=entrada 1=entrada 1=entrada 1=entrada 1=entrada 1=entrada 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 uC) . o PCLATH só é acessado pelo hardware do uC. PCL BIT 7 BIT 6 BIT 5 BIT 4 BIT 3 BIT 2 BIT 1 BIT 0 Escrita e leitura Escrita e leitura Escrita e leitura Escrita e leitura Escrita e leitura Escrita e leitura Escrita e leitura 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 BIT 3 BIT 2 BIT 1 BIT 0 I/O I/O I/O I/O TTL TTL TTL TTL Open drain In timer0 PORTB BIT 7 BIT 6 BIT 5 BIT 4 BIT 3 BIT 2 BIT 1 BIT 0 I/O I/O I/O I/O I/O I/O I/O I/O TTL Pode gerar int.ext.por mudança de estado TTL Pode gerar int.ext.por mudança de estado TTL Pode gerar int.ext.por mudança de estado TTL Pode gerar int.ext.por mudança de estado TTL TTL TTL 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. g) 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 BIT 6 BIT 5 BIT 4 BIT 3 BIT 2 BIT 1 BIT 0 ESCRITA/LEITURA ESCRITA/LEITURA ESCRITA/LEITURA ESCRITA/LEITURA ESCRITA/LEITURA ESCRITA/LEITURA ESCRITA/LEITURA 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. h) WATCH DOG (cão de guarda): timer especial que funciona com um clock RC interno e independente do clock do uC. 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 uC sempre que ocorrer o overflow, isto impede que haja travamento no uso do uC 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. i) 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 BIT 3 BIT 2 BIT 1 BIT 0 EEIF WRERR WREN WR RD Identificação da int.de fim de escita 0=não ocorreu Identificação de erro durante a escrita 0=não ocorreu Habilitação de escrita na eeprom 0=não disponível Inicio de escrita 0=escrita terminou/zerada pelo hardware Inicio da leitura 0=leitura teminou/zerada pelo hardware 1=ocorreu 1=ocorreu 1=dispon. 1=inicia 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 uC 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 a BIT 4 BIT 3 BIT 2 BIT 1 BIT 0 CP código de proteção CP PWRTE\ WDTE FOSC1 FOSC2 código de proteção 1=Habilitado 0=desabilitado 1=WDT Habilitado 0=desabilitado Seleciona tipo de oscilador Seleciona tipo de oscilador Tabela de escolha do tipo de oscilador : FOSC1 FOSC2 0 0 1 1 TIPO 0 LP 1 XT 0 HS 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 uC. 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 uC, tais como : temporização , contador, sensoreamento, controle de display e cargas diversas. Mas as possibilidades de uso de um uC 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 uC, 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 uC. No PIC temos convenções que o compilador MPASM e MPASMWIN reconhecem. 1) 2) 3) 4) O que for escrito após “; “ é considerado comentário. Constante decimal D’valor’ ou d’valor’ , ex.: d’20’ Constante binária B’xxxx’ ex.: 0110 = B’0110’ 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 (ou 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 ADDWF ANDWF CLRF CLRW COMF DECF DECFSZ INCF INCFSZ IORWF MOVF MOVWF NOP RLF RRF SUBWF SWAPF XORWF f,d f,d f f,d f,d f,d f,d f,d Soma W e f And entre W e f Zera f Zera w Complementa f Decrementa f Decrem.f pula se f=0 Incrementa f Increm.f pula se f = 0 OR entre W e f Move f Move W para f Nenhuma operação Roda esq.pelo carry Roda dir. pelo carry Subtrai W de f Troca nibles em f XOR entre W e f 1 1 1 1 1 1 1(2) 1 1(2) 1 1 1 1 1 1 1 1 1 BCF BSF BTFSC BTFSS f,b f,b f,b f,b Zera bit b em f Seta bit b em f Se bit b=0 em f,pula Se bit b=1 em f,pula 1 1 1(2) 1(2) ADDLW ANDLW CALL CLRWDT GOTO IORLW MOVLW RETFIE RETLW RETURN SLEEP SUBLW XORLW k k k Soma W e k And entre W e k Chama sub-rotina Zera timer Watch dog Desvia p/label k OR entre W e k W=k Retorna de interrup. Retorna c/ w = k Retorna de sub-rotina Entra em modo sleep Subtrai k de W Xor entre W e k f,d f,d f,d f,d f,d f,d f,d f k k k k k k CICLOS 1 1 2 1 1 1 1 2 2 2 1 1 1 PROGRAMAS EXEMPLOS Vamos ao nosso primeiro programa; ao lado de cada comando teremos o comentário do que o mesmo executa no funcionamento do projeto proposto. a) Sensoreamento 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 radix dec include<P16F84A.INC> ;para qual o processador o código será gerado ;padrão decimal para vlrs.s/identificação ;anexa arquivo def.16F84A> l1 l2 s1 ;nome do pino 2 da portB ;nome do pino 1 da portB ;nome do pino 1 da portA equ equ equ 2 1 1 org goto 0 início ;define início do progrma no end.0 ;desvia para o label(rótulo) início org 4 retfie ;inicio das interrupções (reservada) ;retorno da interrupção início: ;aqui neste label começa o programa movlw movwf bsf movwf movlw movwf B'00000000' INTCON STATUS,RP0 TRISB B'11111111' TRISA ;w=0h ;registro intcon=0h,ou seja todas int.desab. ;seta bit RP0 no reg.status, sel.banco 1 ;trisb=0h,todos pinos conf.saidas portB ;w=ffh ;TRISA=B'11111'os 5 pinos serão entradas movlw movwf B'11011000' OPTION_REG bcf movlw movwf STATUS,RP0 B'00000000' PORTB ;w=D8h ;usa-se este nome p/o registrador,estudar ;com as tabelas como configuramos o option ;clear bit RP0 volto para o banco 0 ;w=0h ;garanto zero nos pinos do portB no ;inicio/portB=w portA principal: ;aqui vou começar as rotinas de controle btfss goto bsf goto PORTA,s1 test1 PORTB,l2 desl1 ;se pino 1 portA=1 salta próxima linha bsf goto PORTB,l1 desl2 ;liga pino 1 portB ;vai p/label desl2 (desliga2) bcf goto PORTB,l1 principal ;desliga pino 1 portB bcf goto end PORTB,l2 principal ;desliga pino 2 portB ;liga pino 2 portB ;vai p/label desl1 (desliga1) test1: desl1: desl2: ;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 radix dec include <P16F84A.INC> ;para qual o processador o código será gerado ;padrão decimal para vlrs. s/ identificação ;anexa arquivo def.16F84A> l1 l2 l3 l4 x y j equ equ equ equ equ equ equ ;nome do pino 0 da portB ;nome do pino 1 da portB ;nome do pino 2 da portB ;nome do pino 3 da portB ;define var.aux.x no end 0Ch da RAM ;define var.aux.y no end 0Dh da RAM ;define var.aux.j no end 0Eh da RAM org goto 0 início 0 1 2 3 0CH 0DH 0EH ;define início do progrma no end.0 ;desvia para o label(rótulo) início org 4 retfie ;inicio das interrupções (reservada) ;retorno da interrupção início: ;aqui neste label começa o programa movlw movwf bsf movwf movlw movwf B'00000000' INTCON STATUS,RP0 TRISB B'11111111' TRISA movlw movwf B'11011000' OPTION_REG bcf movlw movwf STATUS,RP0 B'10001000' PORTB principal: rrf call goto time: movlw movwf time1: movlw movwf time2: movlw movwf time3: nop decfsz goto decfsz goto decfsz goto return end PORTB time principal ;w=0h ;registro intcon=0h,ou seja todas int.desab. ;seta bit RP0 no reg.status,sel.banco 1 ;trisb=0h,todos pinos conf.saidas portB ;w=ffh ;TRISA=B'11111'os 5 pinos serão entradas ; portA ;w=D8h ;usa-se este nome p/o registrador,estudar ;com as tabelas como configuramos o option ;clear bit RP0 volto para o banco 0 ;w=88h ;garanto zero nos pinos do portB no ; inicio/portB=w ;aqui vou começar as rotinas de controle ;rotaciona a direita o registo portB 2 j ;inicio da rotina de tempo (aprox.500mS) ;w=2 decimal (1uS) ;j=w (1uS) 250 x ;w=250 decimal (1uS) ;x=w (1uS) 248 y ;w=248 decimal (1uS) ;y=w (1uS) y time3 x time2 j time1 ; (1uS) ; decrem.y se y=0 salta prox.inst.(2uS se salta) ; (1us se não salta) ; (2uS) ; (1uS ou 2uS) ; (2uS) ; (1uS ou 2uS) ; (2uS) ; (2uS) ;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+2x{250x[(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 uC 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 uC, 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 uC 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 uC em estudo, que também são usados em quase todos uC 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: movlw movwf bsf movlw movwf movlw movwf movlw ; inicialização do uC B'10000000' ; w=10000000b INTCON ; INTCON=w , GIE esta habilitada STATUS,RP0 ; seleciono banco1 B'11111000' ; w=11111000b OPTION_REG ; OPTION=w , T0CS=1 contagem por RA4 , externa B'11111111' ; w=FFh TRISA ; trisa=w , portA entrada B'00000000' ; w=0 movwf bcf movwf movwf principal: movlw movwf bcf bsf loop: movf call movwf nop goto certo: andlw sublw addwf retlw retlw retlw retlw retlw retlw retlw retlw retlw retlw TRISB ; trisb=w , portB saídas STATUS,RP0 ; seleciono banco0 PORTA ; portA=w=0 PORTB ; portB=w=0 0x0F5 ; w=0F5h TMR0 ; timer0=w INTCON,T0IF ; reset no bit indicador de overflow INTCON,T0IE ; seto o bit de interrupção do timer0 TMR0,0 certo PORTB ; w=tmr0 ; sub-rotina de conversão p/7 segmentos ; portB=w loop B'00001111' ; and w p/limitar em 4 bits vlr.contador 0x0E ; subtrai de 14 o vlr.w(vlr.do tmr0 acertado) PCL ; soma valor de w com pcl, saltando p/ instrução ; necessária p/escrita do número correto ;'0gfedcba' sequência dos segmentos B'01100111' B'01111111' B'00000111' B'01111100' B'01101101' B'01100110' B'01001111' B'01011011' B'00000110' B'00111111' tempo: ; retorna 9 ; retorna 8 ; retorna 7 ; retorna 6 ; retorna 5 ; retorna 4 ; retorna 3 ; retorna 2 ; retorna 1 ; retorna 0 ; rotina de 250mS movlw movwf 250 x ; w=250d movlw movwf y 248 ; w=248d temp1: temp2: nop decfsz goto decfsz goto y temp2 x 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 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 1 LINHA INST. TEMPO INST. TEMPO INST. TEMPO 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 PA.1 PB.0 PB.1 PB.2 PB.3 PB.4 PB.5 PB.6 PB.7 RS CS D0 D1 D2 D3 D4 D5 D6 D7 1=dado 1=enable bmS 0=inst. 0=disable 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 I ;C R O N T L A D U S E # equ equ equ equ equ equ equ equ equ equ equ equ equ equ 0x4D 0x49 0x43 0x52 0x4F 0x4E 0x54 0x4C 0x41 0x44 0x55 0x53 0x45 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 movwf bsf movwf movlw movwf movlw movwf movlw bcf movwf movwf B'00000000' INTCON STATUS,RP0 TRISB B'11111100' TRISA B'11011000' OPTION_REG B'00000000' STATUS,RP0 PORTA PORTB principal: bcf movlw movwf call movlw movwf call movlw movwf call movlw movwf call ; w=0 ; inticon=w int.desabilitadas ; sel.banco1 ; portB def.para saída ; w=11111100 ; PA.0 e PA.1 def.saidas , demais input ; w=11011000b ; option=w (verif.naa tabela as atribuições) ; w=o ; sel.banco0 ; portA=w ; portB=w ;inicialização do display LCD PORTA,con0 0x38 PORTB tempo 0x38 PORTB tempo 0x06 PORTB tempo 0x0E PORTB tempo ; portA P0=0, RS=0 ,LCD recebe instrução ; w=38h ; portB=instrução 38 p/ o LCD ; rotina de 20mS ; ; Verificar tabela de configuração LCD ; ; w=o6h ; portB=inst. 06 p/ o LCD ; w=0Eh ; portB=inst. 0E p/ o LCD movlw movwf call movlw movwf 0x01 PORTB tempo 0x80 PORTB call time esc1: ; w=01h ; portB=inst. 01 p/ o LCD ; w=80h ; portB=inst. 80 p/ o LCD, iniciar na 1.linha ; e 1.coluna do LCD ; rotina de 40uS (pode ter tempo menor p/esta ; inst.) ; rotina de escrita na primeira linha do LCD bcf movlw movw f call bsf movlw movwf call movlw movwf call movlw movwf call movlw movwf call movlw movwf call movlw movwf call movlw movwf call movlw movwf call movlw movwf call bcf Movlw Movwf call PORTA,con0 0x80 PORTB time PORTA,con0 0x43 PORTB time U PORTB time R PORTB time S PORTB time O PORTB time # PORTB time D PORTB time E PORTB time # PORTB time PORTA,con0 0x0C0 PORTB time ; portA P0=1, RS=1 , LCD recebe dados ; letra C ; porta P0=0, RS=0 , LCD recebe inst. ; w=C0h ; cursor vai p/2.linha, 1.coluna do LCD bsf movlw movwf call movlw movwf call movlw movwf call movlw movwf call movlw movwf call movlw movwf call movlw movwf call movlw movwf call movlw movwf call movlw movwf call movlw movwf call movlw movwf call movlw movwf call movlw movwf call movlw movwf call movlw PORTA,con0 M PORTB time I PORTB time 0x43 PORTB time R PORTB time O PORTB time 0x43 PORTB time O PORTB time N PORTB time T PORTB time R PORTB time O PORTB time L PORTB time A PORTB time D PORTB time O PORTB time R movwf call aqui: goto PORTB time aqui tempo: ; rotina de 20mS bsf bcf movlw movwf PORTA,con1 PORTA,con1 250 x ; gera sinal (alto) p/ CS do LCD ; gera sinal (low ) p/ CS do LCD ; w=250d, 1uS ; x=w , 1uS movlw movwf 18 y ; 1uS ; 1uS nop decfsz goto decfsz goto return y temp2 x temp1 ; 1uS ; decrementa y de 1,se>0 exec.prox.inst. ; se=0 salta prox.inst. ; 1uS ; 1uS ; 1uS temp1: temp2: time: ; rontina de 4uS bsf bcf movlw movwf PORTA,con1 PORTA,con1 38 x tim1: nop decfsz goto return end x tim1 ; gera sinal (alto) p/ CS do LCD ; gera sinal (low ) p/ CS do LCD ; w=38d 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 antihorá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 include dec <p16f84a.inc> ;padrão decimal para valores sem identificação ;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 movwf movlw movwf bsf movlw movwf movlw movwf bcf movlw movwf movwf HORARIO: Movlw B'00000000' INTCON B'10001000' OPTION_REG STATUS,RP0 B'00000000' TRISB B'11111111' TRISA STATUS,RP0 B'00000000' PORTB PORTA ; w=0d ; desabilito todas as interrupções ; w=88h ; option=w , verificar tabela ; seleciono banco1 ; w=0d ; portB=saida ; w=ffh ; portA=entrada ; seleciono banco0 ; w=0d ; portB=0d ; portA=0d 100 ; w=100d Movwf HORA1: Movlw movwf call call movlw movwf call call movlw movwf call call movlw movwf call call goto ANTIHORA: movlw movwf ANTI1: Movlw Movwf call call movlw movwf call call movlw movwf call call movlw movwf call call goto TIME: movlw movwf TIM1: movlw movwf n ; n=100d B'00001000' PORTB TIME CON1 B'00000100' PORTB TIME CON1 B'00000010' PORTB TIME CON1 B'00000001' PORTB TIME CON1 HORA1 ; w=8h ; chama rotina de tempo ; chama rotina de controle1 ; w=4d ; w=2d ; w=1d 100 n B'00000001' PORTB TIME CON2 B'00000010' PORTB TIME CON2 B'00000100' PORTB TIME CON2 B'00001000' PORTB TIME CON2 ANTI1 ; w=1h ; w=4d 100 x ; w=100d ; x=w 248 y ; w=248d ; y=w ; chama rotina de tempo ; chama rotina de controle2 ; w=2d ; w=8d TIM2: nop decfsz goto decfsz goto return y TIM2 x TIM1 ;dec.y,pula prox.inst.se =0 CON1: decfsz return goto n ANTIHORA CON2: decfsz return goto end n HORARIO 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 movlw movwf movlw movwf bsf bcf bsf movlw movwf movlw movwf bsf bcf STATUS,RP0 0x1 EEADR 0x1C EEDATA STATUS,RP0 INTCON,GIE EECON1,WREN 55H EECON2 0AAH EECON2 EECON1,WR EECON1,WREN ; seleciono banco0 ; w=1h ; EEADR=w=1h ; w=1Ch ; EEDATA=w=1Ch ; seleciono banco1 para EECON1 ; desabilito as int. ; hab. escrita na EEPROM ; w=55h ; EECON2=55h ; w0=AAh ; EECON2=AAh ; inicia processo de escrita ; desab. esc. EEPROM, não interfere na ; escrita(agora) ; escolho uma rotina de controle de fim de ; escrita , vamos implementar uma bem simples ; (como exemplo) btfss goto bcf EECON1,EEIF controle EECON1,EEIF ; se bit EEIF=1 pula próxima instrução bsf return INTCON,GIE controle: ; zero o bit EEIF (para novo controle de ; escrita) ; habilito novamente as interrupções 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 movlw movwf bsf bsf bcf movf movwf STATUS,RP0 0x1C EEADR STATUS,RPO EECON1,RD STATUS,RP0 EEDATA,0 0x10 ; seleciono banco0, onde esta EEADR ; w=1Ch ; EEADR= w ; sel.banco1 onde esta EECON1 ; hab. leitura ; volto ao banco0 onde esta EEDATA ; w= EEDATA que é o dado lido ; 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. 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. 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).