Você está na página 1de 77

Apostila de Microcontroladores PIC Utilizando a linguagem de programao PICBASIC Lzaro Aparecido Pires de Camargo

Sumrio

1.Introduo .............................................................................................................. 3 2.Acessando os pinos de I/O ................................................................................... 5 3.Instruo FOR ... NEXT ......................................................................................... 7 4.Instruo IF...THEN...ELSE...ENDIF ...................................................................... 9 5.Instruo WHILE...WEND...................................................................................... 11 6.Instruo GOSUB ................................................................................................. 13 7.Exerccios de Reviso - Conceitos Bsicos........................................................ 17 8.Conectando um LCD em um microcontrolador PIC ........................................... 20 9.Conectando um display de 7 Segmentos............................................................ 24 10.Conversor A/D ..................................................................................................... 27 11.Comunicao Serial............................................................................................ 33 12.Utilizando a memria EEPROM interna do PIC ................................................. 40 13.Instruo PWM .................................................................................................... 43 14.Controle de um motor de passo utilizando o microcontrolador PIC............... 44 15.Utilizando Interrupes ...................................................................................... 54 16.Conectando um teclado no PIC ......................................................................... 58 17.Mdulo Comparador Analgico ........................................................................ 62 18.Microcontrolador PIC 12F675............................................................................. 66 19.Resumo do Compilador PicBasic Pro (PBP)..................................................... 70

1. Introduo Microcontrolador PIC 16F877A

Caractersticas: 33 pinos de I/O (entradas / sadas) digitais; 8192 (8K) palavras de 14 bits para programa em memria FLASH; 368 bytes de memria RAM e 256 bytes de memria EEPROM interna para dados; 3 timers (2 timers de 8 bits e 1 timer de 16 bits); 1 canal de comunicao USART serial e 1 timer watdog conversor A/D (analgico digital) com 8 canais; frequncia de operao de at 20MHz

Os 33 pinos de I/O esto organizados em 5 portas: PORTA RA5 PORTB RB7 PORTC RC7 PORTD RD7 PORTE RE2 RE1 RE0 RA4 RA3 RA2 RA1 RA0

RB6

RB5

RB4

RB3

RB2

RB1

RB0

RC6

RC5

RC4

RC3

RC2

RC1

RC0

RD6

RD5

RD4

RD3

RD2

RD1

RD0

Os pinos de I/O podem ser configurados como entrada ou sada, dependendo dos valores dos registros TRIS TRIS = 1 - pino como entrada (Input) TRIS = 0 - pino como sada (Output) TRISA configura a PORTA, TRISB configura a PORTB e assim por diante. Exemplo: TRISB = %00000011 configura os pinos da PORTB da seguinte forma:

Exerccio 1 : Como foram configurados os pinos (como entrada ou sada) abaixo:

a) TRISB = %10010001 1 0 0 1 0 0 0 1

Configurao da PORTB: entrada saida

b) TRISC =%11110000 1 1 1 1 0 0 0 0

Configurao da PORTC:

c) TRISD =%00000000 0 0 0 0 0 0 0 0

Configurao da PORTC:

2.Acessando os pinos de I/O 1) Simule os programas, indicando o valor do PORTB aps executa-los: a) TRISB = %00000000 PORTB.7 = 1 PORTB.2 = 1 END

PORTB=%

b) LED1 LED5 LED6 VAR VAR VAR PORTB.1 PORTB.5 PORTB.6

TRISB = %00000000 LED1 = 1 LED5 = 1 LED6 = 1 END

PORTB=%

c) LED3 VAR PORTB.3 TRISB = %00000000 VOLTA: LED3 = 1 PAUSE 1 LED3 = 0 PAUSE 1 GOTO VOLTA END

PORTB=%

2) Elabore um programa que faa RB4 =1 e RB7=1 e os demais pinos do PORTB iguais a zero:

3) Elabore um programa em que os pinos RB0 e RB7 ficaram piscando juntos (RB0=1 e RB7=1......RB0= 0 e RB7= 0..)

4) Elabore um programa em que os pinos RB0 e RB7 ficaram piscando de forma alternada (RB0=1 e RB7=0......RB0= 0 e RB7= 1..)

5) Elabore um programa que realize as seguintes operaoes: a) ativar o pino RB2 durante 2ms b) depois ativar o pino RB4 durante 5ms c) depois ativar o pino RB5 durante 1ms

6) Elabore um programa que realize as seguintes operaes: a) Definir uma variavel MOTOR conectada ao pino RB2 b) Ativar MOTOR durante 4 ms e desligar Motor durante 3ms de forma continua 7) Elabore um programa que ative a PORTB, da seguinte forma: RB7 RB6 RB5 RB4 RB3 RB2 RB1 RB0 ON ON ON ON OFF OFF OFF OFF OFF OFF OFF OFF ON ON ON ON ON ON ON ON OFF OFF OFF OFF ON ON ON ON OFF OFF OFF OFF OFF OFF ON ON ON ON OFF OFF ON ON OFF OFF OFF OFF ON ON

Cada estado da PORTB deve ficar durante 2 ms. 8) Modifique o exercicio 7, utilizando a PORTD 9) Elabore um programa para que todos os pinos da PORTB e PORTC fiquem ligando e desligando, a cada 5 ms. 10) Modifique o exercicio 9, incluindo a PORTD

3. Instruo FOR...NEXT FOR conta = inicio TO fim {STEP {-} Inc } {Corpo} NEXT {Conta}

O loop FOR.. NEXT permite que os programas executem um nmero de declaraes (o Corpo) por algumas vezes usando uma varivel como contador. Exemplos: FOR i = 1 TO 10 Serout 0, N2400,[#i, ] NEXT i Conta de 1 a 10 Envia cada numero para Pin0 serialmente Retorna e faz a proxima contagem

Serout 0,N2400,[10] Envia um avano de linha

FOR

B2 =20 TO 10 STEP -2

Conta de 20 a 10 de 2 em 2

Serout 0, N2400, [#B2, ] NEXT B2 retorna e faz a proxima contagem

Serout 0,N2400,[10] Envia um avano de linha

1) Simule os programas, indicando o valor do PORTB aps executa-los: a) A VAR BYTE

TRISB = %00000000 PORTB = %10000000 FOR A = 0 TO 3 PORTB = PORTB >> 1 PAUSE 2 NEXT A END

b) A VAR BYTE

TRISB = %00000000 PORTB = %10000000 FOR A = 0 TO 3 STEP 2 PORTB = PORTB >> 1

PAUSE 2 NEXT A END

c)

CONTADOR

VAR

BYTE

TRISB = %00000000 FOR CONTADOR = 0 TO 9 PORTB = CONTADOR PAUSE 2 NEXT CONTADOR END d) X VAR BYTE

TRISB = %00000000 VOLTA: PORTB = %10000000 FOR X=1 TO 4 PAUSE 4 PORTB = PORTB >> 1 NEXT X GOTO VOLTA END 2) Modifique o programa 1a, para que o FOR seja executado durante 5 vezes. 3) Modifique o programa 1c , para que a variavel CONTADOR varie de 0 ate 255. 4) Elabore um programa que faa o pino RB0 ir para 0 durante 1ms e ir para 1 durante 2ms, repetindo isto durante 4 vezes. 5) Elabore um programa que faa o pino RB4 ir para 1 durante 3ms e ir para 0 durente 1 ms, repetindo isto durante 20 vezes. 6) Modifique o programa 1d, para que todos os pinos da PORTB, sejam acionados; 7) Modifique o programa 1d, para que os pinos sejam acionados, no sentido contrario;

4. Instruo IF...THEN...ELSE...ENDIF IF IF ELSE Declarao ENDIF If...Then avalia os termos da comparao p/ verdadeiro ou falso. Se for verdadeiro, a operao aps o Then executada. Se ele resultar em falso, a operao aps o Then no executada. Comparaes que resultem em 0, so consideradas falsas. Qualquer outro valor considerado verdadeiro. Exemplos: If PortA.0 = 0 Then pushd ' Se a pino RA0 for igual ' a zero, salte para o ' rtulo pushd ' Se B0 for diferente de 10, faa ' incrementa B0 ' incrementa B1 Comp {AND/OR Comp...} Comp {AND/OR Comp} Declarao THEN Rotulo THEN

If

B0 <> 10 Then B0 = B0 + 1 B1 = B1 - 1

Endif 1) Simule o programa: a) CHAVE1 CHAVE2 MOTOR1 MOTOR2 VAR VAR VAR VAR PORTD.0 PORTD.1 PORTB.0 PORTB.1

TRISD = %00011111 TRISB = %00000000 INICIO: IF CHAVE1 = 1 MOTOR1 = 1 PAUSE 1 ELSE MOTOR1 = 0 PAUSE 1 ENDIF IF CHAVE2 =1 MOTOR2 = 1 PAUSE 1 ELSE MOTOR2 = 0 PAUSE 1 ENDIF THEN THEN

GOTO INICIO END 2) Modifique o programa acima para controlar 8 motores conectados ao PORTB da seguinte forma: se RD0 = 1 , entao MOTOR1 e MOTOR2 ligados se RD0 = 0 , entao MOTOR1 e MOTOR2 desligados se RD2 = 1, entao MOTOR3 e MOTOR4 ligados se RD2 = 0, entao MOTOR3 e MOTOR4 desligados se RD4 = 1, entao MOTOR5, MOTOR6, MOTOR7, MOTOR8 ligados se RD4 = 0, entao MOTOR5, MOTOR6, MOTOR7, MOTOR8 desligados 3) Simule o programa: CONTADOR VAR BYTE LED VAR PORTC.0 TRISB = %00000000 OUTPUT LED CONTADOR = 0 INICIO: PAUSE 2 CONTADOR = CONTADOR + 1 PORTB=CONTADOR IF CONTADOR = 5 THEN LED = 1 PAUSE 10 LED = 0 ENDIF GOTO INICIO END 4) Modifique o programa 3, para que, se a varivel CONTADOR for maior que 8, ligar o pino RC2 durante 5 milisegundos. 5) Modifique o programa 3, para que, se varivel CONTADOR for igual a 3, ligar o pino RC1 durante 3 milisegundos. 6) Modifique o programa 3, para que se a varivel CONTADOR for igual a 10, ligar o pino RC6 durante 4 milisegundos . e quando a varivel contador for igual a 50, ligar o pino RC7, durante 8 milisegundos.

10

5. Instruo WHILE...WEND

WHILECondio Declarao...... WEND Executa repetidamente "Declarao" enquanto (While) a Condio for verdadeira. Exemplo: i = 1 WHILE i <= 10 'Enquanto i for Serout PortB.7,N2400,["No:", #i,13,10] 'menor ou igual a i = i + 1 'igual a 10,e ' executa.... WEND 1) Simule os programas abaixo: a) SENSOR VAR PORTD.0 TRISD = %00001111 TRISB = %00000000 INICIO: WHILE SENSOR = 0 PORTB.7 = 0 PAUSE 1 PORTB.7 = 1 PAUSE 1 WEND GOTO INICIO END b) CONTADOR SERVO VAR PORTD.2 VAR PORTB.6

TRISD = %00001111 TRISB = %00000000 VOLTA: WHILE CONTADOR != 1 SERVO = 1 WEND SERVO = 0 GOTO VOLTA END

11

c) TRISB = %00000000 WHILE PORTB < 9 PAUSE 2 PORTB = PORTB + 1 WEND END d) TRISD = %00011111 TRISB = %00000000 WHILE PORTD.3 = 0 WHILE PORTD.4 = 0 PORTB = ~PORTB PAUSE 1 WEND WEND END 2) Modifique o programa 1.a, para o Sensor conectado no pino RD2; 3) Modifique o programa 1.b. para o CONTADOR conectado no pico RD4; 4) Modifique o programa 1.c para que a PORTB seja incrementada ate o valor 5 5) Elabore um programa que: a) escrever %00000000 no PORTB b) enquanto o pino RD7 = 0, escrever %01010101 no PORTB 6) Elabore um programa , que, enquanto o pino RD5 = 0, fazer o pino RC0 piscar a cada 1 ms.

12

6. Instruo GOSUB Salta para a subrotina em Rotulo. GOSUB beep ....... ....... beep: High 0 Sound 1,[80,10] Low 0 Return Executa subrotina chamada beep

Ligue o Led ligado em Pin0 Bipe no Alto-falante 'Desliga o Led Volta p/ rotina principal

1) Simule os programas abaixo: a) LAMPADA1 VAR LAMPADA2 VAR LAMPADA3 VAR LAMPADA4 VAR LAMPADA5 VAR

PORTB.7 PORTB.0 PORTB.1 PORTB.2 PORTB.3

TRISB = %00000000

PORTB = %00000000 LAMPADA2 = 1 GOSUB SUBROTINA1 LAMPADA3 = 1 GOSUB SUBROTINA1 LAMPADA4 = 1 GOSUB SUBROTINA1 LAMPADA5 = 1 END SUBROTINA1: PAUSE 1 LAMPADA1 = 1 PAUSE 2 LAMPADA1 = 0 PAUSE 1 RETURN

13

b) CONTADOR PAINEL VAR VAR BYTE PORTB

TRISB = %00000000 PORTB = %00000000

GOSUB GOSUB GOSUB GOSUB END DIREITA:

DIREITA ESQUERDA DIREITA ESQUERDA

PORTB = %10000000 FOR CONTADOR=0 TO 8 PAUSE 1 PORTB = PORTB >> 1 NEXT CONTADOR RETURN ESQUERDA: PORTB = %00000001 FOR CONTADOR=0 TO 8 PAUSE 1 PORTB = PORTB << 1 NEXT CONTADOR RETURN

2)Reescreva o programa abaixo utilizando subrotinas (usando a instruo GOSUB e RETURN) e simule:

14

a) ATUADOR1 ATUADOR2 ATUADOR3

VAR VAR VAR

PORTB.0 PORTB.3 PORTB.7

TRISB = %00000000 PORTB = %00000000 ATUADOR1 PAUSE 1 ATUADOR1 PAUSE 1 ATUADOR2 PAUSE 1 ATUADOR2 PAUSE 1 ATUADOR3 PAUSE 1 ATUADOR3 PAUSE 1 ATUADOR1 PAUSE 1 ATUADOR1 PAUSE 1 ATUADOR2 PAUSE 1 ATUADOR2 PAUSE 1 ATUADOR3 PAUSE 1 ATUADOR3 PAUSE 1 ATUADOR1 ATUADOR2 ATUADOR3 END = 1 = 0 = 1 = 0 = 1 = 0 = 1 = 0 = 1 = 0 = 1 = 0 = 1 = 1 = 1

b) MAQUINA1 MAQUINA2 MAQUINA3 MAQUINA4 MAQUINA5 VAR VAR VAR VAR VAR PORTB.0 PORTB.2 PORTB.4 PORTB.5 PORTB.6

TRISB = %00000000 PORTB = %00000000 HIGH MAQUINA1 PAUSE 1 HIGH MAQUINA2 PAUSE 1 LOW MAQUINA1 LOW MAQUINA2 MAQUINA3 = 1 PAUSE 2 HIGH MAQUINA1

15

PAUSE 1 HIGH MAQUINA2 PAUSE 1 LOW MAQUINA1 LOW MAQUINA2 MAQUINA4 =1 PAUSE 3 HIGH MAQUINA1 PAUSE 1 HIGH MAQUINA2 PAUSE 1 LOW MAQUINA1 LOW MAQUINA2 MAQUINA5 = 1 END 3) Elabore um programa que chame 4 vezes a subrotina DIREITA e 3 vezes a subrotina ESQUERDA do exercicio 1b, e simule:

4) Crie uma subrotina que acione os pinos RB0 e RB1 durante 1ms, e chame esta subrotina 5 vezes;

5) Crie uma subrotina que acione o pino RB7 tres vezes em intervalos de 1ms, e chame esta subrotina 2 vezes;

6) Crie uma subrotina que ative todos os pinos do PORTB durante 2ms e depois desative durane 3ms, e chame esta subrotinha 5 vezes;

7) Quais so as vantagens de se utilizar subrotinas em um programa?

8) Qual a ultima instruo em uma subrotina?

16

7. Exercicios Reviso - Conceitos Bsicos 1) Quantos bits possuem as variveis declaradas, abaixo:

MOTOR_1 SERVIDOR

VAR VAR

BIT BYTE PORTB.6 PORTA.2 WORD

SOLENOIDE VAR RELE ELETRO VAR VAR

2) Classifique as seguintes constantes como Decimal, Binria, Hexadecimal ou Caracteres: Constante 45 100 %00110011 "TIMAO" $BA Tipo Constante %11111111 "2007" 240 $FE %10001111 Tipo 3) Como esto configurados os pinos das portas (entrada ou sada), com os seguintes valores dos registros TRIS:

a) TRISB = %00110001 RB7 RB6 RB5 RB4 b) TRISC = %11100101 RC7 RC6 RC5 RC4

RB3

RB2

RB1

RB0

RC3

RC2

RC1

RC0

4) Simule os programas abaixo: a) LED5 VAR PORTB.5 LED7 VAR PORTB.7 TRISB = %00000000 PORTB = %00000000 LED5 = 1 LED7 = 1 END b) A VAR BYTE TRISB = %00000000 PORTB = %10000000 FOR A = 0 TO 5 PORTB = PORTB >> 1

PORTB =

17

NEXT END c)

PAUSE A

PORTB =

SENSOR2 ROTOR

VAR VAR

PORTD.2 PORTB.0

TRISD = %00011111 TRISB = %00000000 PORTB = %00000000 INICIO: IF SENSOR2 = 1 THEN ROTOR = 1 PAUSE 10 ELSE ROTOR = 0 PAUSE 5 ENDIF GOTO INICIO END d) TEMP LED3 VAR VAR PORTD.1 PORTB.3

PORTB =

TRISD = %00011111 TRISB = %00000000 PORTB = %00000000 INICIO: WHILE TEMP = 1 LED3 = 1 WEND LED3 = 0 GOTO INICIO END 5) Elabore um programa que faa o pino RB4 = 1 e os demais pinos do PORTB iguais a zero: 6) Elabore um programa que faa o pino RB2 ir para 0 durante 2 ms e ir para 1 durante 3 ms, repetindo isto durante 8 vezes. 7) Reescreva o programa abaixo utilizando subrotinas: DINAMO MOTOR SENSOR ALTOFALANTE VAR VAR VAR VAR PORTB.7 PORTB.2 PORTD.0 PORTB.0

18

TRISB = %00000000 DINAMO = 0 MOTOR = 0 PAUSE 2 DINAMO = 1 SOUND ALTOFALANTE,[80,100] DINAMO = 0 PAUSE 3 MOTOR = 1 DINAMO = 1 SOUND ALTOFALANTE,[80,100] DINAMO = 0 PAUSE 1 MOTOR = 0 DINAMO = 1 SOUND ALTOFALANTE,[80,100] DINAMO = 0 PAUSE 10 MOTOR = 1 END 8)Simule o programa abaixo: LEITOR1 LEITOR2 VAR VAR PORTD.1 PORTD.2

TRISD = %00011111 TRISB = %00000000 INICIO: PORTB = %00000000 WHILE LEITOR1 = 0 PORTB.5 PORTB.6 PAUSE 1 PORTB.5 PORTB.6 PAUSE 1 = 1 = 1 = 0 = 0

WEND PAUSE 1 PORTB = %00000001 PAUSE 1 GOTO INICIO END 9) Reescreva o programa 8, para que a instruo while ocorra quando a varivel leitor2 for igual a 1; 10) Elabore um programa (utilizando while): a) Enquando a PORTA = %00001111, fazer o pino RB0 ligar e desligar em intervalos de 1ms . b) Depois, escrever %11111111 no PORTB

19

8. Conectando um LCD em um microcontrolador PIC Um LCD um perifrico inteligente que se comunica com o mundo externo atravs de 8 ou 4 bits. sempre preciso iniciar o display, programando-o. Os mdulos LCD so encontrados em diferentes configuraes, por exemplo: 2 x 16 = 2 linhas por 16 colunas 2 x 20 = 2 linhas por 20 colunas 4 x 20 = 4 linhas por 20 colunas

Os pinos de conexo de um modulo LCD so: Terminal 1 2 3 4 5 6 7 8 9 10 11 12 13 14 Smbolo Vss Vdd Vo RS R/W E D0 D1 D2 D3 D4 D5 D6 D7 Nome e Funo Terra, 0V Alimentao, +5V Ajuste da tenso de contraste Seleo Dados/Controle Leitura/Escrita no LCD Enable Habilitao D0 bit menos significativo (LCD) D1 D2 D3 D4 D5 D6 D7 bit mais significativo (MSB)

Escrevendo em um LCD utilizando o PIC BASIC PRO Para escrever informaes em um mdulo LCD, pode-se utilizar o comando LCDOUT. So enviados comandos ao LCD, deve-se escrever $FE, seguido pelo comando desejado. Alguns comandos teis esto listados na tabela a seguir:

Comando $FE,1 $FE,2 $FE,$0C $FE,$0E $FE,$0F $FE,$10 $FE,$14 $FE,$C0

Operao Limpa o display Retorno (inicio da primeira linha) Cursor desligado Cursor sublinhado ligado Cursor piscante Move o cursor uma posio esquerda Move o cursor uma posio direita Move o cursor para o inicio da segunda linha $FE,$94 Move o cursor para o inicio da terceira linha $FE,$D4 Move o cursor para o inicio da quarta linha Tambem deve-se definir como a conexo do LCD no microcontrolador, utilizando-se comandos DEFINE.

20

1) Simule o programa abaixo: (obs. No se esquea de configurar o modulo LCD na simulao)

RB7 RB6 RB5 RB4


Microcontrolador PIC

D7 D6 D5 D4
LCD

RB1 RB0

RS E R/W GND

DEFINE LCD_DREG PORTB DEFINE LCD_DBIT 4 DEFINE LCD_RSREG PORTB DEFINE LCD_RSBIT 1 DEFINE LCD_EREG PORTB DEFINE LCD_EBIT 0 DEFINE LCD_BITS 4 DEFINE LCD_LINES 2 DEFINE LCD_COMMANDUS 2000 DEFINE LCD_DATAUS 50

;PORTB conectado nas linhas de dados do LCD ;Define o primeiro pino da PORTB conectado no LCD ;Define que o pino RS do LCD esta ligado no PORTB ;Define que o pino RB1 esta ligado no sinal RS do LCD ;Define que o pino E do LCD esta ligado no PORTB ;Define que o pino RB0 esta ligado no sinal E do LCD ;Define o modo de comunicao de 4 bits com o LCD ;Define display de 2 linhas ;Define atraso para envio de comandos para o LCD ;Define atraso para envio de dados para o LCD

INICIO: LCDOUT $FE,1 LCDOUT "OI" PAUSE 1 LCDOUT $FE,$C0 LCDOUT "GENTE AMIGA" goto inicio ;Limpa LCD ;Escreve "OI" no LCD ;Espera 1ms ;Move o cursor para a segunda linha ;Escreve "GENTE AMIGA"

end

21

2) Modifique o programa 1, para escrever seu nome no LCD; 3) Simule o programa abaixo: DEFINE LCD_DREG PORTB DEFINE LCD_DBIT 4 DEFINE LCD_RSREG PORTB DEFINE LCD_RSBIT 1 DEFINE LCD_EREG PORTB DEFINE LCD_EBIT 0 DEFINE LCD_BITS 4 DEFINE LCD_LINES 2 DEFINE LCD_COMMANDUS 2000 DEFINE LCD_DATAUS 50 ;PORTB conectado nas linhas de dados do LCD ;Define o primeiro pino da PORTB conectado no LCD ;Define que o pino RS do LCD esta ligado no PORTB ;Define que o pino RB1 esta ligado no sinal RS do LCD ;Define que o pino E do LCD esta ligado no PORTB ;Define que o pino RB0 esta ligado no sinal E do LCD ;Define o modo de comunicao de 4 bits com o LCD ;Define display de 2 linhas ;Define atraso para envio de comandos para o LCD ;Define atraso para envio de dados para o LCD

CONTADOR VAR BYTE INICIO: LCDOUT $FE,1 LCDOUT "CONTADOR = ",#CONTADOR CONTADOR = CONTADOR + 1 PAUSE 1 GOTO INICIO END 4) Modifique o programa do item 3, para contador de 5 em 5; 5) Mude o tipo da varivel CONTADOR para WORD: CONTADOR VAR WORD O que ocorre com o programa? 6) Elabore um program que mostre as seguintes mensagens em um display LCD : Se o pino RD0 = 1 Mensagem : Servidor Ligado Se o pino RD0 = 0 ;Limpa LCD ;Escreve valor da variavel contador ;Incrementa variavel contador ;Espera 1ms

22

Mensagem : Servidor Desligado

7) Modifique o programa do item 3, para que quando a contagem chegar em 10, escrever no LCD TESTE CONCLUIDO 8) Elabore um programa que, se os pinos RD7 e RD6 estiverem ligados, deve mostrar a mensagem lampadas ligadas, e se os pinos RD7 e RD6 estiverem desligados, deve mostrar a mensagem lmpadas desligadas

23

9. Conectando um display de 7 Segmentos Conectando um display de 7 segmentos no microcontrolador PIC Um display de 7 segmentos tem o seguinte aspecto:

Configurao de um display anodo

Configurao de um display catodo

Pode-se conectar um display de 7 segmentos anodo comum ao PIC 16F84 da seguinte forma:

5 Number 6 0 7 1 8 2 9 3 4

1001 0010 Segments 1000 0010 1100 0000 1111 1000 1111 1001 1000 0000 1010 0100 1001 1000 1011 0000 1001 1001

$92 Hex $82 $C0 $F8 $F9 $80 $A4 $98 $B0 $99

Exemplo para escrever O em um display de 7 segmentos anodo comum: TRISB = %00000000 PORTB = %11000000 'escreve 0 24

1) Para os programas a seguir, considere um display de 7 segmentos tipo anodo comum, conectado ao PORTB do PIC16F84. Explique o que faz cada instruo dos programas abaixo, e simule os programas, indicando o que mostrado no display de 7 segmentos. a) TRISB = %00000000 VOLTA: PORTB = %11000000 PAUSEUS 1 PORTB = %11111001 PAUSEUS 1 PORTB = %10100100 PAUSEUS 1 GOTO VOLTA END b) TRISA = %00011111 TRISB = %00000000 INICIO: IF PORTA.4 = 1 THEN PORTB = %10011001 ELSE PORTB =%00000000 ENDIF GOTO INICIO END c) SENSOR1 VAR PORTA.1 TRISA = %00011111 TRISB = %00000000 VOLTA: PORTB = %00000000

25

WHILE SENSOR1 = 1 PORTB = %11111001 WEND GOTO VOLTA END d) X NUMERO1 VAR VAR BYTE BYTE

TRISB = %00000000 PORTB = %00000000 LOOP: FOR X = 9 TO 0 STEP -1 GOSUB CONVERTE

PORTB = NUMERO1 PAUSE 1 NEXT X

GOTO LOOP CONVERTE: LOOKUP X,[$C0,$F9,$A4,$B0,$99,$92,$82,$F8,$80,$98],NUMERO1 RETURN END 2) Modifique o programa 1a para mostrar no display os simbolos A, be C. 3) Modifique o programa 1b , para que quando o pino RA2 = 1, escrever 2 no display, e quando RA2 = 0 escrever -. 4) Modifique o programa 1c, para que enquanto o pino RA1 = 1, mostre H no display. 5) Modifique o programa 1d, para que mostre os simbolos E,T,E,P,2,0,0,5,E,L 6) Modifique o programa 1d para escrever seu nome 7) modifique os programas 1a, 1b, e 1c para que utilize o hardware abaixo, com um display de 7 segmentos tipo catodo comum, conectado em um PIC 16F876, e simule.

26

10. Conversor A/D Leitura de Tenses Analgicas com o PIC Em muitas aplicaes, pode ser necessrio realizar a leitura de grandezas analgicas do mundo exterior. Normalmente, utilizam-se sensores especiais para converter a grandeza desejada em um nvel de tenso proporcional. Pode-se efetuar a leitura destas tenses por intermdio de um conversor analgico/digital, cuja funo converter a tenso analgica em um nmero binrio, proporcional tenso analgica. Nos conversores A/D, utiliza-se uma tenso de referncia (normalmente chamada de Vref), que serve de fundo de escala para o sinal de sada do conversor, ou seja, as sadas do conversor estaro todas em nvel 1, quando a tenso de entrada do conversor for igual ou maior que a tenso de Vref. Para um conversor A/D com resoluo de 10 bits e tenso de referncia de 5V, o valor de cada bit ser: Valor de cada bit = 5 / (210 1) = 4,8876mV Um resultado igual a 100 (em decimal) , teremos uma tenso de 100 *4,8876mV = 0,48876V Para um conversor A/D com resoluo de 8 bits e tenso de referncia de 5V, o valor de cada bit ser: Valor de cada bit = 5 / (28 1) = 19,61mV Um resultado igual a 100 (em decimal), teremos uma tenso de 100 * 0,01961V = 1,961V Modulo conversor A/D do PIC 16F877 O mdulo conversor A/D do PIC 16F877 tem 8 canais como mostra a figura abaixo:

27

Instruo ADCIN

ADCIN

Canal, Var

A instruo ADCIN le o "canal" do conversor a/d e armazena o resultado na varivel "Var". Antes de ADCIN ser usada, deve-se fazer as seguintes operaes: a) Definir como sera feita a converso utilizando "DEFINE" b) o registro TRIS deve ser ajustado, para que o pino utilizado seja configurado como entrada. c) configurar o Registro ADCON1 Exemplo1: Leitura do canal 0 (RA0): LEITURA VAR BYTE DEFINE DEFINE DEFINE ADC_BITS 8 ADC_CLOCK 3 ADC_SAMPLEUS 50

'define uma varivel de 8 bits 'ajusta numero de bits do conversor A/D 'ajusta fonte de clock 'ajusta o tempo de amostragem em us

TRISA = %11111111 TRISB = %00000000 ADCON1 = %00000010 ADCIN 0,LEITURA PORTB = LEITURA END

' PORTA como entrada 'PORTB como sada 'PORTA como entrada analgica ' Le canal 0 (RA0) e armazena na varivel Leitura ' Escreve Leitura no PORTB

As configuraes do registro ADCON1 esto mostradas abaixo:

28

O bit 7 de ADCON1 controla se o resultado e justificado para a direita ou para a esquerda, como mostra a figura:

Resultados de 8 bits, devem ser justificados para a esquerda (ADCON1.7 = 0). Resultados de 10 bits, devem ser justificados para a direita (ADCON1.7 = 1). Exemplo 2: Leitura do canal 0, mostrando o resultado no PORTD: DEFINE DEFINE DEFINE CONVERSOR ADC_BITS ADC_CLOCK ADC_SAMPLESUS VAR 8 3 50 ' ajusta nmero de bits do conversor A/D ' ajusta fonte de clock ' ajusta o tempo de amostragem em us

BYTE

TRISA = %11111111 TRISD = %00000000 ADCON1 = %00000010 INICIO: ADCIN 0,CONVERSOR

PORTD = CONVERSOR PAUSE 1 GOTO INICIO

29

Para os exercicios abaixo, faa os programas para o PIC 16F877, anote os programas e simule. 1) Modifique o exemplo1, para ler o canal 2 (RA2) e mostrar o resultado no PORTC; 2) Modifique o exemplo2, para ler o canal 7 (RE2) e mostrar o resultado no PORTB; 3) Modifique o exemplo 2, para ler o canal 3 e mostrar o resultado no PORTD, e para ler o canal 6 e mostrar o resultado no PORTB; 4) Explique o que faz cada intruo dos programas abaixo, e simule o programa, indicando o valor do PORTB aps executa-los: DEFINE DEFINE DEFINE ADVAL ADC_BITS ADC_CLOCK ADC_SAMPLESUS VAR WORD 10 3 50 ' ajusta nmero de bits do conversor A/D ' ajusta fonte de clock ' ajusta o tempo de amostragem em us

TRISA = %11111111 TRISB = %00000000 ADCON1 = %10000010 INICIO: ADCIN IF 0,ADVAL TESTE2

ADVAL > 200 THEN

PORTB = %00000001 GOTO INICIO TESTE2: IF ADVAL > 400 THEN TESTE3

PORTB = %00000011 GOTO INICIO TESTE3: IF ADVAL > 600 THEN TESTE4

PORTB = %00000111 GOTO INICIO TESTE4: IF ADVAL > 800 THEN TESTE5

PORTB = %00001111 GOTO INICIO TESTE5: PORTB = %00011111

30

GOTO INICIO END 5) Modifique o programa 4, para o conversor trabalhar com 8 bits; 6) Explique o que faz cada instruo dos programas abaixo, e simule o programa: 'Define parametros do display LCD DEFINE DEFINE DEFINE DEFINE DEFINE DEFINE DEFINE DEFINE DEFINE DEFINE LCD_DREG LCD_DBIT LCD_RSREG LCD_RSBIT LCD_EREG LCD_EBIT LCD_BITS LCD_LINES LCD_COMMANDUS LCD_DATAUS PORTD 4 PORTD 0 PORTD 1 4 2 2 5

'Define parametros do conversor A/D DEFINE DEFINE DEFINE ADC_BITS ADC_CLOCK ADC_SAMPLEUS VAR VAR 10 3 50 WORD WORD ' ajusta numero de bits do conversor A/D ' ajusta fonte de clock (3=rc) ' ajusta tempo de amostragem em microssegundos

LEITURA_AD LEITURA_MV

TRISA = %111111111 ADCON1 = %10000010

LCDOUT LCDOUT INICIO: ADCIN

$FE,1 "VALOR DO A/D"

' LIMPA DISPLAY

0,LEITURA_AD

LEITURA_MV = LEITURA_AD * 5 LCDOUT LCDOUT LCDOUT LCDOUT PAUSE 2 $FE,$C0 " $FE,$C0 #LEITURA_AD,"

" ",#LEITURA_MV,"mV"

GOTO INICIO END

31

7) Modifique o programa 5 para o conversor A/D trabalhar com 8 bits; 8)Elabore um programa para ler o canal 1 do conversor A/D, e quando a tenso for maior que 2V, ligar o pino RB7 9)Elabore um programa para ler os canais 0 e 3 do conversor A/D, e quando a tenso do canal 0 for maior que a tenso do canal 3, ligar o pino RC0; 10) Elaborar um programa para indicar em um display de 7 segmentos a tenso no canal 2 do conversor A/D , e desenhe o hardware. 11)Elaborar um programa para mostrar em um display LCD os valores dos canais 0 e 1; 12)Elaborar um programa para mostrar em um display LCD as seguintes mensagens: a) quando a tenso do canal 4 do a/d for menor que 2V, escrever :"Sinal Baixo" b) quando a tenso do canal 4 for maior ou igual a 2V, escrever:"Sinal Alto"

32

11. Comunicao Serial Comunicao Serial com o PIC possivel realizar a comunicao entre um microcontrolador e um PC atraves da porta serial, utilizando o circuito de interfae MAX232, como mostrado abaixo:

A comunicao realizada de forma serial e assincrona, e os sinais tem niveis RS232 como mostra a figura. Para se realizar uma comunicao serial utilizando a linguagem PICBASIC, podem ser utilizadas duas instrues: SEROUT Pino,Modo,[item, item, ....] para enviar um ou mais itens ao Pino indicado em formato assincrono padro usando 8 bits de dados, sem paridade e um stop bit (8N1).

SERIN Pino,Modo,(qual,qual),(#)item,item,... para receber um ou mais itens no Pino no fomato assncrono padro usando 8 bits de dados, sem paridade e um stop bit (8N1). A opo Modo definida no arquivo MODEDEFS.BAS. Para usa-lo, adicione a linha : INCLUDE "modedefs.bas" Modo T2400 T1200 T9600 T300 N2400 N1200 N9600 N300 Baud Rate 2400 1200 9600 300 2400 1200 9600 300 Estado Verdadeiro Verdadeiro Verdadeiro Verdadeiro Verdadeiro Invertido Invertido Invertido

Um valor numrico (uma variavl ou uma constante) ir enviar o caracter ASCII correspondente: 13 - retorno a primeira coluna 10 - avano de linha

33

Um valor nmerico precedido por um (#) , ir enviar a representao ASCII de seu valor decimal Por exemplo: se W0 =123, entao #W0 (ou #123) enviar : ' 1' , ' 2' , '3' . 1) Simule e explique o programa: INCLUDE "modedefs.bas" DEFINE CHAR_PACING 500 TX var PORTC.6 INICIO: SEROUT TX,T2400,["Oi pessoal!!!",13,10] GOTO INICIO END

2) Modifique o programa 1, para enviar serialmente, a mensagem "Sou uma pessoa Feliz!!!!".

3) Modifique o programa 1, para enviar serialmente, a mensagem " Sou um Processador Feliz!!!!", com a velocidade de 9600 bps. 4) Modifique o programa 1, para enviar serialmente, a mensagem "TIMAO" somente 5 vezes.

5) Simule e explique o programa: INCLUDE "modedefs.bas" DEFINE CHAR_PACING 500

RX var PORTC.7 VALOR var BYTE TRISB = %00000000 INICIO: SERIN RX,T2400,VALOR serialmente

;aguarda at que o caracter seja recebido ; e armazena na variavel VALOR

PORTB = VALOR PAUSE 1 GOTO INICIO END

34

6) Modifique o programa 5, para trabalhar com uma velocidade de 300bps:

7) Simule e explique o programa: INCLUDE "modedefs.bas"

DEFINE CHAR_PACING 500

RX var PORTC.7 B2 var BYTE TRISB = %00000000 INICIO: SERIN RX,T2400,["A"],B2 serialmente variavel B2 PORTB = B2 PAUSE 1 GOTO INICIO END

;aguarda at que o caracter "A" seja recebido ;e depois armazena o proximo valor recebido na

8) Modifique o programa para que aguarde o caracter "W" para depois armazenar o proximo valor recebido. 9) Simule e explique o programa: INCLUDE "modedefs.bas" DEFINE CHAR_PACING 500 SAIDA var PORTC.6 CONTADOR var BYTE TRISB = %00000000 CONTADOR = 0 INICIO: PORTB = CONTADOR CONTADOR = CONTADOR + 1 SEROUT SAIDA,T9600,["contador= ",#CONTADOR, 13, 10] PAUSE 1 GOTO INICIO END

35

10) Modifique o programa 9, para que a contagem ocorra de 5 em 5 unidades (0...5....10..)

11) Modifique o programa 9, para que a contagem comee com 200, e decresca de 2 em 2 (200...198....196)

12) Simule e explique o programa: INCLUDE "modedefs.bas" DEFINE OSC 4 CHAVE0 var PORTD.0 TX var PORTC.6 TRISD = %00011111 VAI: IF CHAVE0 = 1 THEN

SEROUT TX,T2400,["CHAVE0 LIGADA", 13, 10] PAUSE 1 ELSE SEROUT TX,T2400,["CHAVE0 DESLIGADA", 13, 10] PAUSE 1 ENDIF GOTO VAI END 13) Modifique o programa 12, para que : a) se CHAVE0 = 1 , enviar serialmente "INICIO DO PROCESSO" b) se CHAVE0 = 0 , enviar serialmente "TERMINO DO PROCESSO" 14) Modifique o programa 12, para que leia o estado de 3 sensores e enviar serialmente uma mensagem relatando o estado de cada sensor, se esta ligado ou desligado.

15) Simule e explique o programa: INCLUDE "modedefs.bas"

RX var PORTC.7 TX VAR PORTC.6 B0 var BYTE

INICIO: SERIN RX,T2400,B0 IF (B0 < "a") or (B0 > "z") then IMPRIMA

36

B0 = B0 - $20

IMPRIMA: SEROUT TX,T2400,[B0]

GOTO INICIO END

16) Modifique o programa 15, para que caso seja recebido o caracter "q" ou "s", envie a mensagem "TERMINO" se for recebido outro caracter, enviar a mensagem "PROCESSANDO". 17) Simule e explique o programa: Include "modedefs.bas" SO B0 B1 loop: VAR var var PORTB.6 byte byte

For B0 = 3 To 1 Step -1 For B1 = 0 To 10 Step B0 Serout SO,T2400,[#B1," "] Next B1 Serout SO,T2400,[13,10] Pause 1 Next B0 Goto loop

18) Modifique o programa 17 para efetuar a contagem ate 20 19) Simule e explique o programa: include "modedefs.bas" B10 TX loop1: Pause 1 B10 = B10 + 1 Select Case B10 Case 1 SEROUT TX,T2400,["loop1 case 1",10,13] Case 2 SEROUT TX,T2400,["loop1 case 2",10,13] VAR VAR BYTE PORTC.0

37

Case 4 SEROUT TX,T2400,["loop1 case 4",10,13] Case is >5 Clear SEROUT TX,T2400,[10,13] GoTo loop2 Case is >2 SEROUT TX,T2400,["loop1 case 3,5",10,13] END SELECT GoTo loop1

loop2:

Pause 1 B10 = B10 + 1 Select Case B10 Case 1 SEROUT TX,T2400,["loop2 case 1",10,13] Case 2 SEROUT TX,T2400,["loop2 case 2",10,13] Case 4 SEROUT TX,T2400,["loop2 case 4",10,13] Case is <6 SEROUT TX,T2400,["loop2 case 3,5",10,13] Case Else Clear SEROUT TX,T2400,[10,13] GoTo loop1 END SELECT GoTo loop2

20) Simule e explique o programa: include "modedefs.bas" DEFINE CHAR_PACING 500 SO B0 B1 B2 EEPROM EEPROM VAR var var var PORTB.1 byte byte byte ' EEPROM[0..3] = 119..122 ' EEPROM[8] = 100

["wxyz"] 8,[100]

loop: B0 = 63 For B1 = 10 To B0 B2 = B1 + 100

' tamanho da memoria EEPROM ' EEPROM[10..63] = 110..163

38

Write B1,B2 Next B1 For B1 = 0 To B0 Read B1,B2 Serout SO,T2400,[#B2," "] Next B1 Serout SO,T2400,[13,10,13,10] Goto loop 21) Simule e explique o programa: include "modedefs.bas" DEFINE CHAR_PACING 500 SO VAR PORTB.1 SI VAR PORTB.0 B0 var byte B1 var byte loop: Serin SI,T2400,B0 B1 = 255 Lookdown B0,["0123456789ABCDEF"],B1 If B1 = 255 Then loop Serout SO,T2400,[#B1,13,10] Goto loop

39

12. Utilizando a memria EEPROM interna do PIC

Utilizando a memria EEPROM interna do PIC O PIC 16F877 possui uma memria EEPROM (Electrically Erasable Programmable Read-Only Memory) que pode ser utilizada como memria de dados. Sua principal vantagem em relao a RAM esta no fato de no perder as informaes com a falta de alimentao. Sua principal utilizao esta nos sistemas que devem memorizar dados como o ltimo nmero discado em telefones, ajustes de som, cor, brilho, e outros em televisores, memria das estaes nos rdios, cdigos personalizados de acesso, entre vrias outras possibilidades. No PICBASIC, existem duas instrues para acessar a memria EEPROM interna: WRITE endereo, valor READ endereo, VAR em VAR ; escreve um valor na memria EEPROM interna do PIC ; l o contedo de um endereo da EEPROM interna e armazena

1) Simule e explique o programa, quais endereos da EEPROM so acessados, e que valores so escritos? VAR1 VAR BYTE TRISB = %00000000 VAR1 = 09 WRITE $20,VAR1 PAUSE 1 READ $20,PORTB END ;escreve o contedo de VAR1 no endereo 20h da ;EEPROM ;espera 1ms ;le o contedo do endereo 20h da memria ;EEPROM, e transfere para PORTB ;fim do programa ;define varivel VAR1 ;configura PORTB como sada

2) Simule e explique o programa, quais endereos da EEPROM so acessados, e que valores so escritos? B0 VAR BYTE B1 VAR BYTE B2 VAR BYTE TRISB = %00000000 INICIO: WRITE 0,5 WRITE 1,6 WRITE 2,7 READ 0,B0 READ 1,B1 READ 2,B2 PORTB PAUSE PORTB PAUSE PORTB = B0 1 = B1 1 = B2

40

WRITE WRITE WRITE PAUSE

0,0 1,0 2,0 1

GOTO INICIO END 3) Elabore um programa para escrever os nmeros de 20 a 25 na memria EEPROM do PIC;

4) Elabore um programa para armazenar seu pronturio, a data do seu nascimento a partir do endereo 10h da memria EEPROM do PIC;

5) Elabore um programa : a) Primeiro, armazene o valor 01233438 na memria EEPROM; b) Depois mostre cada digito em um display LCD

6) Modifique o programa 5, para a data de hoje, completa (dd/mm/aaaa);

7) Elabore um programa para armazenar seu nome completo na memria EEPROM e depois mostre no display de LCD;

8) Elabore um programa para armazenar os nmeros de 0 a 100 na memria EEPROM e depois leia estes valores e transmita serialmente por um pino do PIC;

9) Elabore um programa para preencher toda a memria EEPROM com o valor 01h;

10) Simule o programa abaixo e explique seu funcionamento: VAR1 VAR BYTE

TRISB = %00000000 INICIO: RANDOM VAR1

WRITE 0,VAR1 PORTB = var1 GOTO INICIO END 11) Pesquise quantas posies de memria tem o PIC 16F877 e elabore um programa para escrever AAh em todos os endereos da EEPROM;

41

12) Elabore um programa para escrever valores entre 0 e 255 aleatoriamente na memria EEPROM em todos os endereos;

13) Elabore um programa para para preencher 10 posies de memria EEPROM com valores aleatrios, e depois, leia estes endereos e escreva no PORTB; 14) Elabore um programa: a) Se Pino RD1 = 1 preencher a memria EEPROM com 02h, e escrever no LCD , MEMORIA OK b) Se Pino RD1 = 0 preencher a memria EEPROM com 20h, e escrever no LCD, MEMORIA RUIM

42

13. Instruo PWM O comando PWM tem a seguitnte sintaxe: PWM Pin. Duty, Cycle

Este comando usado para gerar uma seqncia de pulsos modulados em largura (Pulse Width Modulation),em um pino de sada Pin. Cada ciclo de modulao consiste de 256 pontos. O Duty Cycle para cada ciclo de PWM inicia em 0 (0%) at 255 (100%). Este ciclo de PWM repetido quantas vezes for definido no parmetro Cycle. O tempo alcanado com o uso do parmetro Cycle do comando PWM dependente da freqncia do oscilador utilizado Oscilador 4MHz 20MHz Durao (Cycle) ~ 5ms ~ 1ms

1) Simule o programa, e verifique o estado do pino de sada do PWM com o osciloscpio do simulador: SAIDA VAR PORTB.7 CICLO_DE_TRABALHO OUTPUT SAIDA CICLO_DE_TRABALHO = 10 PWM SAIDA,CICLO_DE_TRABALHO,1 ;Produz uma seguencia de pulsos PWM, com duty ;cycle definido pela varivel CICLO_DE_TRABALHO, ;no PINO RB7, por 1 ciclo VAR BYTE

END 2) Modifique o programa 1, utilizando os seguintes valores para a varivel CICLO_DE_TRABALHO: CICLO_DE_TRABALHO FORMA DE ONDA 10 50 100 127 150 200 255 3) Modifique o programa 1, para que a sada do PWM seja o pino RD0; 4) Elabore um programa que: Se pino RC0 = 1 e RC1 = 0 e RC2 = 0, PWM de 20% no pino RB3 Se pino RC1 = 1 e RC0 =0 e RC2 = 0, Se pino RC2 = 1 e RC0= 0 e RC1 = 0, PWM de 50% no pino RB4 PWM de 80% no pino RB6

5) Elabore um programa para gerar um PWM no pino RD1, que tenha tenha um ciclo de trabalho de 0% a 100% 6) Elabore um programa para gerar um PWM no pino RB2, que tenha um ciclo de trabalho de 60% a 0%. 7) Altere o programa 5, para mostrar em um LCD, qual o ciclo de trabalho do PWM

43

14. Controle de um motor de passo utilizando o microcontrolador PIC


Motores de passo so dispositivos mecnicos eletro-magnticos que podem ser controlados digitalmente atravs de um hardware especifico ou atravs de softwares. So usados em equipamentos onde a preciso um fator muito importante. So usados em larga escala em impressoras, plotters, scanners, drivers de disquetes, discos rgidos e muitos outros aparelhos. Para realizar o controle de um motor de passo preciso energizar as bobinas do motor de forma correta, para se obter o movimento desejado. Pode-se controlar o motor de 3 formas: a) Passo Completo 1 (Full-step) # Somente uma bobina energizada a cada passo; #Menor torque; #Pouco consumo de energia; # Maior velocidade. No do passo Bobina Decimal A B C D 1 1 0 0 0 8 2 0 1 0 0 4 3 0 0 1 0 2 4 0 0 0 1 1 b) Passo Completo 2 (Full-step) # Duas bobinas so energizadas a cad passo; # Maior torque; #Consume mais energia que o passo completo 1; # Mairo velocidade. No do passo 1 2 3 4 A 1 0 0 1 Bobina B C 1 0 1 1 0 1 0 0 Decimal D 0 0 1 1 12 6 3 9

c) Meio passo (Half-step) # A combinao do passo completo 1 e do passo completo 2 gera um efeito de meio passo; # Consome mais energia que os passos anteriores; # muito mais preciso que os passos anteriores; # O torque prximo ao do Passo completo 2; # A velocidade menor que as dos passos anteriores. No do passo 1 2 3 4 5 6 7 8 A 1 1 0 0 0 0 0 1 Bobina B C 0 0 1 0 1 0 1 1 0 1 0 1 0 0 0 0 Decimal D 0 0 0 0 0 1 1 1 8 12 4 6 2 3 1 9

44

Exemplo 1 : Controle de um motor de passo com Passo Completo 1 (Full step): ; ; ; ; ; ; ; ; Controle de um motor de passo PIC 16F877 Passo Completo 1 (Full step) Motor ligado no PORTC Bobina A - pino RC3 Bobina B - pino RC2 Bobina C - pino RC1 Bobina D - pino RC0

Passo 1

TRISC = %00000000 INICIO: PORTC = %00001000 PAUSE 1 PORTC = %00000100 PAUSE 1 PORTC = %00000010 PAUSE 1 PORTC = %00000001 PAUSE 1 GOTO INICIO END

;PORTC como saida

;passo 1

Passo 2
;passo 2

;passo 3

;passo 4

Passo 3

Passo 4

45

Exemplo 2 : Controle de um motor de passo com Passo Completo 2 (Full step): ; ; ; ; ; ; ; ; Controle de um motor de passo Passo Completo 2 (Full-step) PIC 16F877 Motor ligado no PORTC Bobina A - pino RC3 Bobina B - pino RC2 Bobina C - pino RC1 Bobina D - pino RC0

Passo 1

TRISC = %00000000 INICIO: PORTC = %00001100 pause 1 PORTC = %00000110 PAUSE 1 PORTC = %00000011 PAUSE 1 PORTC = %00001001 PAUSE 1 GOTO INICIO END

;PORTC como saida

;passo 1

Passo 2

;passo 2

;passo 3

;passo 4

Passo 3

Passo 4

Exemplo 3 : Controle de um motor de passo com Meio passo (Half step): ; Controle de um motor de passo ; Meio passo (Half-step) ; PIC 16F877

Passo 1

46

; ; ; ; ;

Motor ligado no Bobina A - pino Bobina B - pino Bobina C - pino Bobina D - pino

PORTC RC3 RC2 RC1 RC0 ;PORTC saida ;limpa PORTC

TRISC = %00000000 PORTC = %00000000 inicio: PORTC = %00001000 pause 1 PORTC = %00001100 PAUSE 1 PORTC = %00000100 PAUSE 1 PORTC = %00000110 PAUSE 1 PORTC = %00000010 PAUSE 1 PORTC = %00000011 PAUSE 1 PORTC = %00000001 PAUSE 1 PORTC = %00001001 PAUSE 1 GOTO INICIO END

Passo 2
;passo 1

;passo 2

;passo 3

;passo 4

Passo 3

;passo 5

;passo 6

;passo 7

Passo 4
;passo 8

47

A direo (esquerda/direita) de um motor de passo Para mudar a direo de rotao do motor, simplesmente inverta a seqncia dos passos conforme os exemplos abaixo: Passo completo 1 (direita) No do passo A 1 1 2 0 3 0 4 0

Bobina B C 0 0 1 0 0 1 0 0

Decimal D 0 0 0 1 8 4 2 1

Passo completo 1 (esquerda) No do passo Bobina A B C 1 0 0 0 2 0 0 1 3 0 1 0 4 1 0 0

Decimal D 1 0 0 0 1 2 4 8

Exemplo 4 : Direita - Esquerda ; Controle de um motor de passo PIC 16F877 ; direita/esquerda (Full-step) ; Motor ligado no PORTC ; Bobina A - pino RC3 ; Bobina B - pino RC2 ; Bobina C - pino RC1 ; Bobina D - pino RC0 TRISC = %00000000 INICIO: PORTC = %00001000 PAUSE 1 PORTC = %00000100 PAUSE 1 PORTC = %00000010 PAUSE 1 PORTC = %00000001 PAUSE 5 PORTC = %00000001 PAUSE 1 PORTC = %00000010 PAUSE 1 PORTC = %00000100 PAUSE 1 PORTC = %00001000 PAUSE 1 GOTO INICIO END ;PORTC como saida

;passo 1 ;passo 2 ;passo 3 ;passo 4

48

Construindo o hardware para conectar o motor de passo no microcontrolador

Para acionarmos um motor de passo, precisamos de um hardware especifico,chamado driver:

Microcontrolador

Driver

Motor

Pode-se construir drivers utilizando transistores de potncia como o BD135, TIP 31, etc. A maneira mais fcil adquirir drivers prontos, como o ULN2003 ou ULN2803, que nada mais so que arrays de transistores Darlington que podem controlar correntes de at 500mA, que esto em forma de circuitos integrados prontos para serem usados em interfaces que necessitem controlar motores de passos, solenides, reles, motores DC e muitos outros dispositivos. O CI ULN2003 tem 7 entradas que podem controlar at 7 saidas. O CI ULN2803 tem 8 entradas que podem controlar at 8 sadas. Com ele podemos controlar ate 2 motores de passo simultaneamente.

Exerccios: 1) Modifique o exemplo 1, para que o motor de passo seja acionado pela PORTB: Bobina A : Pino RB7 Bobina B: Pino RB6

49

Bobina C: Pino RB5 Bobina D: Pino RB4 2) Modifique o exemplo 2, para que o motor de passo, realize 2 rotaes completas 3)Modifique o exemplo 3, para que o motor de passo realize 3 rotaes completas 4) Modifique o exemplo 4, para que o motor de passo realize: a) 2 rotaes para a direita, depois, b) 3 rotaes para a esquerda, depois, c) 1 rotao para a direita

5) Simule o programa abaixo e explique o que faz, quantas vezes o motor completa uma rotao completa? ; ; ; ; ; ; ; ; Controle de um motor de passo Passo Completo 1 (Full-step) PIC 16F877 Motor ligado no PORTC Bobina A - pino RC3 Bobina B - pino RC2 Bobina C - pino RC1 Bobina D - pino RC0 CONTADOR VAR BYTE TRISC = %00000000 ;PORTC como saida STEP 1 ;passo 1 ;passo 2 ;passo 3 ;passo 4

for CONTADOR =0 TO 2 PORTC pause PORTC PAUSE PORTC PAUSE PORTC PAUSE = 1 = 1 = 1 = 1 %00001000 %00000100 %00000010 %00000001

NEXT CONTADOR END 6) Modifique o exemplo 5, para que o programa realize 9 rotaes completas 7) Modifique o exemplo 5 para que o programa realize 10 rotaes para a direita e 10 rotaes para esquerda 8) Modifique o exemplo 5, para que o programa realize 20 rotaes (utilize a instruo FOR); 9) Simule o programa abaixo, e explique: ; ; ; ; ; ; Controle de um motor de passo Passo Completo 1 (Full-step) PIC 16F877 - Motor ligado no PORTC Bobina A - pino RC3 Bobina B - pino RC2 Bobina C - pino RC1

50

; Bobina D - pino RC0 CHAVE0 VAR PORTB.0 TRISB = %11111111 TRISC = %00000000 INICIO: if CHAVE0 = 1 THEN = 1 = 1 = 1 = 1 = 1 = 1 = 1 = 1 %00001000 %00000100 %00000010 %00000001 ;passo 1 ;passo 2 ;passo 3 ;passo 4 ;PORTB como entrada ;PORTC como saida

PORTC PAUSE PORTC PAUSE PORTC PAUSE PORTC PAUSE ELSE PORTC pause PORTC PAUSE PORTC PAUSE PORTC PAUSE ENDIF

%00000001 %00000010 %00000100 %00001000

;passo 1 ;passo 2 ;passo 3 ;passo 4

GOTO INICIO END 10) Modifique o exemplo 9, para que: a) Se o PINO RB7 = 1, girar para a esquerda b) Se o PINO RB6 = 1, girar para a direita 11) Simule o programa abaixo, e explique: X NUMERO1 VAR VAR BYTE BYTE

TRISB = %00000000 TRISC = %00000000 PORTB = %00000000 FOR X = 0 TO 9 STEP 1 GOSUB CONVERTE PORTB = NUMERO1 PORTC = %00001000 ;passo 1 pause 1 PORTC = %00000100 ;passo 2 PAUSE 1 PORTC = %00000010 ;passo 3

51

PAUSE 1 PORTC = %00000001 PAUSE 1 NEXT CONVERTE: X

;passo 4

LOOKUP X,[$C0,$F9,$A4,$B0,$99,$92,$82,$F8,$80,$98],NUMERO1 RETURN END

12) Modifique o exemplo 11, para que o motor gire 5 vezes apenas 13) Modifique o exemplo 11, para que o motor gire no sentido contrario (esquerda) 14) Elabore um programa que gire cinco vezes para a direita e 5 vezes para a esquerda, e enquanto o motor estiver girando para a direita mostra d no display e mostrar e, enquanto o motor estiver girando para a esquerda. 15) Simule o programa abaixo e explique: DEFINE DEFINE DEFINE DEFINE DEFINE DEFINE DEFINE DEFINE DEFINE DEFINE LCD_DREG PORTB LCD_DBIT 0 LCD_RSREG PORTB LCD_RSBIT 6 LCD_EREG PORTB LCD_EBIT 7 LCD_BITS 4 LCD_LINES 2 LCD_COMMANDUS 2000 LCD_DATAUS 50

CONTADOR VAR BYTE TRISC = %00000000 PORTC = %00000000 ;PORTC saida ;limpa PORTC

Lcdout $fe, 1 Lcdout "MOTOR DE PASSO"

52

FOR CONTADOR = 0 to 20 step 1 LCDOUT $FE,$C0 LCDOUT "ROTACAO = ", #CONTADOR PORTC pause PORTC PAUSE PORTC PAUSE PORTC PAUSE PORTC PAUSE PORTC PAUSE PORTC PAUSE PORTC PAUSE = 1 = 1 = 1 = 1 = 1 = 1 = 1 = 1 %00001000 %00001100 %00000100 %00000110 %00000010 %00000011 %00000001 %00001001 ;passo 1 ;passo 2 ;passo 3 ;passo 4 ;passo 5 ;passo 6 ;passo 7 ;passo 8

NEXT CONTADOR END 16) Modifique o exemplo 15, para que o motor gire 50 vezes 17) Modifique o exemplo 15, para que o motor gire 1000 vezes para a direita e 1000 vezes para a esquerda. Mostrar no LCD Rot. Para Dir =. Rot . para Esq=

53

15. Utilizando Interrupes A interrupo uma tcnica particular do PIC que permite interceptar eventos externos ao programa em execuo, interrompe momentaneamente a operao do programa em andamento, controla o evento com uma subrotina apropriada e retorna para a execuo do programa.

O PIC16F84 contm 4 tipos de interrupo: 1. A troca de estado em RB0 (External interrupt RB0/INT pin). 2. Ao final da contagem do registro TMR0 (TMR0 overflow interrupt). 3. A troca de estado sobre uma das linhas de RB4 a RB7 (PORTB change interrupts). 4. Ao final da escrita sobre um endereo da EEPROM (EEPROM write complete interrupt). Habilitando interrupes A interrupo de qualquer um destes eventos pode ser conseguido habilitando ou desabilitando bits do registro INTCON: 1. INTE (bit 4) se este bit estiver em 1 habilitar a interrupo de troca de estado sobre a linha RB0 2. T0IE (bit 5) se este bit estiver em 1 habilitar a interrupo de final de contagem do registro TMR0 3. RBIE (bit 3) se este bit estiver em 1 habilitar a interrupo de troca de estado sobre uma das linhas de RB4 a RB7 4. EEIE (bit 6) se este bit estiver em 1 habilitar a interrupo de final de escrita sobre um endereo da EEPROM 5. GIE (bit 7) este bit tem que estar em 1 para habilitar qualquer interrupo (Global INterrupt Enable bit) Dado que qualquer interrupo gera uma chamada do endereo 04H, no registro INTCON estar qual interrupo foi gerada. No registro INTCON se tem: 1. INTF (bit 1) Se vale 1 a interrupo um estado gerado na troca de estado em RB0. 2. T0IF (bit 2) Se vale 1 a interrupo um estado gerado no termino da contagem do timer TMR0. 3. RBIF (bit 0) Se vale 1 a interrupo um estado gerado na troca de estado de uma dos pinos RB4 a RB7. Obs.: Como no tem um bit especificando interrupo de fim de esrita na EEPROM, a rotina para tratar essa interrupo deve verificar se os outros bits de sinalizao de interrupo esto em 0. A rotina de interrupo deve zerar o bit sinalizador aps tratar a interrupo. Quando for gerada uma interrupo o PIC desabilita automatimamente o bit GIE (global Interrupt Enable) do registro INTECON de modo a desbilitar todas as interrupes restantes. Para poder retornar ao programa principal e reinicializar em 1 este bit deve-se utilisar a instruo em assembler RETFIE. Mais informaes: http://www.dpi.ufv.br/disciplinas/inf251/files/processadores/cursopic/node1.html

54

Utilizando interrupes com o PICBASIC Para se utilizar interrupes com o PICBASIC deve-se utilizar a seguinte estrutura: ON INTERRUPT GOTO minha_interrupcao rotina de atendimento de interrupo minha_interrupo habilita interrupo no pino RB0

INTCON = %10010000 ..... DISABLE minha_interrupcao: LED = 1 RESUME ENABLE Interrupo utilizando o pino RBO/INT 1) Simule o programa e explique seu funcionamento: CHAVE0 LED7 VAR VAR PORTB.0 PORTB.7

desabilita interrupo

retorna para o programa principal habilita interrupes

TRISB = %00000001 ON INTERRUPT GOTO INTERRUPCAO INTCON = %10010000 OPTION_REG.6 = 1 LOOP: LED7 = 1 GOTO LOOP

'configura RB0 como entrada 'define rotina de interrupao 'habilita interrupao INTE 'na subida do sinal

'faz pino RB7 = 1 ' para sempre

'subrotina de atendimento de interrupao DISABLE 'desabilita interrupcoes INTERRUPCAO: 'caso ocorra uma interrupcao LED7 = 0 'faz RB7 =0 PAUSE 10 ' espera 10ms INTCON.1 = 0 'limpa flag de interrupcao RESUME ENABLE 'retorna para o programa principal END Interrupo utilizando a mudana dos pinos RB4-RB7 2) Simule o programa e explique seu funcionamento: CHAVE7 LED1 VAR VAR PORTB.7 PORTB.1

55

TRISB = %11110001 ON INTERRUPT GOTO INTERRUPCAO INTCON = %10001000 LOOP:

'configura RB7-RB4

como entradas

'define rotina de interrupao 'habilita interrupao RB4-RB7

LED1 = 1 'faz pino RB1 = 1 GOTO LOOP ' para sempre 'subrotina de atendimento de interrupao DISABLE 'desabilita interrupcoes INTERRUPCAO: LED1 = 0 PAUSE 10 INTCON.0 = 0 RESUME ENABLE END 'caso ocorra uma interrupcao 'faz RB1 =0 ' espera 10ms 'limpa flag de interrupcao 'retorna para o programa principal

Interrupo como o overflow do TIMER 0 (pino RA4/T0CK) 3) Simule o programa abaixo e explique seu funcionamento: CHAVE0 LED1 VAR VAR PORTB.0 PORTB.1 'configura PORTB como saida 'define rotina de interrupao 'na subida do sinal 'habilita interrupao TOIE

TRISB = %00000000 ON INTERRUPT GOTO INTERRUPCAO TMR0 = 250 OPTION_REG.5 = 1 INTCON = %10100000 LOOP: LED1 = 1 GOTO LOOP

'faz pino RB1 = 1 ' para sempre

'subrotina de atendimento de interrupao DISABLE 'desabilita interrupcoes INTERRUPCAO: LED1 = 0 PAUSE 2 INTCON.2 = 0 TMR0 = 250 RESUME ENABLE END 'caso ocorra uma interrupcao 'faz RB1 =0 ' espera 10ms 'limpa flag de interrupcao

'retorna para o programa principal

56

4) Modifique o programa 1 para que a interrupo ocorra na descida do sinal no pino RB0/INT, anote o programa e simule. 5) Modifique o programa 1 para que quando ocorra a interrupo, faa os pinos RA1=1 e RA2=1 durante 1ms 6) Modifique o programa 2 para que quando ocorra a interrupo, faa o pino RA3=1 durante 2ms. 7) Modifique o programa 3 para que ocorra a interrupo quando forem aplicados 10 pulsos no pino RA4/T0CKI 8) Modifique o programa 1 para que a cada interrupo, ocorra uma contagem das interrupes em um display de 7 segmentos 9) Modifique o programa 2 para que a cada interrupo, ocorra uma contagem das interrupes em um display LCD 10) Modifique o program 3 para que ocorra uma interrupo quando forem aplicados 8 pulsos no pino RA4/T0CKI, e a cada interrupo, mostrar a mensagem em um display de LCD, "contagem terminada"

57

16. Conectando um teclado no PIC 1) Simule o programa abaixo:

; layout do teclado conectado na PORTB ;B4----[ ; ;B5----[ ; ;B6----[ ; ;B7----[ ; ; ; 1 ]---[ | 4 ]---[ | 7 ]---[ | * ]---[ | | B3 2 ]---[ | 5 ]---[ | 8 ]---[ | 0 ]---[ | | B2 3 ] | 6 ] | 9 ] | # ] | | B1

58

TECLA VAR BYTE NUMERO1 VAR BYTE X VAR BYTE TRISB=%11110000 TRISC=%00000000 PORTC=%00000000 LOOP: GOSUB LE_TECLADO

X = TECLA GOSUB CONVERTE

PORTC = NUMERO1 PAUSE 1 GOTO LOOP END

CONVERTE: IF X = 255 THEN X = 10 ENDIF LOOKUP X,[$C0,$F9,$A4,$B0,$99,$92,$82,$F8,$80,$98,$FF],NUMERO1 RETURN LE_TECLADO:

PORTB=%00001000 IF PORTB.4 = 1 THEN TECLA_1 IF PORTB.5 = 1 THEN TECLA_4 IF PORTB.6 = 1 THEN TECLA_7 IF PORTB.7 = 1 THEN TECLA_ASTERISCO

PORTB=%00000100 IF PORTB.4 = 1 THEN TECLA_2 IF PORTB.5 = 1 THEN TECLA_5

59

IF PORTB.6 = 1 THEN TECLA_8 IF PORTB.7 = 1 THEN TECLA_0

PORTB=%00000010 IF PORTB.4 = 1 THEN TECLA_3 IF PORTB.5 = 1 THEN TECLA_6 IF PORTB.6 = 1 THEN TECLA_9 IF PORTB.7 = 1 THEN TECLA_SUSTENIDO TECLA = 255 LE_TECLADO_FINAL: RETURN

TECLA_1: TECLA = 1 GOTO LE_TECLADO_FINAL TECLA_2: TECLA = 2 GOTO LE_TECLADO_FINAL TECLA_3: TECLA = 3 GOTO LE_TECLADO_FINAL TECLA_4: TECLA = 4 GOTO LE_TECLADO_FINAL TECLA_5: TECLA = 5 GOTO LE_TECLADO_FINAL TECLA_6: TECLA = 6 GOTO LE_TECLADO_FINAL TECLA_7: TECLA = 7 GOTO LE_TECLADO_FINAL

60

TECLA_8: TECLA = 8 GOTO LE_TECLADO_FINAL TECLA_9: TECLA = 9 GOTO LE_TECLADO_FINAL TECLA_ASTERISCO: TECLA = 16 GOTO LE_TECLADO_FINAL TECLA_0: TECLA = 0 GOTO LE_TECLADO_FINAL TECLA_SUSTENIDO: TECLA = 17 GOTO LE_TECLADO_FINAL 2) Modifique o programa 1, para o seguinte layout de teclado: ; layout do teclado conectado na PORTB ;B4----[ ; ;B5----[ ; ;B6----[ ; ;B7----[ ; ; ; 7 ]---[ | 4 ]---[ | 1 ]---[ | 0 ]---[ | | B3 8 ]---[ | 5 ]---[ | 2 ]---[ | d ]---[ | | B2 9 ] | 6 ] | 3 ] | e ] | | B1

3) Modifique o programa 1, para o seguinte layout de teclado: ;B4----[ ; ;B5----[ ; ;B6----[ ; ;B7----[ ; ; ; 1 ]---[ | 4 ]---[ | 7 ]---[ | * ]---[ | | B3 2 ]---[ | 5 ]---[ | 8 ]---[ | 0 ]---[ | | B2 3 ]---[ | 6 ]---[ | 9 ]---[ | # ]---[ | | B1 a ] b ] c ] d ] | | B0

4) Modifique o programa 1, para mostrar em display LCD, as teclas pressionadas. 5) Modifique o programa 1, para enviar , serialmente, as teclas pressionadas.

61

17. Mdulo Comparador Analgico 1) Simule e explique o funcionamento do programa: ; modulo comparador - modo 5 ENTRADA1 var PORTA.1 ENTRADA2 VAR PORTA.2 SAIDA_COMP2 var CMCON.7 LED0 VAR PORTB.0 ;entrada VIN;entrada VIN+ ;C2OUT

TRISA = %11111111 TRISB = %00000000 CMCON = 5 CLEAR INICIO: IF SAIDA_COMP2 = 1 THEN LED0 = 1 ELSE LED0 = 0 ENDIF GOTO INICIO END 2) Modifique o programa 1, para que o pino RB5 indique o estado da sada do comparador 3) Modifique o programa 1, para que escreva no PORTB os seguintes valores: a) se a tenso na entrada AN2 for maior que a tenso na entrada AN1, escrever %11111111 no PORTB b) se a tenso na entrada AN2 for menor que a tenso na entrada AN1, escrever %01010101 no PORTB 4) Simule e explique o funcionamento do programa: ;comparador trabalhando no modo 5

ENTRADA1 ENTRADA2 LED7 SAIDA_COMP2 FLAG CONTADOR

var VAR var var VAR VAR

PORTA.1 PORTA.2 PORTA.7 CMCON.7 BIT BYTE

;entrada VIN;entrada VIN+ ;C2OUT

TRISA = %01111111 TRISB = %00000000 CMCON = 5 ;comparador trabalhando no modo 5

62

CLEAR

INICIO: LED7 = SAIDA_COMP2 IF SAIDA_COMP2 = 1 THEN FLAG = 1 ENDIF IF SAIDA_COMP2 = 0 AND FLAG = 1 THEN

CONTADOR = CONTADOR + 1 PORTB = CONTADOR FLAG = 0 ENDIF GOTO INICIO END

5) Modifique o programa "4", para que quando a contagem chegar em 10, ligue o pino RA6, e reinicie a contagem de zero. 6) Simule e explique o programa. Quais entradas dos comparadores esto sendo utilizadas? SAIDA_CP1 SAIDA_CP2 LED0 LED1 VAR VAR VAR VAR CMCON.6 CMCON.7 PORTB.0 PORTB.1

TRISA = %11111111 TRISB = %00000000 CMCON = 2 VRCON = %10100110 CLEAR INICIO: IF SAIDA_CP1 = 1 THEN LED0 = 1 ELSE LED0 = 0 ;comparador trabalhando no modo 2 ;configura referencia de tenso VREF = 1,25V

63

ENDIF IF SAIDA_CP2 = 1 THEN LED1 = 1 ELSE LED1 = 0 ENDIF GOTO INICIO END 7) Modifique o programa 6, utilizando CMCON = %00001010, simule e explique. Quais entradas dos comparadores esto sendo utilizadas agora? 8) Modifique o programa 6, para trabalhar com uma tenso de referncia de 3,59V 9) Modifique o programa 6, para trabalhar com uma tenso de referncia de 1,04V 10) Elabore um programa que mea um sinal DC. Quando este sinal for maior que 2.50V, o pino RB7 deve ser ativado. 11) Simule e explique o programa. Quais entradas dos comparadores esto sendo utilizadas? SAIDA_CP1 SAIDA_CP2 LED5 LED7 VAR VAR VAR VAR CMCON.6 CMCON.7 PORTB.5 PORTB.7

TRISA = %11111111 TRISB = %00000000 CMCON = 3 CLEAR INICIO: IF SAIDA_CP1 = 1 THEN LED5 = 1 ELSE LED5 = 0 ENDIF IF SAIDA_CP2 = 1 THEN LED7 = 1 ELSE LED7 = 0 ;comparador trabalhando no modo 3

64

ENDIF GOTO INICIO END 12) Modifique o programa 11 para que: a) se a tenso na entrada AN0 for menor que a tenso de referencia, acionar o pino RB0 durante 2ms b) se a tenso na entrada AN1 for maior que a tenso de referncia, acionar o pino RB1 durante 3ms 13) Modifique o programa 11 para trabalhar com os comparadores no modo 4 e explique seu funcionamento 14) Modifique o programa 11 para trabalhar com os comparadores no modo 6, e explique seu funcionamento 15) Elabore um programa que trabalhe no modo 6, que : a) quando a tenso na entrada AN0 for maior que a referencia, ativar a saida RB0 b) quando a tenso na entrada AN0 for menor que a referencia, ativar a saida RB3 c) quando a tenso na entrada AN1 for maior que a referencia, ativar a saida RB5 d) quando a tenso na entrada AN1 for menor que a referncia, ativar a sada RB6

65

18. Microcontrolador PIC 12F675

6 pinos de I/O 1 comparador analgico 1 conversor A/D com 4 canais

O comando PWM tem a seguitnte sintaxe:

PWM Pin. Duty, Cycle

1) Simule o programa abaixo, utilizando o microcontrolador 12F675: @ device mclr_off ;configura pino GP3/MCLR como I/O

LED0 VAR GPIO.0 LED1 VAR GPIO.1 LED2 VAR GPIO.2 LED4 VAR GPIO.4 LED5 VAR GPIO.5 ANSEL = 0 CMCON = 7 TRISIO=%00000000 LED0 = 1 LED1 = 1 LED2 = 1 LED4 = 1 LED5 = 1 END 2) Modifique o programa 1, para ligar somente o pico GP2; 3) Simule o programa abaixo: LED VAR GPIO.0 ANSEL = 0 CMCON = 7 TRISIO=%00000000 LOOP: ;LED como GPIO.0 ; todos os pinos como I/O digital ; comparador desligado ;configura todos os pinos como I/O ;comparadores analgicos desligados

66

LOW LED PAUSE 5 HIGH LED PAUSE 5 GOTO LOOP

;liga LED em GPIO.0 ;atraso de 5 milisegundos ;desliga LED em GPIO.0 ;atraso de 5 milisegundos ;volta para loop

END 4) Modifique o programa 3, para ligar e desligar os pinos GP1 e GP4; 5) Simule o programa: Include "modedefs.bas" DEFINE CHAR_PACING 500 ;definicoes para Serout

;Define parametros para ADCIN Define Define Define ADC_BITS ADC_CLOCK ADC_SAMPLEUS 8 3 50 ; numero de bits no resultado ; fonte de clock (3=rc) ; tempo de amostragem em us

TX

Var

GPIO.1 byte

; pino de transmissao em GP0 ; cria adval para armazenar o resultado ; justifica resultado para a esquerda ; AN3 analogico, restante digital ; comparador analogico desligado ; espera 1 ms ; Le canal 3 para adval Valor: ", #adval,13,10] ; espera 1 ms ; faz para sempre ;Mostra valor em decimal

adval var

ADCON0.7 = 0 ANSEL = %00111000 CMCON = 7 Pause 1 loop: ADCIN 3, adval Serout TX, T2400, [" Pause 1 Goto loop End

67

6)Modifique o programa 5 para mostrar em volts; 7)Modifique o programa 5 para trabalhar com conversor A/D de 10 bits; 8)Modifique o programa 6 para trabalhar com conversor A/D de 10 bits;

68

9) Simule o programa: @ LED PB device mclr_off ; ; GPIO.0 -> led GPIO.3 -> push button

var GPIO.0 Var GPIO.3

ANSEL = 0 CMCON = 7 loop: If PB = 0 Then Low LED Else High LED Endif Goto loop End

; todos os pinos i/o digital ; comparadores desligados

10) Modifique o program 9 para o led conectado no pino GP4; 11) Elabore um programa: Se o pino GP3= 0 GP2 1 0 1 GP1 1 1 0 GP0 0 1 1

Se o pino GP3= 1 GP2 1 0 1 GP1 1 0 0 GP0 1 0 1

Se o pino GP4 = 0 GP2 0 0 1 GP1 0 1 1 GP0 1 0 1

Se o pino GP4 = 1 GP2 1 0 1 GP1 1 1 1 GP0 1 0 1

69

19. Resumo do Compilador PicBasic Pro (PBP) O PBP um compilador BASIC, para os microcontroladores da Microchip. Cria por padro arquivos que rodam em um PIC 16F84-04/P de clock de 4MHz. Seu primeiro programa 1. Digite o arquivo fonte do seu programa, usando um editor de textos (ex. edit do DOS), e salve com extenso .BAS . Exemplo: programa BLINK.BAS Programa exemplo para piscar um LED ligado ao pino PORTB loop: High PORTB.0 Pause 500 PORTB.0 Pause 500 loop liga o led atraso de 0.5 seg desliga o led atraso de 0.5 seg volta ao loop

Low

Goto End

2. Compilar o programa com o comando: PBP blink.bas

Se for o rodar o programa acima, em um PIC 16F877, deve-se usar o comando: PBP p16f877 blink.bas Ser gerado o arquivo BLINK.HEX, pronto, para ser gravado no PIC. O BASIC do PicBasic Pro Rtulos de linha ou label Usados para marcar declaraes , para referencia com os comandos GOTO ou GOSUB. aqui: Serout 0,N2400, [Olah, Pessoal!, 13,10} Goto aqui

Variveis Variveis so onde dados temporrios so guardados num programa do PicBasicPro. So criadas com a palavra-chave VAR Variveis podem ser bits, bytes ou palavras. Rtuto Cao Gato VAR var var Tamanho{.Modificadores} byte bit cao uma var de 8 bits gato uma var de 1 bit

70

w0 Aliases

var

word

w0 uma var de 2 bytes

VAR pode tambm ser usada para criar um alias (um outro nome) para uma varivel. Toto Pulga b0 b1 Constantes Rotulo COM Expressao constante Ratos Ratoeiras con con 3 ratos * 1000 'Ratos = 3 var var var var cao cao.0 toto outro nome de cao pulga e o bit0 de cao w0.byte0 b1 eo primeiro byte de w0

w0.byte1 b0 eo segundo byte de w0

Constantes Numricas Constante Decimal: Constante Binria: Constante hexadecimal: Constante de caracteres: Pinos Os pinos podem ser acessados usando o nome PORTe o nmero do bit: PORTB.1 = 1 Fixa PORTB, bit 1 em Lzaro 1 Pode-se atribuir um nome para um pino, usando o comando VAR: Led var High PORTA.3 led renomeia PORTA.3 como led fixa led em nivel alto d 100 Valor decimal 100

%10100101 $F2

Para configuar um pino ou porta como sada ou entrada, utiliza-se o registrador TRIS Fixando um bit TRIS em 0, torna o pino uma sada. Fixando um bit TRIS em 1, torna o pino uma entrada. TRISA = %00000000 todos os pinos do PORTA como sadas todos os pinos do PORTB como entradas

TRISB = %11111111 Define

71

Pode ser usado mudar o valor predefinido do oscilador, e outras caracteristicas DEFINE OSC 4 Define frequencia do oscilador '3 4 8 10 12 16 20 HSER_BAUD 2400

DEFINE

Operaes Matemticas

Op. Matemtico + * ** */ / // << n >> n ABS COS SIN SQR MAX MIN DCD NCD DIG REV & | ^ ~ &/ |/ ^/

Descrio Adio Subtrao Multiplicao 16 bits superiores da multiplicao 16 bits do meio da multiplicao Diviso Resto (Modulo) Deslocamento p/ Esquerda n posies Deslocamento p/ Direita n posies Valor Absoluto Cosseno Seno Raiz Quadrada Mximo Minimo Decodifica 2n Codifica Digito Inverte Bits AND Lgico OR Lgico OR exclusivo Lgico (XOR) NOT Lgico (inversora) NOT AND Lgico NOT OR Lgico NOT OR Exclusivo Lgico

Operadores de Bit Agem em cada bit, de um valor de maneira booleana. Eles podem ser usados p/ isolar bits ou adicionar bits a um valor. Exemplo: B0 = B0 & %00000001 B0 = B0 | %00000001 B0 = B0 ^ %00000001 Isola o bit 0 de B0 Liga o bit 0 de B0 Inverte o estado do bit 0 de B0

72

Operadores de Comparao So usados em declaraes IF...THEN para comparar uma expresso com outra. Operador de Descrio Comparao = ou == Igual <> ou != No Igual < Menor que > Maior que <= Menor ou Igual a >= Maior ou Igual a Exemplo: If I > 10 Then loop Operadores Lgicos Os operadores lgicos diferem dos operadores a bit. Eles produzem um resultado verdadeiro/falso de sua operao. Valores de 0 so tratados como falso. Qualquer valor tratado como verdadeiro. Eles so mais usados em conjunto com os operadores IF...THEN. Operador Lgico AND ou && OR ou || XOR ou ^^ NOT AND NOT OR NOT XOR Descrio AND Lgico OR Lgico OR Exclusivo Lgico NAND Lgico NOR Lgico NXOR Lgico

If (A == maior) AND (B > medio) Then run Algumas declaraes do PicBasicPro FOR...NEXT FOR conta = inicio TO fim {STEP {-} Inc } {Corpo} NEXT {Conta}

O loop FOR.. NEXT permite que os programas executem um nmero de declaraes (o Corpo) por algumas vezes usando uma varivel como contador. Exemplos: FOR i = 1 TO 10 Serout 0, N2400,[#i, ] NEXT i Conta de 1 a 10 Envia cada numero para Pin0 serialmente Retorna e faz a proxima contagem

Serout 0,N2400,[10] Envia um avano de linha

FOR

B2 =20 TO 10 STEP -2

Conta de 20 a 10 de 2 em 2

Serout 0, N2400, [#B2, ]

73

NEXT B2

retorna e faz a proxima contagem

Serout 0,N2400,[10] Envia um avano de linha GOSUB Rotulo

Salta para a subrotina em Rotulo. GOSUB beep ....... ....... beep: High 0 Sound 1,[80,10] Low 0 Return IF...THEN...ELSE...ENDIF IF IF ELSE Declarao ENDIF If...Then avalia os termos da comparao p/ verdadeiro ou falso. Se for verdadeiro, a operao aps o Then executada. Se ele resultar em falso, a operao aps o Then no executada. Comparaes que resultem em 0, so consideradas falsas. Qualquer outro valor considerado verdadeiro. Exemplos: If PortA.0 = 0 Then pushd ' Se a pino RA0 for igual ' a zero, salte para o ' rtulo pushd ' Se B0 for diferente de 10, faa ' incrementa B0 ' incrementa B1 Comp {AND/OR Comp...} Comp {AND/OR Comp} Declarao THEN Rotulo THEN Executa subrotina chamada beep

Ligue o Led ligado em Pin0 Bipe no Alto-falante 'Desliga o Led Volta p/ rotina principal

If

B0 <> 10 Then B0 = B0 + 1 B1 = B1 - 1

Endif

WHILE...WEND

WHILECondio Declarao...... WEND Executa repetidamente "Declarao" enquanto (While) a Condio for verdadeira. Exemplo: i =1 WHILE i <= 10 Serout PortB.7,N2400,["No:", #i,13,10] i=i+1 WEND

'Enquanto i for 'menor ou igual a 'igual a 10,e ' executa....

74

HIGH pino Faz o pino especificado ir para nvel alto (5V). HIGH PORTA.0 led var HIGH led ' pino RA0 = 1 (5V) PORTB.4 ' define RB4 como led ' led = 1

Outro modo de levar um pino, para nivel alto, se ele ja foi configurado como sada, : PORTB.4 = 1 LOW pino Faz o pino especificado ir para nvel baixo (0V). LOW PORTA.0 lampada var ' pino RA0 = 0 (0V) PORTB.5 'define RB5 como lampada LOW lampada ' lampada = 0 ' Fixa o pino RB4 em nivel alto (5V)

Outro modo de levar um pino, para nivel baixo, se ele ja foi configurado como sada, : PORTB.4 = 0 ' Fixa o pino RB4 em nivel baixo (0V)

PAUSE

perodo

Faz uma pausa no programa, durante "periodo" milisegundos. Periodo pode ser de 0ms at 65535 milisegundos. PAUSE PAUSEUS 1000 periodo 'Atraso de 1 segundo

Faz uma pausa no programa durante "periodo" microsegundos. Perodo pode ser de 24us ate 65535us. PAUSEUS 1000 'Atraso de 1 milisegundo

SOUND pino,[Nota,Durao{,Nota,Durao...}] Gera tons no pino especificado. se "Nota" 0 silencio Notas de 1 a 127 so tons Notas de 128 a 255 so ruidos brancos Nota 1 de 78,74Hz Nota 127 de 10KHz Duraao de 0 a 255, e determina por quanto tempo a Nota tocada em incrementos de cerca de 12 milisegundos. Um alto-falante pode ser adicionado atraves de um capacitor no pino especificado

75

PINO

10uF +

ALTO-FALANTE

SOUND PORTB.7, [100,10,50,10] ' envia 2 sons ' consecutivos no pino 'RB7. WHITE Endereo, Valor Escreve "Valor" na EEPROM do microcontrolador no "Endereo" especificado. temporizado, e leva cerca de 10 milisegundos para ser executado. Ex: WRITE5,B0 ' Envia valor de B0 para o endereo 5 'da EEPROM do PIC Cada Write auto-

READ Endereo, Var L o contedo do endereo especificado da EEPROM, e guarda o resultado na variavel "Var". Ex: READ 5,B2 ' L o contedo do endereo 5 da ' EEPROM, e armazena na varivel ' B2

SERIN pino, modo, {timeout, rotulo,} { [ Qualificador...],} {Item....} Recebe um ou mais itens no Pino no formato assincrono padro, usando 8 bits, sem paridade e um stop bit (8N1) SERIN PORTA.1, N2400,["A"], B0 'Aguarda at que o 'caracter A seja recebido 'serialmente, no pino 'RA0, e coloca o proximo caracter em B0 SEROUT pino, modo, [item{,Item...}] Envia um ou mais itens ao pino em formato assncrono padro usando 8 bits de dados, sem paridade, e um stop bit. SEROUT 0,N2400,[#B0,10] 'Envia o valor ASCII de B0 'seguido por um avano de 'lingua, no pino PORTA.3, 'serialmente Algumas outras declaraes disponiveis no PicBasicPro: DEBUG : Sada serial assncrona p/ um pino DTMFOUT : Gera tons de discagem em um pino LCDOUT : Mostra caracteres em um LCD PULSIN : Mede a largura de um pulso em um pino PULSOUT : Gera pulso em um pino

76

SHIFTFIN SHIFTOUT I2CREAD I2CWRITE ON INTERRUPT POT RANDOM

: Entrada serial sincrona : Sada serial sincrona : Le os bytes de um dispositivo I2C : Escreve bytes em um dispositivo I2C :Executa subrotina BASIC em uma :interrupo :Le valor de um potenciometro em um pino :Gera um nmero pseudo-aleatrio

Endereos na Internet sobre o PICBASIC (maio/2004): www.microchip.com www.epanorama.net www.melabs.com/index.htm www.mikroelektronika.co.yu www.rentron.com/PicBasic1.htm www.asm51.eng.br/

77

Você também pode gostar