Curso Micro Control Adores Pic No MpLAB 8

Embed Size (px)

Citation preview

Mais apostilas, livros e programas em:

www.mecatronicadegaragem.blogspot.comAula de Microcontrolador

Prof. Ms. Alcinei Moura Nunes

Curso: Ps-Graduao em Mecatrnica

Apostila de Microcontroladores PIC16F877A

Pgina 1

Mais apostilas, livros e programas em:

www.mecatronicadegaragem.blogspot.comAula de Microcontrolador Metodologia - 3 primeiras aulas Expositivas e Prticas - 2 ltimas Apresentao dos Trabalhos OBS.: O Aluno ter que despertar interesse para alguma aplicao do Microcontrolador estudado e dever ao longo do curso (4 primeiras aulas) tirar as dvidas com o professor. Na ltima aula, far uma apresentao de seu desenvolvimento. Sua nota final ser composta pela participao (presena) e apresentao do projeto. Material de Apoio - Livros sobre microcontroladores da Linha PIC (pesquisar pelo Google) - site: www.microchip.com (datasheet e application note) - Gravadores (internet): ATM (mercado livre) e Labtools (Mcflash ou ICD2BR) Aula 1 Conhecendo o Processador Tpicos: Caractersticas Gerais do PIC16F877A Perifricos Arquitetura Organizao da Memria Registrador STATUS Pinagem Ambiente de Desenvolvimento (MPLAB) Organizao de um Programa Clock do PIC (ciclo de mquina) Primeiro Programa: Acionamento de um Motor de Passo

Caractersticas Gerais do PIC16F877A - Arquitetura RISC (set de instrues reduzidas); - 35 instrues apenas; - Velocidade de Operao: at 20MHz; - Memria de Programa (Flash): 8K x 14 words; - Memria de Dados (RAM): 368 x 8 bytes; - Memria EEPROM: 256 x 8 bytes; - 8 nveis de STACK; - 14 tipos de interrupes; - WDT (WatchDogTimer); Pgina 2

Mais apostilas, livros e programas em:

www.mecatronicadegaragem.blogspot.comAula de Microcontrolador - Proteo do Cdigo; - In-Circuit Serial Programming (ICSP) atravs de 2 pinos; - Opo de selecionar o oscilador; - Ampla faixa de tenso de Operao: 2,0V 5,5V; - Capacidade de corrente por pino: 25mA.

Perifricos Timer0: 8-bit timer/counter Timer1: 16-bit timer/counter Timer2: 8-bit timer/counter Modo PWM (10-bit de resoluo) 8 canais analgicos (10-bit de resoluo) Modo SSP (Synchronous Serial Port) com protocolos SPI e I2C Modo de Comunicao USART (Universal Synchronous Asynchronous Receiver Transmitter) Comunicao Paralela (Parallel Slave Port PSP).

Arquitetura Pgina 6 do Datasheet PIC16F87X

Pgina 3

Aula de Microcontrolador Organizao da Memria Memria de Programa

Pgina 4

Aula de Microcontrolador Memria de Dados

Pgina 5

Aula de Microcontrolador

Registrador STATUS

Pgina 6

Aula de Microcontrolador Pinagem

Pgina 7

Aula de Microcontrolador Ambiente de Desenvolvimento (MPLAB)

Gerenciador de projeto MPLAB

Liguagem C, Assembly ou Pascal.

Linguagem de Mquina

Um compilador converte o cdigo fonte em instrues de mquina.

Pgina 8

Aula de MicrocontroladorTodos os Projetos tero os seguintes passos bsicos: Seleo do Dispositivo Criao do Projeto Seleo da Ferramenta de Linguagem Criao do Cdigo-Fonte Construo do Projeto (Montagem e Ligao) Teste do Cdigo com Simulador

Ambiente de Trabalho

Pgina 9

Aula de Microcontrolador

Configure> Select Device

Seleo do Dispositivo As luzes indicam quais componentes o MPLAB IDE suporta para este dispositivo. Verde: indica suporte completo Amarelo: indica suporte parcial Vermelho: indica nenhum suporte para esse dispositivo.

Pgina 10

Aula de MicrocontroladorProject > Project Wizard

Criando um Novo projeto

Seleo do PIC

Pgina 11

Aula de Microcontrolador

Seleo da Linguagem

Nome do Projeto

Pgina 12

Aula de Microcontrolador

Adio de arquivos existentes para seu projeto

Resumo da criao do projeto

Pgina 13

Aula de MicrocontroladorCaso no tenha adicionado nenhum arquivo, ento clique no File>New para escrever o cdigo fonte.

Janela para escrever o programa

Programa

Pgina 14

Aula de MicrocontroladorProject>Build All

Assembler do Programa

Neste passo, criamos os arquivos de sada (.HEX, .LST e .ERR) a partir do arquivo .ASM. Quando aparecer a mensagem BUILD SUCCEEDED no final da compilao, significa que os arquivo de sada foram gerados corretamente, ou seja, as instrues do programa foram compreendidas e convertidas em sistema binrio. Caso aparea a mensagem BUILD FAILED, deve-se dar duplo clique sobre o erro na janela de sada para o erro ser apontado na janela do cdigo-fonte. Se o Construdo com Sucesso foi alcanado, pode-se realizar a simulao do programa, funcionando no MPLAB como se estivesse gravado na memria do CHIP.

Pgina 15

Aula de MicrocontroladorDebugger>Select Tool>MPLAB SIM

Simulao Na simulao podemos verificar como dever ser a execuo do programa quando este estiver gravado na memria FLASH do PIC. Para verificarmos os valores que so lidos ou escritos na memria de dados ou outros componentes do microcontrolador clicamos no menu View. View>Watch

Verificao dos valores dos registradores

Pgina 16

Aula de MicrocontroladorCom o Watch possvel verificar alguns valores de alguns registradores especficos.

Organizao de um programa ;*************************************************************** #include ;regio para incluso de bibliotecas e macros. ;*************************************************************** __CONFIG ;regio de habilitao/desabilitao dos fusveis. ;*************************************************************** #define BANK1 BSF Status,RP0 ;regio para definio de mini-macros. ;*************************************************************** CBLOCK 0x20 ;regio para definio de variveis Tempo1 ;os registradores de propsito geral Tempo2 ;comeam do endereo 0x20 da RAM. Endc ;*************************************************************** tempo1_value EQU .10 ;regio para associao de valores nomes tempo2_value EQU .50 ;*************************************************************** ORG 0x0000 ;incio da memria de programa Goto INICIO ;*************************************************************** ORG 0X0004 ;incio da regio de interrupo Goto INT ;*************************************************************** DELAY_LCD ;regio de sub-rotinas chamadas pela .... ;instruo CALL RETURN ATUALIZA_LCD .... RETURN MULTIPLICACAO .... RETURN ;*************************************************************** Inicio ;incio do programa BANK1 MOVLW B00000001 ;regio para carregamento dos registradores MOVWF TRISA ;especiais conforme aplicao prtica MOVLW B00000000 MOVWF TRISB BANK0 .... Pgina 17

Aula de Microcontrolador

Principal ....

;regio lgica do programa ;atuao dos registradores de ;entrada e sada

Goto Principal ;*************************************************************** END ;Final do Programa ;*************************************************************** Clock do PIC (ciclo de mquina) O Pic16F877A possui dois osciladores internos do tipo RC de 4MHz, com precises de 1 e 5, as quais dependem das condies de tenso e temperatura do sistema. Estes osciladores no so to precisos, mas dispensam a utilizao de osciladores externos, liberando 2 pinos de I/Os. De um modo geral, osciladores externos so utilizados, e sua escolha depender da preciso e custos envolvidos; dentre eles podemos destacar: circuito RC, ressoador, cristal e circuitos de oscilao. Abaixo temos a ligao de um oscilador cristal.

Pgina 18

Aula de Microcontrolador

Nos microcontroladores da famlia PIC, o clock internamente dividido por quatro. Sendo assim, para um cristal de 4MHz, teremos um clock interno de 1MHz, ou seja, o tempo de execuo de cada instruo ser de 1us (micro-segundo). Este tempo chamado de ciclo de mquina e menor quanto maior for o cristal externo utilizado. Em cada perodo de 1us (para o caso de um cristal de 4MHz), uma nova informao buscada na memria de programa enquanto a informao anterior executada. Essa caracterstica de buscar a informao em um ciclo de mquina e execut-la no prximo conhecida como PIPELINE. De um modo geral, as instrues so executadas no perodo de 1 ciclo de mquina; apenas as instrues que indicam salto, tais como: CALL, RETURN e GOTO, perdem 2 ciclos de mquina. Primeiro Programa: Acionamento de um Motor de Passo Aprendizado - Estrutura de um Programa - Declarao de variveis - Estrutura de Deciso (botes) - Carregamento de Registradores - Delay - Deboucing (filtro para botes)

Pgina 19

Aula de Microcontrolador Funcionamento do Motor de Passo O motor de passo se difere dos demais motores devido a duas caractersticas principais: preciso (sem a necessidade sensores de final de curso) e modo de acionamento. A maioria dos motores de passo so acionados atravs de sinais seqenciais e independentes para cada uma de suas 4 bobinas. Sua velocidade dada atravs do delay entre um sinal e outro. O ngulo do motor de passo pode variar de motor para motor, mas no geral de 1,8 por passo. Dependendo do modo de acionamento possvel reduzir este valor pela metade. Abaixo mostramos o modo de acionamento, considerando um sinal de 1 byte (8 bits) para um motor de 4 bobinas. Sinal 00000001 00000010 00000100 00001000 Bobinas Bobina 1 Bobina 2 Bobina 3 Bobina 4

Em cada instante, apenas uma bobina est acionada. O sinal deve ser seqencial para que o motor gire para o mesmo sentido. Se a seqncia correta no for alcanado o motor girar um passo para um sentido e outro para o sentido contrrio, ou seja, ele vibrar, mas no sair do lugar. Identificao do Comum do Motor de passo Normalmente os motores de passo possuem seis fios, sendo que dois deles devem ser conectados no mesmo ponto. Estes dois devem ser identificados e so chamados de comum. Quando temos a configurao a cinco fios, quer dizer que os dois fios j esto conectados juntos no interior do motor e, portanto, temos um fio comum.

Pgina 20

Aula de Microcontrolador

Para identificao dos comuns, devemos medir os fios de dois em dois na escala de resistncia. Quando estivermos com o fio comum em uma das pontas de prova do multmetro a resistncia dever ser lida pela metade (vide figura abaixo). Motor de 5 fios Motor de 6 fios

Analisando o caso do motor a cinco fios acima, temos que a medida entre quaisquer dois fios excluindo o fio 1, resultar sempre o dobro da medida entre o fio 1 e qualquer outro fio (2, 3, 4 e 5). O mesmo vale para o motor a seis fios, apenas que o comum, neste caso, formado pela conexo dos fios 1 e 2. Identificao da seqncia das Bobinas Tendo j descoberto o fio comum, para identificarmos a seqncia das bobinas devemos aplicar 12 volts em seus terminas. O positivo da fonte deve ser conectado ao comum do motor, e o negativo deve ser triscado em cada uma das quatro bobinas at alcanar uma combinao que resulte no giro do motor para um mesmo sentido.

Pgina 21

Aula de Microcontrolador Drivers para acionamento do Motor de Passo

ULN2803

Pgina 22

Aula de Microcontrolador

TIP31C

Pgina 23

Aula de Microcontrolador Esquema de Ligao utilizando Transistores (TIP122 ou TIP31C)

Hardware do Boto

Programa #INCLUDE __CONFIG _CP_OFF & _CPD_OFF & _DEBUG_OFF & _LVP_OFF & _WRT_OFF & _BODEN_OFF & _WDT_OFF & _PWRTE_ON & _XT_OSC

Pgina 24

Aula de Microcontrolador #DEFINE #DEFINE #DEFINE #DEFINE BANK1 BANK0 BT_HOR BT_ANTIHOR BSF STATUS,RP0 BCF STATUS,RP0 PORTB,7 PORTB,6

CBLOCK 0X20 T1 T2 T3 FILTRO1 FILTRO2 ENDC FILTRO1_VALUE EQU .180 FILTRO2_VALUE EQU .20 ORG GOTO ORG GOTO 0X0000 CONFIGURA 0X0004 CONFIGURA

;******************************************** DELAY MOVLW .255 MOVWF T1 MOVLW .255 MOVWF T2 MOVLW .8 MOVWF T3 DELAYAUX DECFSZ GOTO DECFSZ GOTO DECFSZ GOTO T1 DELAYAUX T2 DELAYAUX T3 DELAYAUX

RETURN ;******************************************** CONFIGURA CLRF PORTA CLRF PORTB CLRF PORTC CLRF PORTD Pgina 25

Aula de Microcontrolador CLRF PORTE BANK1 MOVLW B'00000000' MOVWF TRISA MOVLW B'11110000' MOVWF TRISB MOVLW B'00000000' MOVWF TRISC MOVLW B'00000000' MOVWF TRISD MOVLW B'00000000' MOVWF TRISE MOVLW B'10000100' MOVWF OPTION_REG MOVLW B'00000111' MOVWF ADCON1 BANK0 MOVLW B'00000000' MOVWF INTCON HORARIO BTFSS GOTO BSF CALL BCF BSF CALL BCF BSF CALL BCF BSF CALL BCF MOVLW MOVWF MOVLW MOVWF BT_ANTIHOR FILTRO_ANTIHOR PORTC,7 DELAY PORTC,7 PORTC,6 DELAY PORTC,6 PORTC,5 DELAY PORTC,5 PORTC,4 DELAY PORTC,4 FILTRO1_VALUE FILTRO1 FILTRO2_VALUE FILTRO2

GOTOHORARIO

Pgina 26

Aula de Microcontrolador FILTRO_ANTIHOR DECFSZ FILTRO1 GOTO HORARIO MOVLW MOVWF DECFSZ GOTO MOVLW MOVWF FILTRO1_VALUE FILTRO1 FILTRO2 HORARIO FILTRO2_VALUE FILTRO2

GOTOANTI_HORARIO

ANTI_HORARIO BTFSS GOTO BSF CALL BCF BSF CALL BCF BSF CALL BCF BSF CALL BCF MOVLW MOVWF MOVLW MOVWF GOTO FILTRO_HOR DECFSZ GOTO MOVLW MOVWF

BT_HOR FILTRO_HOR PORTC,4 DELAY PORTC,4 PORTC,5 DELAY PORTC,5 PORTC,6 DELAY PORTC,6 PORTC,7 DELAY PORTC,7 FILTRO1_VALUE FILTRO1 FILTRO2_VALUE FILTRO2 ANTI_HORARIO FILTRO1 ANTI_HORARIO FILTRO1_VALUE FILTRO1 Pgina 27

Aula de Microcontrolador

DECFSZ GOTO MOVLW MOVWF

FILTRO2 ANTI_HORARIO FILTRO2_VALUE FILTRO2

GOTOHORARIO END *********************************************FIM AULA 1********************************************

Aula 2 Interrupes do PIC16F877A

Tpicos: Interrupes Timers (temporizadores) Temporizao de 1 segundo (TIMER1) Display de Cristal Lquido (LCD 2x16) Segundo Programa: Relgio Digital

Interrupes Interrupo uma poderosa ferramenta dos microcontroladores. Os registradores responsveis pela interrupo do PIC16F877A so: INTCON, PIE1, PIE2, PIR1 e PIR2. O principal Registrador o INTCON, pois os bits 6 (PEIE) e 7 (GIE) deste registrador so responsveis pela habilitao da interrupo. Para este microcontrolador especfico, todas interrupes so apontadas para o endereo 0x0004 da Memria de Programa (FLASH). Portanto, quando uma interrupo ocorrer o contador de programa (PCLATH:PCL) apontar para a posio 0x0004, ficando por conta do programador a escolha das prioridades.

Pgina 28

Aula de Microcontrolador REGISTRADOR INTCON 7 6 5 R/W R/W R/W GIE PEIE T0IE

4 R/W INTE

3 R/W RBIE

2 R/W T0IF

1 R/W INTF

0 R/W RBIF

Chave Geral para interrupo de perifricos

{

Porta Paralela, Conversor A/D, USART (recepo e transmisso), CCP1, CCP2, SSP (SPI ou I2C), Timer 1 (TMR1) e Timer 2 (TMR2).

GIE = Habilitao geral das interrupes. PEIE = Habilita/Desabilita interrupo por perifricos. T0IE = Habilita/Desabilita interrupo por Timer 0. INTE = Habilita/Desabilita interrupo pelo pino RB0/INT. RBIE = Habilita/Desabilita interrupo por mudana de estado. T0IF = Sinalizador de estouro do TMR0. INTF = Sinalizador de interrupo pelo pino RB0/INT. RBIF = Sinalizador de interrupo por mudana de estado.

REGISTRADOR PIE1 7 6 5 R/W R/W R/W PSPIE ADIE RCIE

4 R/W TXIE

3 R/W SSPIE

2 R/W CCP1IE

1 R/W TMR2IE

0 R/W TMR1IE

PSPIE = Habilita interrupo por Escrita/Leitura da Porta Paralela. ADIE = Habilita interrupo por trmino da converso A/D. RCIE = Habilita interrupo por dado recebido (USART) TXIE = Habilita interrupo por dado transmitido(USART). SSPIE = Habilita interrupo por dado recebido/transmitido por Porta Serial Sncrona CCP1IE = Habilita interrupo do mdulo CCP1. TMR2IE = Habilita interrupo por estouro do Timer 2. TMR1IE = Habilita interrupo por estouro do Timer 1.

Pgina 29

Aula de Microcontrolador

REGISTRADOR PIE2 7 6 5 R/W R/W R/W

4 R/W EEIE

3 R/W BCLIE

2 R/W

1 R/W

0 R/W CCP2IE

EEIE = Habilita interrupo por Escrita/Leitura na EEPROM. BCLIE = Habilita interrupo por Coliso no Barramento. CCP1IE = Habilita interrupo do mdulo CCP2.

REGISTRADOR PIR1 7 6 5 R/W R/W R/W PSPIF ADIF RCIF

4 R/W TXIF

3 R/W SSPIF

2 R/W CCP1IF

1 R/W TMR2IF

0 R/W TMR1IF

PSPIF = Sinalizador de trmino de Escrita/Leitura na Porta Paralela. ADIF = Sinalizador de trmino da converso A/D. RCIF = Sinalizador de dado recebido (USART) TXIF = Sinalizador de dado transmitido(USART). SSPIF = Sinalizador de dado recebido/transmitido por Porta Serial Sncrona CCP1IF = Sinalizador da interrupo do mdulo CCP1. TMR2IF = Sinalizador de estouro do Timer 2. TMR1IF = Sinalizador de estouro do Timer 1. REGISTRADOR PIR2 7 6 5 R/W R/W R/W

4 R/W EEIF

3 R/W BCLIF

2 R/W

1 R/W

0 R/W CCP2IF

EEIF = Sinalizador de trmino de Escrita/Leitura na EEPROM. BCLIF = Sinalizador de Coliso no Barramento. CCP1IF = Sinalizador de interrupo do mdulo CCP2. TIMERS (Temporizadores) Cada um dos Timers possui uma capacidade de temporizao que se diferem uns dos outros conforme a quantidade de bits, os registradores de controle e o PRESCALER (divisor de freqncia). O Prescaler um divisor de freqncia que torna possvel um aumento no tempo de incremento do registrador (contador).

Pgina 30

Aula de Microcontrolador Os registradores dos TIMERS podem ser incrementados de duas maneiras: atravs do clock interno (ciclo de mquina) ou atravs da borda de subida ou descida de um sinal de entrada externo. O tempo obtido atravs da multiplicao entre: a contagem dos incrementos no registrador (da inicializao at o estouro), o Prescaler, e, o clico de mquina ou o tempo do pulso externo. TMR0 O TMR0 um contador automtico de 8bits (256 valores); seu registrador de controle o OPTION_REG. O TMR0 incrementado em cada ciclo de mquina quando o T0CS=0, ou incrementado em cada pulso externo pelo pino RA4/T0CKI quando T0CS=1 (T0CS configurado no registrador OPTION, onde tambm configurado se o incremento ser na borda de subida, 0, ou descida, 1, atravs de T0SE). Se a interrupo por estouro de TMR0 estiver habilitada no INTCON (T0IE=1), ao final da contagem (255) o contador de programa (PCLATH:PCL) apontar para a posio 0x0004. Atravs do PRESCALER, tambm configurado no OPTION, possvel aumentar o tempo de estouro do TMR0 dividindo a freqncia, isto , quanto menor a freqncia, maior o tempo. A tabela do PRESCALER mostrada abaixo. PS 2 / 1 / 0 000 001 010 011 100 101 110 111 TMR0 1:2 1:4 1:8 1:16 1:32 1:64 1:128 1:256 WDT 1:1 1:2 1:4 1:8 1:16 1:32 1:64 1:128

Por exemplo, se utilizarmos a configurao 111, para os bits PS2, PS1 e PS0, o TMR0 ser incrementado a cada 256s. Importante lembrar que, o bit 3 (PSA) do OPTION seleciona o PRESCALER para WDT (PSA=1) ou para TMR0 (PSA=0). O registrador OPTION mostrado abaixo.

Pgina 31

Aula de Microcontrolador REGISTRADOR OPTION 7 6 5 R/W R/W R/W RBPU INTEDG T0CS

4 R/W T0SE

3 R/W PSA

2 R/W PS2

1 R/W PS1

0 R/W PS0

RBPU = Ativao dos resistores de pull-ups internos do PORTB. 0: Resistores de pull-ups ativados (apenas para os pinos configurados como entrada) 1: Resistores de pull-ups desativados INTEDG = Configurao da borda que gerar a interrupo externa no RB0. 0: Interrupo ocorrer na borda de descida. 1: Interrupo ocorrer na borda de subida. T0CS = Configurao do incremento para o TMR0. 0: TMR0 ser incrementado internamente pelo clock de mquina. 1: TMR0 ser incrementado externamente pelo pino RA4/T0CKI. T0SE = Configurao da borda que incrementar o TMR0 no pino RA4/T0CK, quando T0CS=1. 0: borda de subida 1: borda de descida PSA = Configurao de aplicao do Pre-Scale 0: O Pre-Scale ser aplicado ao TMR0. 1: O Pre-Scale ser aplicado ao WDT. PS2:PS0 = Configurao do valor do Pre-Scale (a tabela j foi mostrada acima)

TMR1 O TMR1 um contador automtico de 16 bits; seu registrador de controle o T1CON. No TMR1 so utilizados dois registradores (TMR1L e TMR1H) para armazenar o valor de inicializao da contagem. Assim como no Timer 0, o TMR1 pode trabalhar com o incremento pelo clock interno ou externo, e tambm possui um prescaler independente, configurado no registrador T1CON (T1CKPS1:T1CKPS0), o qual mostrado abaixo.

Pgina 32

Aula de Microcontrolador REGISTRADOR T1CON 7 6 5 4 3 U U R/W R/W R/W T1CKPS1 T1CKPS0 T1OSCEN

2 R/W /T1SYNC

1 R/W TMR1CS

0 R/W TMR1ON

T1CKPS1:T1CKPS0 = Ajuste do prescaler do Timer 1 (tabela abaixo). PS1 / 0 00 01 10 11 TMR1 1:1 1:2 1:4 1:8

T1OSCEN = Habilitao de um oscilador externo para os pinos T1OSO e T1OSI (12 e 13). 0: Oscilador desabilitado. 1: Oscilador externo habilitado. /T1SYNC = Controle de sincronismo interno. Quando TMR1CS=0 este bit ignorado. 0: Sincronismo ligado. 1: Sincronismo desligado (modo assncrono). TMR1CS = Seleo da origem do clock para Timer 1. 0: Clock interno 1: Clock externo no pino T1OSO/T1CKI TMR1ON = Habilitao do Timer 1. 0: Timer 1 desabilitado. Paralisa o contador do Timer 1. 1: Timer 1 habilitado. Temporizao de 1 segundo (TIMER1) Os registradores que devem ser carregados com o valor inicial da contagem so: TMR1L e TMR1H. Para podermos obter um tempo de 1 segundo apresentaremos uma maneira das vrias possibilidades possveis, isto depende dos valores iniciais de TMR1L e TMR1H, e do Prescaler do Timer 1, configurado atravs do T1CON. Temporizao de 1 segundo: TMR1_HIGH EQU HIGH (.65536-.62500) TMR1_LOW EQU LOW (.65536-.62500) ;parte alta do valor do temporizador ;parte baixa do valor do temporizador

Pgina 33

Aula de Microcontrolador

MOVLW MOVWF

B00110000 T1CON

;Prescaler 1:8

Efetuando a configurao acima temos um tempo de 0,5 segundo, por isto preciso um registrador auxiliar carregado com o valor 2 para que somente na segunda interrupo esta rotina seja executada. Isto obtido atravs das instrues abaixo. DECFSZ Goto INT_TMR1 ..... SAI_INT_TMR1 BCF RETFIE Display de Cristal Lquido (LCD 2x16) Divisor_TMR1 SAI_INT_TMR1 ;rotina de interrupo por TMR1

PIR1,TMR1IF

O modelo de display que estaremos utilizando um de duas linhas com 16 caracteres cada uma. Sua pinagem mostrada abaixo:

Pino Funo Pino Funo 1 VSS 9 DB2 2 VDD 10 DB3 3 V0 11 DB4 4 RS 12 DB5 5 R/W 13 DB6 6 E 14 DB7 7 DB0 15 A 8 DB1 16 K VSS e VDD: alimentao do componente (5V) Vo: potencimetro de 10K (controle de contraste) Pgina 34

Aula de Microcontrolador RS: Tipo de informao (0=comando; 1=dado) R/W: Leitura (0) / Escrita (1) - comando ou dado e verificao do trmino de uma operao E: habilita leitura da informao no barramento de dados DB0 a DB7: barramento de dados paralelo A e K: usados para ligao do Backlight (iluminao de fundo) Existem basicamente duas maneiras para se trabalhar com o LCD: uma a deteco do instante exato no qual a operao j foi executada, onde fazemos a leitura do BUSY FLAG utilizando o pino RW como leitura, atravs da operao READ STATUS, e a outra a utilizao de rotinas de atraso que garante o trmino das operaes internas do mdulo LCD. Apesar de o barramento ser de 8 vias, possvel trabalhar com o mdulo com comunicao de 4 vias, o que valoriza sua utilizao principalmente nos PICs com quantidade pequena de pinos (18 pinos). Para enviarmos uma informao ao LCD precisamos primeiramente ajustar RS para informar se um comando ou um dado. Em seguida, devemos escrever a informao no barramento de dados, e depois setar o pino E. Inicializao do LCD Toda vez que a alimentao for ligada, deve ser executado o procedimento de inicializao do LCD. 1. Aguardar 15ms 2. Com RS em 0, enviar 0x30 para o display (inicializao) 3. Aguardar pelo menos 4ms. 4. Com RS em 0, enviar 0x30 para o display (inicializao) 5. Aguardar pelo menos 100s. 6. Com RS em 0, enviar 0x30 para o display (inicializao) 7. Aguardar pelo menos 40s. 8. Com RS em 0, enviar B00111000 (comunicao por 8 vias) 9. Aguardar pelo menos 40s. 10. Com RS em 0, enviar B00000001 (limpar display e posicionar o cursor na 1linha/1coluna) 11. Aguardar pelo menos 1,8ms. 12. Com RS em 0, enviar B00001100 (liga o display sem cursor) 13. Aguardar pelo menos 40s. 14. Com RS em 0, enviar B00000110 (deslocamento automtico do cursor para a direita) 15. Aguardar pelo menos 40s.

Pgina 35

Aula de Microcontrolador Lista de Comandos do LCD Tabela. Comandos do LCD. RS RW D7 D6 D5 D4 D3 D2 D1 D0 Instruo/Descrio 4 5 14 13 12 11 10 9 8 7 Pinos Limpa Display e retorna a 1 0 0 0 0 0 0 0 0 0 1 posio Retorna Cursor a 1 posio 0 0 0 0 0 0 0 0 1 * Estabelece sentido de 0 0 0 0 0 0 0 1 ID S deslocamento Ativa/Desativa display, 0 0 0 0 0 0 1 D C B ativa/desativa cursor, ativa/desativa cursor piscante. 0 0 0 0 0 1 SC RL * * Move Cursor/Desloca Display Estabelece o n de bits da 0 0 0 0 1 DL N F * * interface, estabelece o n de linhas, e tipo de informao dos caracteres. 0 0 0 1 A A A A A A Enderea a CGRAM 0 0 1 1 0 1 0 1 1 BF D D A * D D A * D D A * D D A * D D A * D D A * D D A * D D Enderea a DDRAM L o contedo do contador de endereos, e a Busy Flag. Escreve dados na CG ou DDRAM. L dados da CG ou DDRAM.

ID 0: o cursor desloca-se automaticamente para a esquerda (decremento) aps uma operao de escrita ou leitura. 1: o cursor desloca-se automaticamente para a direita (incremento) aps uma operao de escrita ou leitura. S 0: desliga o deslocamento da mensagem. 1: Liga o deslocamento da mensagem. Serve para implementar as funes de insert e backspace. D 0: Inibe a visualizao dos caracteres no display. A memria interna do LCD permanece inalterada. 1: Habilita a visualizao dos caracteres no display, conforme os dados existentes na memria interna. C 0: o cursor no visvel.

Pgina 36

Aula de Microcontrolador 1: o crusor visvel como uma linha embaixo do caractere (oitava linha da matriz), como se fosse um sublinhado. B 0: desativa o cursor piscante. 1: ativa o cursor piscante.

SC e RL00: o cursor desloca-se para a esquerda. Decrementa o endereo da memria interna DDRAM. 01: o cursor desloca-se para a direita. Incrementa o endereo da memria interna DDRAM. 10: desloca-se a mensagem e o cursor para a esquerda, em relao posio atual do cursor. Funo Insert. 11: desloca-se a mensagem e o cursor para a direita, em relao posio atual do cursor. Funo Backspace. DL 0: comunicao feita pelas 8 vias de dados, de DB0 DB7. 1: comunicao feita em 4 vias de dados, de DB4 DB7. Inicialmente deve ser enviado, a parte alta do byte e, em seguida, a parte baixa. N e F 00: 1 linha com matriz de 7x5 + cursor 01: 1 linha com matriz de 10x5 + cursor 1-: 2 linhas com matriz de 7x5 + cursor

Escrevendo Caracteres no Display Posicionamento do Cursor na DDRAM: RS 0 DB7 1 DB6 A DB5 A DB4 A DB3 A DB2 A DB1 A DB0 A

O valor acima enviado com RS em 0. Para isto, basta posicionar corretamente o cursor antes da operao de escrita do dado. Abaixo, mostramos a tabela com os 32 caracteres do display e seus endereos absolutos (em hexadecimal). Coluna 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 Linha0 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F Linha1 C0 C1 C2 C3 C4 C5 C6 C7 C8 C9 CA CB CC CD CE CF Com o cursor na posio correta, basta enviar a letra (cdigo ASCII) que se deseja escrever para o display. Lembrando que neste caso, RS deve ser igual a 1. RS 1 DB7 D DB6 D DB5 D DB4 D DB3 D DB2 D DB1 D DB0 D

Pgina 37

Aula de Microcontrolador No se pode esquecer tambm do pulso em E (utilizado para efetivar a leitura da informao escrita no barramento de dados).

Segundo Programa: Relgio Digital #include __CONFIG _CP_OFF & _CPD_OFF & _DEBUG_OFF & _LVP_OFF & _WRT_OFF & _BODEN_OFF & _WDT_ON & _PWRTE_ON & _XT_OSC ERRORLEVEL -302 ERRORLEVEL -305 #DEFINE BANK1 BSF STATUS,RP0 #DEFINE BANK0 BCF STATUS,RP0 #DEFINE BT_UP #DEFINE BT_DOWN #DEFINE BT_ZERO #DEFINE BT_LIGA_DESLIGA #DEFINE DISP_LCD #DEFINE RS #DEFINE ENABLE #DEFINE FLAG_TMR1 ;definies de bancos ;incremento do contador do Display ; decremento do contador do Display ;boto para zerar relgio ;boto para inicar relgio e parar relgio

PORTB,0 PORTB,1 PORTB,2 PORTB,3

PORTD PORTE,0 PORTE,1 PORTA,0

;define LCD ;RS=0 - comando, RS=1 - dado ;habilita o LCD para pegar os dados ;aciona LED quando o relgio liga

CBLOCK 0X20 UNI_SEG DEZ_SEG UNI_MIN DEZ_MIN HORAS FILTRO_BOTOES TEMPO_TURBO DIVISOR_TMR1 CONV_DEZ_HORAS CONV_UNI_HORAS TEMPO0 TEMPO1 AUX DISP_LCD_TEMP ENDC

;varivel auxiliar para contagem de 1 segundo exato ;delay do LCD ;delay do LCD ;varivel auxiliar usada na conv binrio para decimal ;varivel temporria que conter o valor do dado ou ;comando que ser enviado ao LCD

Pgina 38

Aula de Microcontrolador

FILTRO_TECLA TURBO_TECLA TMR1_HIGH TMR1_LOW ORG GOTO ORG INT_TMR1 MOVLW MOVWF MOVLW MOVWF DECFSZ GOTO MOVLW MOVWF

EQU .200 EQU .25

;filtro para evitar rudos dos botes ;parte alta do valor do temporizador ;parte baixa do valor do temporizador

EQU HIGH (.65536-.62500) EQU LOW (.65536-.62500) 0x00 CONFIG 0X04 TMR1_HIGH TMR1H TMR1_LOW TMR1L DIVISOR_TMR1,F SAI_INT_TMR1 .2 DIVISOR_TMR1

;interrupo por TMR1 ;atualiza contadores alto e baixo referente ao ;tempo do TMR1.

;varivel auxiliar (DIVISOR_TMR1) para dar ;1 segundo exato. ;DIVISOR_TMR1 = 0 ? ;NO ;SIM ;atualiza varivel auxiliar do TMR1 ;chama rotina para incrementar contador

CALL INCREMENTA_TIMER CALL ATUALIZA_HORARIO SAI_INT_TMR1 BCF RETFIE PIR1,TMR1IF

;nome da rotina ;Limpa flag para ocorrer interrupo por TMR1. ;rotina para incrementar displays ;incrementa o display referente unidade ;teste para ver se chegou 10. ;UNIDADE=10? ;NO

INCREMENTA_TIMER INCF UNI_SEG,F MOVLW XORWF BTFSS RETURN CLRF INCF .10 UNI_SEG,W STATUS,Z UNI_SEG DEZ_SEG,F

;SIM ;incrementa o display referente dezena

Pgina 39

Aula de Microcontrolador MOVLW XORWF BTFSS RETURN CLRF INCF MOVLW XORWF BTFSS RETURN CLRF INCF MOVLW XORWF BTFSS RETURN CLRF INCF MOVLW XORWF BTFSC CLRF RETURN .6 DEZ_SEG,W STATUS,Z DEZ_SEG UNI_MIN,F .10 UNI_MIN,W STATUS,Z UNI_MIN DEZ_MIN,F .6 DEZ_MIN,W STATUS,Z DEZ_MIN HORAS,F .24 HORAS,W STATUS,Z HORAS ;rotina para decrementar contador ;teste para ver se chegou 10. ;DEZENA=10? ;NO ;SIM ;incrementa o display referente centena

;incrementa o display referente milhar

;incrementa o display referente milhar

DECREMENTA_TIMER

DECF UNI_SEG,F ;decrementa varivel UNI_SEG e guarda o valor nela mesma ;daqui para baixo, preciso saber se o ltimo valor foi 0x00. ;Se foi 0x00, ento UNI_SEG vale 0xFF, onde fazendo a ;mscara (XORWF) teremos, ;0x00 como resultado em W_REG, setando o bit Z do STATUS. ;Com isto, o valor da UNI_SEG deve ser atualizado novamente ;para 0x09. MOVLW 0XFF ;teste para ver se UNIDADE j chegou ao 0xFF XORWF UNI_SEG,W ;mascaramento. BTFSS STATUS,Z ;bit Z do STATUS igual a 1 ? RETURN ;NO ;SIM MOVLW .9 ;atualiza UNIDADE para comear do 0x09. MOVWF UNI_SEG

Pgina 40

Aula de Microcontrolador DECF MOVLW XORWF BTFSS RETURN MOVLW MOVWF DECF MOVLW XORWF BTFSS RETURN MOVLW MOVWF DECF MOVLW XORWF BTFSS RETURN MOVLW MOVWF DECF MOVLW XORWF BTFSS RETURN MOVLW MOVWF RETURN DEZ_SEG,F 0XFF DEZ_SEG,W STATUS,Z .5 DEZ_SEG UNI_MIN,F 0XFF UNI_MIN,W STATUS,Z .9 UNI_MIN DEZ_MIN,F 0XFF DEZ_MIN,W STATUS,Z .5 DEZ_MIN HORAS,F 0XFF HORAS,W STATUS,Z .23 HORAS ;decrementa varivel MILHAR e guarda o valor ;nela mesma ;decrementa varivel DEZENA e guarda o valor ;nela mesma ;teste para ver se DEZENA j chegou ao 0xFF ;mascaramento. ;bit Z do STATUS igual a 1 ? ;NO ;SIM ;atualiza DEZENA para comear do 0x09. ;decrementa varivel CENTENA e guarda o valor ;nela mesma

ATUALIZA_HORARIO MOVF HORAS,W CALL CONV_BIN8_DEC BCF MOVLW CALL RS 0XC8 ATUALIZA ;display setado para comando ;dado ser atualizado a partir do endereo 0xC3 ;atualiza LCD Pgina 41

Aula de Microcontrolador BSF MOVF ADDLW CALL MOVF ADDLW CALL MOVLW CALL MOVF ADDLW CALL MOVF ADDLW CALL MOVLW CALL MOVF ADDLW CALL MOVF ADDLW CALL RETURN CONV_BIN8_DEC MOVWF CLRF CLRF BIN8_DEC_1 MOVLW SUBWF BTFSS GOTO MOVWF AUX CONV_UNI_HORAS CONV_DEZ_HORAS .10 AUX,W STATUS,C BIN8_DEC_2 AUX Pgina 42 RS ;display setado para dados

CONV_DEZ_HORAS,W 0X30 ATUALIZA CONV_UNI_HORAS,W 0X30 ATUALIZA ':' ATUALIZA DEZ_MIN,W 0X30 ATUALIZA UNI_MIN,W 0X30 ATUALIZA ':' ATUALIZA DEZ_SEG,W 0X30 ATUALIZA UNI_SEG,W 0X30 ATUALIZA ;CA ;resultado da converso binrio para decimal ;SOMA 0x30 ao resultado para enviar o dado ;em cdigo ASCII para o LCD ;atualiza LCD ;CA ;resultado da converso binrio para ;decimal ;SOMA 0x30 ao resultado para enviar ;o dado

Aula de Microcontrolador INCF GOTO BIN8_DEC_2 MOVF MOVWF RETURN CONV_DEZ_HORAS,F BIN8_DEC_1 AUX,W CONV_UNI_HORAS

;atraso para garantir que uma operao do LCD termine DELAY_LCD MOVWF TEMPO1 DELAY_ATU MOVLW .250 MOVWF TEMPO0 DELAY_ATU1 CLRWDT DECFSZ TEMPO0,F GOTO DELAY_ATU1 DECFSZ GOTO RETURN ;atualiza dado ou comando no LCD ATUALIZA BSF ENABLE MOVWF DISP_LCD_TEMP MOVLW 0X0F ANDWF DISP_LCD,F MOVLW 0XF0 ANDWF IORWF BCF NOP BSF SWAPF MOVLW ANDWF MOVLW ANDWF IORWF BCF MOVLW TEMPO1,F DELAY_ATU

;habilita LCD para pegar info no barramento ;guarda informao atual no temporrio ;zera o barramento de 4 vias (DB4 DB7) ;atualiza LCD: zera o barramento ;mscara para informao de DB4 DB7 ;envia parte alta primeiro ;atualiza LCD ;desabilita LCD ;atraso ;habilita LCD para pegar info no barramento ;inverte parte alta com parte baixa ;zera o barramento de 4 vias (DB4 DB7) ;atualiza LCD: zera o barramento ;mscara para informao de DB4 DB7 ;envia parte baixa da informao original ;atualiza LCD ;desabilita LCD

DISP_LCD_TEMP,W DISP_LCD,F ENABLE ENABLE DISP_LCD_TEMP,F 0X0F DISP_LCD,F 0XF0 DISP_LCD_TEMP,W DISP_LCD,F ENABLE .1

Pgina 43

Aula de Microcontrolador CALL RETURN CONFIG CLRF CLRF CLRF CLRF CLRF DELAY_LCD ;garante o trmino da operao no LCD

PORTA PORTB PORTC PORTD PORTE B'11111110' TRISA B'11111111' TRISB B'11111111' TRISC B'00001111' TRISD B'00000100' TRISE B'11011011' OPTION_REG B'01000000' INTCON B'00000001' PIE1 B'00000111' ADCON1 ;interrupes de perifricos sero tratadas ;liga interrupo por TMR1 ;PORTA e PORTE configs como I/O's digitais ;conversor A-D desligado

BANK1 MOVLW MOVWF MOVLW MOVWF MOVLW MOVWF MOVLW MOVWF MOVLW MOVWF MOVLW MOVWF MOVLW MOVWF MOVLW MOVWF MOVLW MOVWF BANK0 MOVLW MOVWF BTFSC GOTO MOVLW

B'00110000' T1CON STATUS,NOT_TO $ 0X20 ;aguarda estouro do watchdog timer ;limpa memrio RAM disponvel Pgina 44

Aula de Microcontrolador MOVWF LIMPA_RAM CLRF INCF MOVF XORLW BTFSS GOTO MOVLW MOVWF BSF BCF FSR INDF FSR,F FSR,W 0X80 STATUS,Z LIMPA_RAM .2 DIVISOR_TMR1 INTCON,GIE FLAG_TMR1 ;atualiza varivel aux para contagem de 1 segundo ;habilita chave geral da interrupo ;apaga LED, pois o TMR1 no foi ainda habilitado

INICIALIZACAO_DISPLAY BCF MOVLW CALL MOVLW CALL MOVLW CALL MOVLW CALL MOVLW CALL MOVLW CALL MOVLW CALL MOVLW CALL MOVLW CALL RS 0X30 ATUALIZA .3 DELAY_LCD 0X30 ATUALIZA 0X30 ATUALIZA 0X02 ATUALIZA 0X28 ATUALIZA B'00000001' ATUALIZA .1 DELAY_LCD B'00001100' ATUALIZA ;display setado para comandos ;inicializao do display

;delay exigido pelo display ;inicializao do display ;inicializao do display ;zera o contador de caracteres e retorna posio 0x80 ;trabalhando com 4 vias de dados ;limpa todo o display ;delay de 1ms ;liga o display sem cursor

Pgina 45

Aula de Microcontrolador MOVLW CALL MOVLW CALL BSF MOVLW CALL MOVLW CALL MOVLW CALL MOVLW CALL MOVLW CALL MOVLW CALL MOVLW CALL MOVLW CALL MOVLW CALL MOVLW CALL MOVLW CALL MOVLW CALL MOVLW CALL MOVLW CALL MOVLW CALL BCF MOVLW CALL BSF RS MOVLW CALL '0' ATUALIZA B'00000110' ATUALIZA 0X81 ATUALIZA RS 'R' ATUALIZA 'E' ATUALIZA 'L' ATUALIZA 'O' ATUALIZA 'G' ATUALIZA 'I' ATUALIZA 'O' ATUALIZA '' ATUALIZA '' ATUALIZA '' ATUALIZA '' ATUALIZA '' ATUALIZA '' ATUALIZA '' ATUALIZA '' ATUALIZA RS 0XC8 ATUALIZA ;incrementa automtico direita ;endereo do LCD ;display setado para dados ;81 ;82 ;83 ;84 ;85 ;86 ;87 ;88 ;89 ;8A ;8B ;8C ;8D ;8E ;8F

;endereo do LCD ;display setado para dados ;C8

Pgina 46

Aula de Microcontrolador MOVLW CALL MOVLW CALL MOVLW CALL MOVLW CALL MOVLW CALL MOVLW CALL MOVLW CALL VARRE CLRWDT BTFSS GOTO BTFSS GOTO BTFSS GOTO BTFSS GOTO MOVLW MOVWF MOVLW MOVWF GOTO TRATA_BT_UP DECFSZ GOTO DECFSZ GOTO MOVLW BT_UP TRATA_BT_UP BT_DOWN TRATA_BT_DOWN BT_ZERO TRATA_BT_ZERO BT_LIGA_DESLIGA TRATA_BT_LIGA_DES FILTRO_TECLA FILTRO_BOTOES .40 TEMPO_TURBO VARRE FILTRO_BOTOES,F VARRE TEMPO_TURBO,F VARRE TURBO_TECLA ;diminui a velocidade do incremento Pgina 47 '0' ATUALIZA ':' ATUALIZA '0' ATUALIZA '0' ATUALIZA ':' ATUALIZA '0' ATUALIZA '0' ATUALIZA ;C9 ;CA ;CB ;CC ;CD ;CE ;CF ;testa botes ;limpa o WDT para o programa no ser ;reinicializado em condies normais ;boto para incrementar valor dos displays ;boto para decrementar valor dos displays ;boto para zerar relgio ;liga/desliga Relgio ;deboucing

Aula de Microcontrolador MOVWF CALL CALL GOTO TEMPO_TURBO INCREMENTA_TIMER ATUALIZA_HORARIO VARRE ;BT_UP permanecer pressionado

TRATA_BT_DOWN DECFSZ FILTRO_BOTOES,F GOTO VARRE DECFSZ GOTO MOVLW MOVWF CALL CALL GOTO TEMPO_TURBO,F VARRE TURBO_TECLA TEMPO_TURBO DECREMENTA_TIMER ATUALIZA_HORARIO VARRE ;diminui a velocidade do decremento ;BT_DOWN permanecer pressionado

TRATA_BT_LIGA_DES DECFSZ FILTRO_BOTOES,F GOTO VARRE DECFSZ GOTO MOVLW MOVWF BTFSS GOTO DESLIGA_TMR1 BCF BCF GOTO LIGA_TMR1 BSF MOVLW MOVWF TEMPO_TURBO,F VARRE TURBO_TECLA TEMPO_TURBO FLAG_TMR1 LIGA_TMR1 FLAG_TMR1 T1CON,TMR1ON VARRE FLAG_TMR1 TMR1_HIGH TMR1H ;ESTADO_TIMER=1? ;NO ;SIM ;desliga varivel referente ao TIMER ;desabilita a contagem ;volta para varredura de botes. ;liga varivel referente ao TIMER ;atualiza valores do TMR1

Pgina 48

Aula de Microcontrolador MOVLW MOVWF MOVLW MOVWF BSF GOTO TMR1_LOW TMR1L .2 DIVISOR_TMR1 T1CON,TMR1ON VARRE ;habilita a contagem ;atualiza varivel auxiliar para contagem de ;1 segundo.

TRATA_BT_ZERO DECFSZ FILTRO_BOTOES,F GOTO VARRE DECFSZ GOTO MOVLW MOVWF CLRF CLRF CLRF CLRF CLRF CALL GOTO END TEMPO_TURBO,F VARRE TURBO_TECLA TEMPO_TURBO UNI_SEG DEZ_SEG UNI_MIN DEZ_MIN HORAS ATUALIZA_HORARIO VARRE

Aula 3 Conversor Analgico Digital Tpicos: CAD (Conversor A/D) Programao Tabela Terceiro Programa: Sensor de Temperatura

Pgina 49

Aula de Microcontrolador CAD (Conversor A/D) No mundo exterior podemos dizer que tudo est na forma analgica, ou seja, utilizamos a base 10 (decimal) para efetuarmos todos os clculos matemticos do dia-adia, isto linguagem cotidiana. Para que o mundo dos microprocessadores ou microcontroladores possam nos ajudar a resolver problemas, tal como clculos necessrio converter sinais analgicos em sinais digitais, ou seja, linguagem de mquina. O Conversor Analgico/Digital tem a funo de pegar este nvel de tenso, codificlo em base binria, e aps um certo tempo de processamento, decodific-lo em decimal para podermos entend-lo. Nesta seo, referiremos ao mdulo A/D do 16F877A, caractersticas e registradores utilizados, sero discutidos em detalhe. As frmulas mais importantes para este sistema de converso so mostradas abaixo. Resoluo = Vref 2n n = nmero de bits do conversor Vref = tenso de referncia m = posio do bit (0 a 9) Bm = valor do bit m, 0 ou 1. Um ponto importante, diz respeito velocidade e, conseqentemente, aos tempos de amostragem para a converso A/D. Abaixo mostramos a tabela com os tempos e etapas do sistema de converso A/D. Cdigo A B C D E Nome Adequao do Capacitor Desligamento do Capacitor Converso Religamento do Capacitor Nova adequao do Capacitor Tempo 40s 100ns 12TAD 2TAD 40s Ventrada = ( Bm 2(m) Vref ) 2n

TAD = tempo de converso de 1 bit. Para que o sistema de converso funcione corretamente, um clock deve ser aplicado a ele. Cada perodo deste clock ser chamado de TAD. Este clock escolhido por software conforme configurao dos bits ADCS1 e ADCS0 do registrador ADCON0; isto ser detalhado mais adiante.

Pgina 50

Aula de Microcontrolador Em PICs de 28 pinos (por exemplo: 16F873), temos 5 deles reservados para o mdulo A/D, so eles: RA0/AN0, RA1/AN1, RA2/AN2, RA3/AN3 e RA5/AN4. No P16F877A (40 pinos) temos 8 pinos dedicados ao mdulo A/D, quais sejam: 2, 3, 4, 5, 7, 8, 9 e 10. Estes trs ltimos se referem ao PORTE (bits 0, 1 e 2), os 5 primeiros so os mesmos do PIC de 28 pinos citado. O mdulo A/D possui 4 registradores: ADRESH, ADRESL, ADCON0 e ADCON1. Os registradores: ADRESH e ADRESL contm o resultado dos 10 bits da converso AD. Com isto, verificamos que 6 bits destes registradores sero descartados. Quais bits sero descartados, pode ser escolhido atravs do registrador ADCON1,ADFM, o qual ser mostrado na seqncia. A figura abaixo mostra as duas maneiras de configurar os 10 bits que contm o resultado da converso AD: justificado pela direita ou justificado pela esquerda.

REGISTRADOR ADCON0 7 6 5 R/W R/W R/W ADCS1 ADCS0 CHS2

4 R/W CHS1

3 R/W CHS0

2 R/W GO/DONE\

1 U -

0 R/W ADON

ADCS1:ADCS0 Bit de seleo do clock de converso A/D ADCS1 / 0 00 01 10 11 Clock FOSC/2 FOSC/8 FOSC/32 FRC oscilador RC interno (Sleep)

Pgina 51

Aula de Microcontrolador CHS2:CHS0 Bit de seleo do Canal Analgico CHS2/0 000 001 010 011 100 101 110 111 Canal 0 1 2 3 4 5 6 7 PORT RA0/AN0 (pino 2) RA1/AN1 (pino 3) RA2/AN2 (pino 4) RA3/AN3 (pino 5) RA5/AN4 (pino 7) RE0/AN5 (pino 8) RE1/AN6 (pino 9) RE2/AN7 (pino 10)

GO/DONE\ - Bit de Status da Converso A/D 1: Converso A/D em andamento 0: Converso A/D terminada/parada. ADON Bit de ligao do Mdulo 1: Mdulo de converso AD est operando 0: Mdulo de converso AD est desligado (no consome corrente). REGISTRADOR ADCON1 7 6 5 4 R/W U U U ADFM -

3 R/W PCFG3

2 R/W PCFG2

1 R/W PCFG1

0 R/W PCFG0

ADFM Bit de seleo do formato do resultado de AD 1: Justificado pela direita (os 6 bits mais significativos de ADRESH sero descartados). 0: Justificado pela esquerda (os 6 bits menos significativos de ADRESL sero descartados). PCFG3:PCFG0 Bits de controle da configurao dos Pinos do Mdulo AD

Pgina 52

Aula de Microcontrolador

Aps termos verificado a configurao dos registradores referente ao mdulo A/D, vamos discutir um pouco seu funcionamento. Como vimos o ADCON1 o registrador responsvel por configurar os pinos do PORTA e do PORTE como entradas analgicas ou digitais. Os pinos dos PORTs que so escolhidos como entradas analgicas devem ter seu bit correspondente do TRIS configurado como entrada. Basicamente temos duas maneiras diferentes de operao do mdulo A/D: com interrupo ou com verificao do Bit 0 (GO/DONE\) do registrador ADCON0. O modo de verificao do bit GO/DONE\ muito mais simples, veja cdigo de exemplo abaixo: LOOP BSF ADCON0,GO BTFSC ADCON0,GO GOTO $-1 MOVF ADRESH,W ... GOTO LOOP J no modo de funcionamento por interrupo (um pouco mais minucioso) devemos proceder da seguinte forma:

Pgina 53

Aula de Microcontrolador CONFIG BCF MOVLW MOVWF BSF MOVLW MOVWF BCF BSF ...

STATUS,RP0 B01000000 INTCON STATUS,RP0 B01000000 PIE1 STATUS,RP0 INTCON,GIE

;seleciona banco 0 ;chave geral para interrupo por perifricos ;seleciona banco 1 ;habilita interrupo por trmino de converso A/D ;ADIE habilitado ;seleciona banco 0 ;liga chave geral para tratar interrupes

Aps ocorrer a interrupo, o contador de programa (PCL) ser apontado para o endereo 0X04. No trmino do tratamento da interrupo, no podemos esquecer de limpar o bit 6 (flag ADIF) do registrador PIR1. O mdulo A/D aceita ainda uma operao durante SLEEP (economia de energia), mas a seleo de clock deve ser FRC interno, ou seja, os bits ADCS0 e ADCS1 do ADCON0 devem estar configurados com nvel 1 lgico. Uma observao importante vlida aqui, se utilizarmos a instruo SLEEP com outra opo de clock (no RC), a converso ser abortada, mdulo A/D desligado, embora o bit ADON esteja setado. Exemplo de cdigo com SLEEP: Config ... MOVLW MOVWF ... B11000000 ;configura clock FRC interno ADCON0

New_ad BSF ADCON0,GO ;inicia nova converso AD SLEEP MOVF ADRESH,W ;quando a converso AD terminar, continuar daqui. ... GOTO New_ad

Pgina 54

Aula de Microcontrolador Programao Tabela ORG 0X300 RADIX DEC TABELA_TEMPERATURA MOVLW HIGH TABELA_TEMP MOVWF PCLATH MOVLW LOW TABELA_TEMP ADDWF conv_bin_temp,W BTFSC STATUS,C INCF PCLATH,F MOVWF PCL TABELA_TEMP DT 000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000 DT 004,004,004,004,004,004,004,004,004,004,004,004,004,004,004,004 DT 008,008,008,008,008,008,008,008,008,008,008,008,008,008,008,008 DT 012,012,012,012,012,012,012,012,012,012,012,012,012,012,012,012 DT 016,016,016,016,016,016,016,016,016,016,016,016,016,016,016,016 DT 020,020,020,020,020,020,020,020,020,020,020,020,020,020,020,020 DT 022,022,022,022,022,022,022,022,022,022,022,022,022,022,022,022 DT 024,024,024,024,024,024,024,024,024,024,024,024,024,024,024,024 DT 026,026,026,026,026,026,026,026,026,026,026,026,026,026,026,026 DT 028,028,028,028,028,028,028,028,028,028,028,028,028,028,028,028 DT 030,030,030,030,030,030,030,030,030,030,030,030,030,030,030,030 DT 031,031,031,031,031,031,031,031,031,031,031,031,031,031,031,031 DT 032,032,032,032,032,032,032,032,032,032,032,032,032,032,032,032 DT 033,033,033,033,033,033,033,033,033,033,033,033,033,033,033,033 DT 034,034,034,034,034,034,034,034,034,034,034,034,034,034,034,034 DT 035,035,035,035,035,035,035,035,035,035,035,035,035,035,035,035 ;15 ;31 ;47 ;63 ;79 ;95 ;111 ;127 ;143 ;159 ;175 ;191 ;207 ;223 ;239 ;255

Terceiro Programa: Sensor de Temperatura #include #include ; inclui MACROs __CONFIG _CP_OFF & _CPD_OFF & _DEBUG_OFF & _LVP_OFF & _WRT_OFF & _BODEN_OFF & _WDT_ON & _PWRTE_ON & _XT_OSC ERRORLEVEL -302 ERRORLEVEL -305

Pgina 55

Aula de Microcontrolador #DEFINE BANK1 BSF STATUS,RP0 #DEFINE BANK0 BCF STATUS,RP0 #DEFINE DISP_LCD #DEFINE RS #DEFINE ENABLE ;definies de bancos

PORTD ;define LCD PORTE,0 PORTE,1

#DEFINE BT1 PORTB,0 #DEFINE BT2 PORTB,1 #DEFINE BT3 PORTB,2 #DEFINE BT4 PORTB,3 CBLOCK 0X20 PARTE_ALTA PARTE_BAIXA conv_bin_temp fator_multi TEMPO0 TEMPO1 AUX MOSTRADOR_AV MOSTRADOR_DV DISP_LCD_TEMP AUX_DEC_DV AUX_DEC_AV TEMP_CELSIUS ENDC ORG GOTO 0x00 INICIO ;parte alta do resultado da multiplicao ;parte baixa do resultado da multiplicao ;resultado da converso A/D ;tenso de referncia, neste caso, foi de 5V. ;delay do LCD ;delay do LCD ;varivel auxiliar usada na conv binrio para decimal ;varivel que ser mostrada no LCD antes da vrgula ;varivel que ser mostrada no LCD depois da vrgula ;varivel temporria que conter o valor do dado ou ;comando que ser enviado ao LCD

;atraso para garantir que uma operao do LCD termine DELAY_MS MOVWF TEMPO1 MOVLW .250 MOVWF TEMPO0 CLRWDT DECFSZ GOTO DECFSZ GOTO RETURN Pgina 56 TEMPO0,F $-2 TEMPO1,F $-6

Aula de Microcontrolador

;atualiza dado ou comando no LCD ATUALIZA BSF ENABLE MOVWF DISP_LCD_TEMP MOVLW 0X0F ANDWF DISP_LCD,F MOVLW 0XF0 ANDWF IORWF BCF NOP BSF SWAPF MOVLW ANDWF MOVLW ANDWF IORWF BCF

;guarda informao atual no temporrio ;zera o barramento de 4 vias (DB4 DB7) ;atualiza LCD: zera o barramento ;mscara para informao de DB4 DB7 ;envia parte alta primeiro ;atualiza LCD ;desabilita LCD ;atraso ;habilita LCD para pegar info no barramento ;inverte para alta com parte baixa no temp ;zera o barramento de 4 vias (DB4 DB7) ;atualiza LCD: zera o barramento ;mscara para informao de DB4 DB7 ;envia parte baixa da informao original ;atualiza LCD ;desabilita LCD

DISP_LCD_TEMP,W DISP_LCD,F ENABLE ENABLE DISP_LCD_TEMP,F 0X0F DISP_LCD,F 0XF0 DISP_LCD_TEMP,W DISP_LCD,F ENABLE

MOVLW .1 CALL DELAY_MS RETURN CONV_BIN8_DEC MOVWF CLRF CLRF BIN8_DEC_1 MOVLW SUBWF BTFSS GOTO MOVWF INCF GOTO BIN8_DEC_2 MOVF MOVWF RETURN MULTIPLICA8X8 CLRF AUX AUX_DEC_DV AUX_DEC_AV .10 AUX,W STATUS,C BIN8_DEC_2 AUX AUX_DEC_AV,F BIN8_DEC_1 AUX,W AUX_DEC_DV

;garante o trmino da operao no LCD

PARTE_ALTA Pgina 57

Aula de Microcontrolador CLRF MOVF BCF MULT8 MULT8 MULT8 MULT8 MULT8 MULT8 MULT8 MULT8 RETURN INICIO CLRF CLRF CLRF CLRF CLRF PARTE_BAIXA fator_multi,W STATUS,C 0 1 2 3 4 5 6 7

PORTA PORTB PORTC PORTD PORTE B'11111111' TRISA B'11101111' TRISB B'00000000' TRISC B'00001111' TRISD B'00000100' TRISE B'11011011' OPTION_REG B'00000000' INTCON B'00000100' ADCON1 ;interrupes no sero tratadas ;ADFM justificado direita ;Canais analgicos 1, 2 e 4

BANK1 MOVLW MOVWF MOVLW MOVWF MOVLW MOVWF MOVLW MOVWF MOVLW MOVWF MOVLW MOVWF MOVLW MOVWF MOVLW MOVWF

Pgina 58

Aula de Microcontrolador BANK0 MOVLW MOVWF BTFSC GOTO$ B'00001001' ADCON0 STATUS,NOT_TO ;aguarda estouro do watchdog timer ;limpa memrio RAM disponvel

MOVLW 0X20 MOVWF FSR LIMPA_RAM CLRF INDF INCF FSR,F MOVF FSR,W XORLW 0X80 BTFSS STATUS,Z GOTO LIMPA_RAM INICIALIZACAO_DISPLAY BCF MOVLW CALL MOVLW CALL MOVLW CALL MOVLW CALL MOVLW CALL MOVLW CALL MOVLW CALL MOVLW CALL RS 0X30 ATUALIZA .3 DELAY_MS 0X30 ATUALIZA 0X30 ATUALIZA 0X02 ATUALIZA 0X28 ATUALIZA B'00000001' ATUALIZA .1 DELAY_MS

;display setado para comandos ;inicializao do display

;delay exigido pelo display ;inicializao do display ;inicializao do display ;zera o contador de caracteres e retorna ;posio 0x80 ;trabalhando com 4 vias de dados ;limpa todo o display ;delay de 1ms

Pgina 59

Aula de Microcontrolador

MOVLW CALL MOVLW CALL MOVLW CALL BSF MOVLW CALL MOVLW CALL MOVLW CALL MOVLW CALL MOVLW CALL MOVLW CALL MOVLW CALL MOVLW CALL MOVLW CALL MOVLW CALL MOVLW CALL BCF MOVLW CALL BSF MOVLW CALL MOVLW CALL MOVLW CALL

B'00001100' ATUALIZA B'00000110' ATUALIZA 0X82 ATUALIZA RS 'M' ATUALIZA 'E' ATUALIZA 'D' ATUALIZA 'I' ATUALIZA 'D' ATUALIZA 'O' ATUALIZA 'R' ATUALIZA '' ATUALIZA '' ATUALIZA 'D' ATUALIZA 'E' ATUALIZA RS 0XC2 ATUALIZA RS 'T' ATUALIZA 'E' ATUALIZA 'M' ATUALIZA

;liga o display sem cursor ;incrementa automtico direita ;endereo do LCD ;display setado para dados ;82 ;83 ;84 ;85 ;86 ;87 ;88 ;89 ;8A ;8B ;8C

;C2 ;C3 ;C4

Pgina 60

Mais apostilas, livros e programas em:

www.mecatronicadegaragem.blogspot.comAula de Microcontrolador MOVLW CALL MOVLW CALL MOVLW CALL MOVLW CALL MOVLW CALL MOVLW CALL MOVLW CALL MOVLW CALL LOOP CLRWDT BSF BTFSC GOTO MOVF MOVWF MOVLW MOVWF CALL DIV_256 CALL MOVFW MOVWF MOVFW MOVWF CALL CALL MOVWF CALL CONV_BIN8_DEC AUX_DEC_DV MOSTRADOR_DV AUX_DEC_AV MOSTRADOR_AV MOSTRA_TENSAO_LCD TABELA_TEMPERATURA TEMP_CELSIUS CONV_BIN8_DEC Pgina 61 ADCON0,GO ADCON0,GO $-1 ADRESH,W conv_bin_temp .50 fator_multi MULTIPLICA8X8 ;limpa WDT ;inicia converso 'P' ATUALIZA 'E' ATUALIZA 'R' ATUALIZA 'A' ATUALIZA 'T' ATUALIZA 'U' ATUALIZA 'R' ATUALIZA 'A' ATUALIZA ;C5 ;C6 ;C7 ;C8 ;C9 ;CA ;CB ;CC

;resultado da converso A/D ;varivel temporria ;tenso de referncia de 5 Volts ;executa multiplicao ;macro de diviso por 256 ;executa um ajuste decimal

Mais apostilas, livros e programas em:

www.mecatronicadegaragem.blogspot.comAula de Microcontrolador CALL GOTO MOSTRA_TEMP_LCD LOOP

MOSTRA_TENSAO_LCD BCF RS MOVLW 0X80 CALL ATUALIZA BSF RS MOVLW CALL MOVLW CALL MOVLW CALL MOVLW CALL MOVLW CALL MOVLW CALL MOVLW CALL MOVLW CALL MOVLW CALL MOVLW CALL MOVF ADDLW CALL MOVLW CALL MOVF ADDLW CALL MOVLW CALL MOVLW '' ATUALIZA 'T' ATUALIZA 'E' ATUALIZA 'N' ATUALIZA 'S' ATUALIZA 'A' ATUALIZA '0' ATUALIZA '' ATUALIZA '=' ATUALIZA '' ATUALIZA ;0 ;1 ;2 ;3 ;4 ;5 ;6 ;7 ;8 ;9 ;resultado da conv binrio para decimal ;SOMA 0x30 ao resultado ;em cdigo ASCII para o LCD ;atualiza LCD ;cdigo ASCII da vrgula ;resultado da conv binrio para decimal ;SOMA 0x30 ao resultado.

MOSTRADOR_AV,W 0X30 ATUALIZA ',' ATUALIZA MOSTRADOR_DV,W 0X30 ATUALIZA '' ATUALIZA 'V'

Pgina 62

Mais apostilas, livros e programas em:

www.mecatronicadegaragem.blogspot.comAula de Microcontrolador CALL MOVLW CALL RETURN MOSTRA_TEMP_LCD BCF RS MOVLW 0XC0 CALL ATUALIZA BSF RS MOVLW CALL MOVLW CALL MOVLW CALL MOVLW CALL MOVLW CALL MOVLW CALL MOVLW CALL MOVLW CALL MOVLW CALL MOVLW CALL MOVF ADDLW CALL MOVF ADDLW CALL MOVLW CALL MOVLW CALL MOVLW 'T' ATUALIZA 'E' ATUALIZA 'M' ATUALIZA 'P' ATUALIZA '(' ATUALIZA 'o' ATUALIZA 'C' ATUALIZA ')' ATUALIZA '=' ATUALIZA '' ATUALIZA AUX_DEC_AV,W 0X30 ATUALIZA ;0 ;1 ;2 ;3 ;4 ;5 ;6 ;7 ;8 ;9 ;resultado da converso binrio para decimal ;SOMA 0x30 ao resultado para enviar o dado ;em cdigo ASCII para o LCD ;atualiza LCD ;display setado para comando ATUALIZA '' ATUALIZA

AUX_DEC_DV,W ;resultado da converso binrio para decimal 0X30 ;SOMA 0x30 ao resultado para enviar o dado ATUALIZA '' ATUALIZA 'o' ATUALIZA 'C' ;cdigo ASCII da vrgula

Pgina 63

Mais apostilas, livros e programas em:

www.mecatronicadegaragem.blogspot.comAula de Microcontrolador CALL MOVLW CALL RETURN ORG 0X300 RADIX DEC TABELA_TEMPERATURA MOVLW HIGH TABELA_TEMP MOVWF PCLATH MOVLW LOW TABELA_TEMP ADDWF conv_bin_temp,W BTFSC STATUS,C INCF PCLATH,F MOVWF PCL TABELA_TEMP DT 000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000 DT 004,004,004,004,004,004,004,004,004,004,004,004,004,004,004,004 DT 008,008,008,008,008,008,008,008,008,008,008,008,008,008,008,008 DT 012,012,012,012,012,012,012,012,012,012,012,012,012,012,012,012 DT 016,016,016,016,016,016,016,016,016,016,016,016,016,016,016,016 DT 020,020,020,020,020,020,020,020,020,020,020,020,020,020,020,020 ; DT 022,022,022,022,022,022,022,022,022,022,022,022,022,022,022,022 DT 024,024,024,024,024,024,024,024,024,024,024,024,024,024,024,024 DT 026,026,026,026,026,026,026,026,026,026,026,026,026,026,026,026 DT 028,028,028,028,028,028,028,028,028,028,028,028,028,028,028,028 DT 030,030,030,030,030,030,030,030,030,030,030,030,030,030,030,030 DT 031,031,031,031,031,031,031,031,031,031,031,031,031,031,031,031 DT 032,032,032,032,032,032,032,032,032,032,032,032,032,032,032,032 DT 033,033,033,033,033,033,033,033,033,033,033,033,033,033,033,033 DT 034,034,034,034,034,034,034,034,034,034,034,034,034,034,034,034 DT 035,035,035,035,035,035,035,035,035,035,035,035,035,035,035,035 END ;15 ;31 ;47 ;63 ;79 95 ;111 ;127 ;143 ;159 ;175 ;191 ;207 ;223 ;239 ;255 ATUALIZA '' ATUALIZA

Pgina 64