• Nenhum resultado encontrado

Apostila de Microcontroladores PIC. Utilizando a linguagem de programação PICBASIC. Lázaro Aparecido Pires de Camargo

N/A
N/A
Protected

Academic year: 2021

Share "Apostila de Microcontroladores PIC. Utilizando a linguagem de programação PICBASIC. Lázaro Aparecido Pires de Camargo"

Copied!
77
0
0

Texto

(1)

Apostila de Microcontroladores PIC

Utilizando a linguagem de programação PICBASIC

Lázaro Aparecido Pires de Camargo

(2)

2 Sumário

1.Introdução ... 3

2.Acessando os pinos de I/O ... 5

3.Instrução FOR ... NEXT ... 7

4.Instrução IF...THEN...ELSE...ENDIF ... 9

5.Instrução WHILE...WEND... 11

6.Instrução GOSUB ... 13

7.Exercícios de Revisão - Conceitos Básicos... 17

8.Conectando um LCD em um microcontrolador PIC ... 20

9.Conectando um display de 7 Segmentos... 24

10.Conversor A/D ... 27

11.Comunicação Serial... 33

12.Utilizando a memória EEPROM interna do PIC ... 40

13.Instrução PWM ... 43

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

15.Utilizando Interrupções ... 54

16.Conectando um teclado no PIC ... 58

17.Módulo Comparador Analógico ... 62

18.Microcontrolador PIC 12F675... 66

(3)

1. Introdução

Microcontrolador PIC 16F877A

Características:

• 33 pinos de I/O (entradas / saídas) digitais;

• 8192 (8K) palavras de 14 bits para programa em memória FLASH;

• 368 bytes de memória RAM e 256 bytes de memória EEPROM interna para dados; • 3 timers (2 timers de 8 bits e 1 timer de 16 bits);

• 1 canal de comunicação USART serial e 1 timer watdog • conversor A/D (analógico – digital) com 8 canais;

• frequência de operação de até 20MHz Os 33 pinos de I/O estão organizados em 5 portas: PORTA

RA5 RA4 RA3 RA2 RA1 RA0

PORTB RB7 RB6 RB5 RB4 RB3 RB2 RB1 RB0 PORTC RC7 RC6 RC5 RC4 RC3 RC2 RC1 RC0 PORTD RD7 RD6 RD5 RD4 RD3 RD2 RD1 RD0

(4)

4 Os pinos de I/O podem ser configurados como entrada ou saída, dependendo dos valores dos registros “TRIS”

TRIS = 1 - pino como entrada (Input) TRIS = 0 - pino como saída (Output)

TRISA configura a PORTA, TRISB configura a PORTB e assim por diante. Exemplo: TRISB = %00000011 configura os pinos da PORTB da seguinte forma:

Exercício 1 : Como foram configurados os pinos (como entrada ou saída) abaixo:

a) TRISB = %10010001 1 0 0 1 0 0 0 1 Configuração da PORTB: entrada saida b) TRISC =%11110000 1 1 1 1 0 0 0 0 Configuração da PORTC: c) TRISD =%00000000 0 0 0 0 0 0 0 0 Configuração da PORTC:

(5)

2.Acessando os pinos de I/O

1) Simule os programas, indicando o valor do PORTB após executa-los: a) TRISB = %00000000 PORTB.7 = 1 PORTB.2 = 1 END b)

LED1 VAR PORTB.1

LED5 VAR PORTB.5

LED6 VAR PORTB.6

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

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

2) Elabore um programa que faça 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..)

PORTB=%

PORTB=%

(6)

6 5) Elabore um programa que realize as seguintes operaçãoes:

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 operações: 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 ON OFF ON ON OFF ON RB6 ON OFF ON ON OFF ON RB5 ON OFF ON ON ON OFF RB4 ON OFF ON ON ON OFF RB3 OFF ON OFF OFF ON OFF RB2 OFF ON OFF OFF ON OFF RB1 OFF ON OFF OFF OFF ON RB0 OFF ON OFF OFF OFF 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.

(7)

3. Instrução FOR...NEXT

FOR conta = inicio TO fim {STEP {-} Inc } {Corpo}

NEXT {Conta}

O loop FOR.. NEXT permite que os programas executem um número de declarações (o Corpo) por algumas vezes usando uma variável como contador.

Exemplos:

FOR i = 1 TO 10 ‘Conta de 1 a 10 Serout 0, N2400,[#i, “ “] ‘Envia cada numero para

‘ Pin0 serialmente NEXT i ‘ Retorna e faz a proxima contagem Serout 0,N2400,[10] ‘Envia um avanço 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 avanço de linha

1) Simule os programas, indicando o valor do PORTB após 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

(8)

8 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 faça o pino RB0 ir para 0 durante 1ms e ir para 1 durante 2ms, repetindo isto durante 4 vezes.

5) Elabore um programa que faça 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;

(9)

4. Instrução IF...THEN...ELSE...ENDIF

IF Comp {AND/OR Comp...} THEN Rotulo IF Comp {AND/OR Comp…} THEN

Declaração… ELSE

Declaração… ENDIF

If...Then avalia os termos da comparação p/ verdadeiro ou falso. Se for verdadeiro, a operação após o Then é executada. Se ele resultar em falso, a operação após o Then não é executada. Comparações que resultem em 0, são 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

' rótulo pushd If B0 <> 10 Then ' Se B0 for diferente de 10, faça

B0 = B0 + 1 ' incrementa B0 B1 = B1 - 1 ' incrementa B1 Endif

1) Simule o programa: a)

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

(10)

10 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 variável CONTADOR for maior que 8, ligar o pino RC2 durante 5 milisegundos.

5) Modifique o programa 3, para que, se variável CONTADOR for igual a 3, ligar o pino RC1 durante 3 milisegundos.

6) Modifique o programa 3, para que se a variável CONTADOR for igual a 10, ligar o pino RC6 durante 4 milisegundos . e quando a variável contador for igual a 50, ligar o pino RC7, durante 8 milisegundos.

(11)

5. Instrução WHILE...WEND

WHILECondição

Declaração... WEND

Executa repetidamente "Declaração" enquanto (While) a Condição 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 VAR PORTD.2 SERVO VAR PORTB.6 TRISD = %00001111 TRISB = %00000000 VOLTA: WHILE CONTADOR != 1 SERVO = 1 WEND SERVO = 0 GOTO VOLTA

(12)

12 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

(13)

6. Instrução GOSUB Salta para a subrotina em Rotulo.

GOSUB beep ‘Executa subrotina chamada beep ...

...

beep: High 0 ‘Ligue o Led ligado em Pin0 Sound 1,[80,10] ‘Bipe no Alto-falante

Low 0 'Desliga o Led

Return ‘Volta p/ rotina principal

1) Simule os programas abaixo: a)

LAMPADA1 VAR PORTB.7 LAMPADA2 VAR PORTB.0 LAMPADA3 VAR PORTB.1 LAMPADA4 VAR PORTB.2

LAMPADA5 VAR 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

(14)

14 b)

CONTADOR VAR BYTE

PAINEL VAR PORTB TRISB = %00000000 PORTB = %00000000 GOSUB DIREITA GOSUB ESQUERDA GOSUB DIREITA GOSUB ESQUERDA END DIREITA: 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 instrução GOSUB e RETURN) e simule:

(15)

a)

ATUADOR1 VAR PORTB.0 ATUADOR2 VAR PORTB.3 ATUADOR3 VAR PORTB.7 TRISB = %00000000 PORTB = %00000000 ATUADOR1 = 1 PAUSE 1 ATUADOR1 = 0 PAUSE 1 ATUADOR2 = 1 PAUSE 1 ATUADOR2 = 0 PAUSE 1 ATUADOR3 = 1 PAUSE 1 ATUADOR3 = 0 PAUSE 1 ATUADOR1 = 1 PAUSE 1 ATUADOR1 = 0 PAUSE 1 ATUADOR2 = 1 PAUSE 1 ATUADOR2 = 0 PAUSE 1 ATUADOR3 = 1 PAUSE 1 ATUADOR3 = 0 PAUSE 1 ATUADOR1 = 1 ATUADOR2 = 1 ATUADOR3 = 1 END b)

MAQUINA1 VAR PORTB.0 MAQUINA2 VAR PORTB.2 MAQUINA3 VAR PORTB.4 MAQUINA4 VAR PORTB.5 MAQUINA5 VAR PORTB.6 TRISB = %00000000 PORTB = %00000000 HIGH MAQUINA1 PAUSE 1 HIGH MAQUINA2 PAUSE 1 LOW MAQUINA1 LOW MAQUINA2 MAQUINA3 = 1 PAUSE 2 HIGH MAQUINA1

(16)

16 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 são as vantagens de se utilizar subrotinas em um programa?

(17)

PORTB = 7. Exercicios Revisão - Conceitos Básicos

1) Quantos bits possuem as variáveis declaradas, abaixo:

MOTOR_1 VAR BIT SERVIDOR VAR BYTE SOLENOIDE VAR PORTB.6 RELE VAR PORTA.2 ELETRO VAR WORD

2) Classifique as seguintes constantes como Decimal, Binária, Hexadecimal ou Caracteres:

3) Como estão configurados os pinos das portas (entrada ou saída), com os seguintes valores dos registros TRIS:

a) TRISB = %00110001

b) TRISC = %11100101

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

Constante Tipo Constante Tipo

45 %11111111 100 "2007" %00110011 240 "TIMAO" $FE $BA %10001111 RB7 RB6 RB5 RB4 RB3 RB2 RB1 RB0 RC7 RC6 RC5 RC4 RC3 RC2 RC1 RC0

(18)

18 PORTB = PORTB = PAUSE 5 NEXT A END c)

SENSOR2 VAR PORTD.2

ROTOR VAR 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 VAR PORTD.1

LED3 VAR PORTB.3

TRISD = %00011111 TRISB = %00000000 PORTB = %00000000 INICIO: WHILE TEMP = 1 LED3 = 1 WEND LED3 = 0 GOTO INICIO END

5) Elabore um programa que faça o pino RB4 = 1 e os demais pinos do PORTB iguais a zero:

6) Elabore um programa que faça 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 VAR PORTB.7

MOTOR VAR PORTB.2 SENSOR VAR PORTD.0 ALTOFALANTE VAR PORTB.0

(19)

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 VAR PORTD.1 LEITOR2 VAR PORTD.2 TRISD = %00011111 TRISB = %00000000 INICIO: PORTB = %00000000 WHILE LEITOR1 = 0 PORTB.5 = 1 PORTB.6 = 1 PAUSE 1 PORTB.5 = 0 PORTB.6 = 0 PAUSE 1 WEND PAUSE 1 PORTB = %00000001 PAUSE 1 GOTO INICIO END

9) Reescreva o programa 8, para que a instrução “while” ocorra quando a variável 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

(20)

20 8. Conectando um LCD em um microcontrolador PIC

Um LCD é um periférico inteligente que se comunica com o mundo externo através de 8 ou 4 bits. É sempre preciso iniciar o display, programando-o. Os módulos LCD são encontrados em diferentes configurações, 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 conexão de um modulo LCD são:

Terminal Símbolo Nome e Função

1 Vss Terra, 0V

2 Vdd Alimentação, +5V

3 Vo Ajuste da tensão de contraste

4 RS Seleção – Dados/Controle

5 R/W Leitura/Escrita no LCD

6 E Enable – Habilitação

7 D0 D0 – bit menos significativo (LCD)

8 D1 D1 9 D2 D2 10 D3 D3 11 D4 D4 12 D5 D5 13 D6 D6

14 D7 D7 – bit mais significativo (MSB) Escrevendo em um LCD utilizando o PIC BASIC PRO

Para escrever informações em um módulo LCD, pode-se utilizar o comando LCDOUT.

São enviados comandos ao LCD, deve-se escrever $FE, seguido pelo comando desejado. Alguns comandos úteis estão listados na tabela a seguir:

Comando Operação

$FE,1 Limpa o display

$FE,2 Retorno (inicio da primeira linha) $FE,$0C Cursor desligado

$FE,$0E Cursor sublinhado ligado $FE,$0F Cursor piscante

$FE,$10 Move o cursor uma posição à esquerda $FE,$14 Move o cursor uma posição à direita $FE,$C0 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

(21)

1) Simule o programa abaixo: (obs. Não se esqueça de configurar o modulo LCD na simulação) Microcontrolador PIC LCD RB7 RB6 RB5 RB4 RB1 RB0 E RS D7 D6 D5 D4 R/W GND

DEFINE LCD_DREG PORTB ;PORTB conectado nas linhas de dados do LCD

DEFINE LCD_DBIT 4 ;Define o primeiro pino da PORTB conectado no LCD DEFINE LCD_RSREG PORTB ;Define que o pino RS do LCD esta ligado no PORTB DEFINE LCD_RSBIT 1 ;Define que o pino RB1 esta ligado no sinal RS do LCD DEFINE LCD_EREG PORTB ;Define que o pino E do LCD esta ligado no PORTB DEFINE LCD_EBIT 0 ;Define que o pino RB0 esta ligado no sinal E do LCD DEFINE LCD_BITS 4 ;Define o modo de comunicação de 4 bits com o LCD DEFINE LCD_LINES 2 ;Define display de 2 linhas

DEFINE LCD_COMMANDUS 2000 ;Define atraso para envio de comandos para o LCD DEFINE LCD_DATAUS 50 ;Define atraso para envio de dados para o LCD

INICIO:

LCDOUT $FE,1 ;Limpa LCD

LCDOUT "OI" ;Escreve "OI" no LCD

PAUSE 1 ;Espera 1ms

LCDOUT $FE,$C0 ;Move o cursor para a segunda linha LCDOUT "GENTE AMIGA" ;Escreve "GENTE AMIGA"

goto inicio

end

(22)

22 2) Modifique o programa 1, para escrever seu nome no LCD;

3) Simule o programa abaixo:

DEFINE LCD_DREG PORTB ;PORTB conectado nas linhas de dados do LCD

DEFINE LCD_DBIT 4 ;Define o primeiro pino da PORTB conectado no LCD DEFINE LCD_RSREG PORTB ;Define que o pino RS do LCD esta ligado no PORTB DEFINE LCD_RSBIT 1 ;Define que o pino RB1 esta ligado no sinal RS do LCD DEFINE LCD_EREG PORTB ;Define que o pino E do LCD esta ligado no PORTB DEFINE LCD_EBIT 0 ;Define que o pino RB0 esta ligado no sinal E do LCD DEFINE LCD_BITS 4 ;Define o modo de comunicação de 4 bits com o LCD DEFINE LCD_LINES 2 ;Define display de 2 linhas

DEFINE LCD_COMMANDUS 2000 ;Define atraso para envio de comandos para o LCD DEFINE LCD_DATAUS 50 ;Define atraso para envio de dados para o LCD

CONTADOR VAR BYTE INICIO:

LCDOUT $FE,1 ;Limpa LCD

LCDOUT "CONTADOR = ",#CONTADOR ;Escreve valor da variavel contador

CONTADOR = CONTADOR + 1 ;Incrementa variavel contador PAUSE 1 ;Espera 1ms GOTO INICIO END

4) Modifique o programa do item 3, para contador de 5 em 5; 5) Mude o tipo da variável 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

(23)

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 “lâmpadas desligadas”

(24)

24 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:

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

Number Segments Hex

0 1100 0000 $C0 1 1111 1001 $F9 2 1010 0100 $A4 3 1011 0000 $B0 4 1001 1001 $99 5 1001 0010 $92 6 1000 0010 $82 7 1111 1000 $F8 8 1000 0000 $80 9 1001 1000 $98

Configuração de um display anodo

Configuração de um display catodo

Exemplo para escrever “O” em um display de 7 segmentos anodo comum:

TRISB = %00000000

PORTB = %11000000 'escreve 0

(25)

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 instrução 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

(26)

26 WHILE SENSOR1 = 1 PORTB = %11111001 WEND GOTO VOLTA END d) X VAR BYTE NUMERO1 VAR 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”, “b”e “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.

(27)

10. Conversor A/D

Leitura de Tensões Analógicas com o PIC

Em muitas aplicações, pode ser necessário realizar a leitura de grandezas analógicas do mundo exterior. Normalmente, utilizam-se sensores especiais para converter a grandeza desejada em um nível de tensão proporcional. Pode-se efetuar a leitura destas tensões por intermédio de um conversor

analógico/digital, cuja função é converter a tensão analógica em um número binário, proporcional à tensão analógica.

Nos conversores A/D, utiliza-se uma tensão de referência (normalmente chamada de Vref), que serve de fundo de escala para o sinal de saída do conversor, ou seja, as saídas do conversor estarão todas em nível “1”, quando a tensão de entrada do conversor for igual ou maior que a tensão de Vref.

Para um conversor A/D com resolução de 10 bits e tensão de referência 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 tensão de 100 *4,8876mV = 0,48876V

Para um conversor A/D com resolução de 8 bits e tensão de referência 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 tensão de 100 * 0,01961V = 1,961V Modulo conversor A/D do PIC 16F877

(28)

28 Instrução ADCIN ADCIN Canal, Var

A instrução ADCIN le o "canal" do conversor a/d e armazena o resultado na variável "Var". Antes de ADCIN ser usada, deve-se fazer as seguintes operações:

a) Definir como sera feita a conversão 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 uma variável de 8 bits

DEFINE ADC_BITS 8 'ajusta numero de bits do conversor A/D DEFINE ADC_CLOCK 3 'ajusta fonte de clock

DEFINE ADC_SAMPLEUS 50 'ajusta o tempo de amostragem em us TRISA = %11111111 ' PORTA como entrada

TRISB = %00000000 'PORTB como saída

ADCON1 = %00000010 'PORTA como entrada analógica

ADCIN 0,LEITURA ' Le canal 0 (RA0) e armazena na variável Leitura PORTB = LEITURA ' Escreve Leitura no PORTB

END

(29)

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 ADC_BITS 8 ' ajusta número de bits do conversor A/D DEFINE ADC_CLOCK 3 ' ajusta fonte de clock

DEFINE ADC_SAMPLESUS 50 ' ajusta o tempo de amostragem em us

CONVERSOR VAR BYTE

TRISA = %11111111 TRISD = %00000000 ADCON1 = %00000010 INICIO: ADCIN 0,CONVERSOR PORTD = CONVERSOR PAUSE 1 GOTO INICIO

(30)

30 Para os exercicios abaixo, faça 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 intrução dos programas abaixo, e simule o programa, indicando o valor do PORTB após executa-los:

DEFINE ADC_BITS 10 ' ajusta número de bits do conversor A/D DEFINE ADC_CLOCK 3 ' ajusta fonte de clock

DEFINE ADC_SAMPLESUS 50 ' ajusta o tempo de amostragem em us

ADVAL VAR WORD

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

IF ADVAL > 200 THEN TESTE2

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:

(31)

GOTO INICIO

END

5) Modifique o programa 4, para o conversor trabalhar com 8 bits;

6) Explique o que faz cada instrução dos programas abaixo, e simule o programa:

'Define parametros do display LCD

DEFINE LCD_DREG PORTD DEFINE LCD_DBIT 4 DEFINE LCD_RSREG PORTD DEFINE LCD_RSBIT 0 DEFINE LCD_EREG PORTD DEFINE LCD_EBIT 1 DEFINE LCD_BITS 4 DEFINE LCD_LINES 2 DEFINE LCD_COMMANDUS 2 DEFINE LCD_DATAUS 5

'Define parametros do conversor A/D

DEFINE ADC_BITS 10 ' ajusta numero de bits do conversor A/D DEFINE ADC_CLOCK 3 ' ajusta fonte de clock (3=rc)

DEFINE ADC_SAMPLEUS 50 ' ajusta tempo de amostragem em microssegundos

LEITURA_AD VAR WORD

LEITURA_MV VAR WORD TRISA = %111111111

ADCON1 = %10000010

LCDOUT $FE,1 ' LIMPA DISPLAY

LCDOUT "VALOR DO A/D"

INICIO: ADCIN 0,LEITURA_AD LEITURA_MV = LEITURA_AD * 5 LCDOUT $FE,$C0 LCDOUT " " LCDOUT $FE,$C0

LCDOUT #LEITURA_AD," ",#LEITURA_MV,"mV" PAUSE 2

GOTO INICIO

(32)

32 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 tensão 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 tensão do canal 0 for maior que a tensão do canal 3, ligar o pino RC0;

10) Elaborar um programa para indicar em um display de 7 segmentos a tensão 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 tensão do canal 4 do a/d for menor que 2V, escrever :"Sinal Baixo" b) quando a tensão do canal 4 for maior ou igual a 2V, escrever:"Sinal Alto"

(33)

11. Comunicação Serial

Comunicação Serial com o PIC

É possivel realizar a comunicação entre um microcontrolador e um PC atraves da porta serial, utilizando o circuito de interfaçe MAX232, como mostrado abaixo:

A comunicação é realizada de forma serial e assincrona, e os sinais tem niveis RS232 como mostra a figura. Para se realizar uma comunicação serial utilizando a linguagem PICBASIC, podem ser utilizadas duas instruções:

SEROUT Pino,Modo,[item, item, ....] para enviar um ou mais itens ao Pino indicado em formato assincrono padrão 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 assíncrono padrão usando 8 bits de dados, sem paridade e um stop bit (8N1).

A opção Modo é definida no arquivo MODEDEFS.BAS. Para usa-lo, adicione a linha : INCLUDE "modedefs.bas"

Modo Baud Rate Estado

T2400 2400 Verdadeiro T1200 1200 Verdadeiro T9600 9600 Verdadeiro T300 300 Verdadeiro N2400 2400 Verdadeiro N1200 1200 Invertido N9600 9600 Invertido N300 300 Invertido

Um valor numérico (uma variavél ou uma constante) irá enviar o caracter ASCII correspondente: 13 - retorno a primeira coluna

(34)

34 Um valor númerico precedido por um (#) , irá enviar a representação 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 ;aguarda até que o caracter seja recebido serialmente

; e armazena na variavel VALOR

PORTB = VALOR PAUSE 1 GOTO INICIO

(35)

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 ;aguarda até que o caracter "A" seja recebido serialmente

;e depois armazena o proximo valor recebido na variavel B2 PORTB = B2 PAUSE 1 GOTO INICIO END

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

(36)

36 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 começe 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

(37)

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 VAR PORTB.6 B0 var byte

B1 var byte

loop: 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 VAR BYTE TX VAR PORTC.0 loop1: Pause 1 B10 = B10 + 1 Select Case B10 Case 1

SEROUT TX,T2400,["loop1 case 1",10,13] Case 2

(38)

38 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 VAR PORTB.1 B0 var byte B1 var byte B2 var byte

EEPROM ["wxyz"] ' EEPROM[0..3] = 119..122 EEPROM 8,[100] ' EEPROM[8] = 100

loop:

B0 = 63 ' tamanho da memoria EEPROM For B1 = 10 To B0

(39)

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

(40)

40 12. Utilizando a memória EEPROM interna do PIC

Utilizando a memória EEPROM interna do PIC

O PIC 16F877 possui uma memória EEPROM (Electrically Erasable Programmable Read-Only Memory) que pode ser utilizada como memória de dados. Sua principal vantagem em relação a RAM esta no fato de não perder as informações com a falta de alimentação.

Sua principal utilização esta nos sistemas que devem memorizar dados como o último número discado em telefones, ajustes de som, cor, brilho, e outros em televisores, memória das estações nos rádios, códigos personalizados de acesso, entre várias outras possibilidades.

No PICBASIC, existem duas instruções para acessar a memória EEPROM interna:

WRITE endereço, valor ; escreve um valor na memória EEPROM interna do PIC

READ endereço, VAR ; lê o conteúdo de um endereço da EEPROM interna e armazena em VAR

1) Simule e explique o programa, quais endereços da EEPROM são acessados, e que valores são escritos? VAR1 VAR BYTE ;define variável VAR1

TRISB = %00000000 ;configura PORTB como saída VAR1 = 09

WRITE $20,VAR1 ;escreve o conteúdo de VAR1 no endereço 20h da ;EEPROM

PAUSE 1 ;espera 1ms

READ $20,PORTB ;le o conteúdo do endereço 20h da memória ;EEPROM, e transfere para PORTB

END ;fim do programa

2) Simule e explique o programa, quais endereços da EEPROM são acessados, e que valores são 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 = B0 PAUSE 1 PORTB = B1 PAUSE 1 PORTB = B2

(41)

WRITE 0,0 WRITE 1,0 WRITE 2,0 PAUSE 1 GOTO INICIO END

3) Elabore um programa para escrever os números de 20 a 25 na memória EEPROM do PIC;

4) Elabore um programa para armazenar seu prontuário, a data do seu nascimento a partir do endereço 10h da memória EEPROM do PIC;

5) Elabore um programa :

a) Primeiro, armazene o valor “01233438” na memória 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 memória EEPROM e depois mostre no display de LCD;

8) Elabore um programa para armazenar os números de 0 a 100 na memória EEPROM e depois leia estes valores e transmita serialmente por um pino do PIC;

9) Elabore um programa para preencher toda a memória 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 posições de memória tem o PIC 16F877 e elabore um programa para escrever AAh em todos os endereços da EEPROM;

(42)

42 12) Elabore um programa para escrever valores entre 0 e 255 aleatoriamente na memória EEPROM em todos os endereços;

13) Elabore um programa para para preencher 10 posições de memória EEPROM com valores aleatórios, e depois, leia estes endereços e escreva no PORTB;

14) Elabore um programa: a) Se Pino RD1 = 1

preencher a memória EEPROM com 02h, e escrever no LCD , “ MEMORIA OK” b) Se Pino RD1 = 0

(43)

13. Instrução PWM

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

Este comando é usado para gerar uma seqüência de pulsos modulados em largura (Pulse Width

Modulation),em um pino de saída Pin. Cada ciclo de modulação 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 parâmetro Cycle.

O tempo alcançado com o uso do parâmetro Cycle do comando PWM é dependente da freqüência do oscilador utilizado

Oscilador Duração (Cycle)

4MHz ~ 5ms

20MHz ~ 1ms

1) Simule o programa, e verifique o estado do pino de saída do PWM com o osciloscópio do simulador:

SAIDA VAR PORTB.7

CICLO_DE_TRABALHO VAR BYTE OUTPUT SAIDA

CICLO_DE_TRABALHO = 10

PWM SAIDA,CICLO_DE_TRABALHO,1 ;Produz uma seguencia de pulsos PWM, com duty ;cycle definido pela variável

CICLO_DE_TRABALHO, ;no PINO RB7, por 1 ciclo END

2) Modifique o programa 1, utilizando os seguintes valores para a variável CICLO_DE_TRABALHO:

CICLO_DE_TRABALHO FORMA DE ONDA

10 50 100 127 150 200 255

3) Modifique o programa 1, para que a saída 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, PWM de 50% no pino RB4 Se pino RC2 = 1 e RC0= 0 e RC1 = 0, 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

(44)

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

Motores de passo são dispositivos mecânicos eletro-magnéticos que podem ser controlados digitalmente através de um hardware especifico ou através de softwares. São usados em equipamentos onde a precisão é um fator muito importante. São usados em larga escala em impressoras, plotters, scanners, drivers de

disquetes, discos rígidos 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.

b) Passo Completo 2 (Full-step)

# Duas bobinas são energizadas a cad passo; # Maior torque;

#Consume mais energia que o passo completo 1; # Mairo velocidade.

No do passo Bobina Decimal A B C D

1 1 1 0 0 12

2 0 1 1 0 6

3 0 0 1 1 3

4 1 0 0 1 9

c) Meio passo (Half-step)

# A combinação 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 é próximo ao do Passo completo 2;

# A velocidade é menor que as dos passos anteriores. No do passo Bobina Decimal

A B C D 1 1 0 0 0 8 2 1 1 0 0 12 3 0 1 0 0 4 4 0 1 1 0 6 5 0 0 1 0 2 6 0 0 1 1 3 7 0 0 0 1 1 8 1 0 0 1 9

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

(45)

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

TRISC = %00000000 ;PORTC como saida INICIO: PORTC = %00001000 ;passo 1 PAUSE 1 PORTC = %00000100 ;passo 2 PAUSE 1 PORTC = %00000010 ;passo 3 PAUSE 1 PORTC = %00000001 ;passo 4 PAUSE 1 GOTO INICIO END Passo 1 Passo 2 Passo 3 Passo 4

(46)

46 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

TRISC = %00000000 ;PORTC como saida INICIO: PORTC = %00001100 ;passo 1 pause 1 PORTC = %00000110 ;passo 2 PAUSE 1 PORTC = %00000011 ;passo 3 PAUSE 1 PORTC = %00001001 ;passo 4 PAUSE 1 GOTO INICIO END

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 Passo 2 Passo 3 Passo 4 Passo 1

(47)

; Motor ligado no PORTC ; Bobina A - pino RC3 ; Bobina B - pino RC2 ; Bobina C - pino RC1 ; Bobina D - pino RC0

TRISC = %00000000 ;PORTC saida

PORTC = %00000000 ;limpa PORTC inicio: PORTC = %00001000 ;passo 1 pause 1 PORTC = %00001100 ;passo 2 PAUSE 1 PORTC = %00000100 ;passo 3 PAUSE 1 PORTC = %00000110 ;passo 4 PAUSE 1 PORTC = %00000010 ;passo 5 PAUSE 1 PORTC = %00000011 ;passo 6 PAUSE 1 PORTC = %00000001 ;passo 7 PAUSE 1 PORTC = %00001001 ;passo 8 PAUSE 1 GOTO INICIO END Passo 2 Passo 3 Passo 4

(48)

48 A direção (esquerda/direita) de um motor de passo

Para mudar a direção de rotação do motor, simplesmente inverta a seqüência dos passos conforme os exemplos abaixo:

Passo completo 1 (direita)

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

Passo completo 1 (esquerda)

No do passo Bobina Decimal A B C D

1 0 0 0 1 1

2 0 0 1 0 2

3 0 1 0 0 4

4 1 0 0 0 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 ;PORTC como saida INICIO: PORTC = %00001000 ;passo 1 PAUSE 1 PORTC = %00000100 ;passo 2 PAUSE 1 PORTC = %00000010 ;passo 3 PAUSE 1 PORTC = %00000001 ;passo 4 PAUSE 5 PORTC = %00000001 PAUSE 1 PORTC = %00000010 PAUSE 1 PORTC = %00000100 PAUSE 1 PORTC = %00001000 PAUSE 1 GOTO INICIO END

(49)

Construindo o hardware para conectar o motor de passo no microcontrolador

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

Motor

Microcontrolador Driver

Pode-se construir drivers utilizando transistores de potência como o BD135, TIP 31, etc. A maneira mais fácil é adquirir drivers prontos, como o ULN2003 ou ULN2803, que nada mais são que arrays de transistores Darlington que podem controlar correntes de até 500mA, que estão em forma de circuitos integrados prontos para serem usados em interfaces que necessitem controlar motores de passos, solenóides, 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 saídas. Com ele podemos controlar ate 2 motores de passo simultaneamente.

Exercícios:

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

(50)

50 Bobina C: Pino RB5

Bobina D: Pino RB4

2) Modifique o exemplo 2, para que o motor de passo, realize 2 rotações completas 3)Modifique o exemplo 3, para que o motor de passo realize 3 rotações completas 4) Modifique o exemplo 4, para que o motor de passo realize:

a) 2 rotações para a direita, depois, b) 3 rotações para a esquerda, depois, c) 1 rotação para a direita

5) Simule o programa abaixo e explique o que faz, quantas vezes o motor completa uma rotação 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

for CONTADOR =0 TO 2 STEP 1 PORTC = %00001000 ;passo 1 pause 1 PORTC = %00000100 ;passo 2 PAUSE 1 PORTC = %00000010 ;passo 3 PAUSE 1 PORTC = %00000001 ;passo 4 PAUSE 1 NEXT CONTADOR END

6) Modifique o exemplo 5, para que o programa realize 9 rotações completas

7) Modifique o exemplo 5 para que o programa realize 10 rotações para a direita e 10 rotações para esquerda 8) Modifique o exemplo 5, para que o programa realize 20 rotações (utilize a instrução 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

(51)

; Bobina D - pino RC0 CHAVE0 VAR PORTB.0

TRISB = %11111111 ;PORTB como entrada TRISC = %00000000 ;PORTC como saida INICIO: if CHAVE0 = 1 THEN PORTC = %00001000 ;passo 1 PAUSE 1 PORTC = %00000100 ;passo 2 PAUSE 1 PORTC = %00000010 ;passo 3 PAUSE 1 PORTC = %00000001 ;passo 4 PAUSE 1 ELSE PORTC = %00000001 ;passo 1 pause 1 PORTC = %00000010 ;passo 2 PAUSE 1 PORTC = %00000100 ;passo 3 PAUSE 1 PORTC = %00001000 ;passo 4 PAUSE 1 ENDIF 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 VAR BYTE

NUMERO1 VAR 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

(52)

52 PAUSE 1 PORTC = %00000001 ;passo 4 PAUSE 1 NEXT X CONVERTE: 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 LCD_DREG PORTB

DEFINE LCD_DBIT 0 DEFINE LCD_RSREG PORTB DEFINE LCD_RSBIT 6 DEFINE LCD_EREG PORTB DEFINE LCD_EBIT 7 DEFINE LCD_BITS 4 DEFINE LCD_LINES 2

DEFINE LCD_COMMANDUS 2000 DEFINE LCD_DATAUS 50 CONTADOR VAR BYTE

TRISC = %00000000 ;PORTC saida PORTC = %00000000 ;limpa PORTC Lcdout $fe, 1

(53)

FOR CONTADOR = 0 to 20 step 1

LCDOUT $FE,$C0

LCDOUT "ROTACAO = ", #CONTADOR PORTC = %00001000 ;passo 1 pause 1 PORTC = %00001100 ;passo 2 PAUSE 1 PORTC = %00000100 ;passo 3 PAUSE 1 PORTC = %00000110 ;passo 4 PAUSE 1 PORTC = %00000010 ;passo 5 PAUSE 1 PORTC = %00000011 ;passo 6 PAUSE 1 PORTC = %00000001 ;passo 7 PAUSE 1 PORTC = %00001001 ;passo 8 PAUSE 1 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=”

(54)

54 15. Utilizando Interrupções

A interrupção é uma técnica particular do PIC que permite interceptar eventos externos ao programa em execução, interrompe momentaneamente a operação do programa em andamento, controla o evento com uma subrotina apropriada e retorna para a execução do programa.

O PIC16F84 contém 4 tipos de interrupção:

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 endereço da EEPROM (EEPROM write complete interrupt). Habilitando interrupções

A interrupção 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 interrupção de troca de estado sobre a linha RB0 2. T0IE (bit 5) se este bit estiver em 1 habilitará a interrupção de final de contagem do registro TMR0 3. RBIE (bit 3) se este bit estiver em 1 habilitará a interrupção de troca de estado sobre uma das linhas

de RB4 a RB7

4. EEIE (bit 6) se este bit estiver em 1 habilitará a interrupção de final de escrita sobre um endereço da EEPROM

5. GIE (bit 7) este bit tem que estar em 1 para habilitar qualquer interrupção (Global INterrupt Enable bit) Dado que qualquer interrupção gera uma chamada do endereço 04H, no registro INTCON estará qual

interrupção foi gerada. No registro INTCON se tem:

1. INTF (bit 1) Se vale 1 a interrupção é um estado gerado na troca de estado em RB0.

2. T0IF (bit 2) Se vale 1 a interrupção é um estado gerado no termino da contagem do timer TMR0. 3. RBIF (bit 0) Se vale 1 a interrupção é um estado gerado na troca de estado de uma dos pinos RB4 a

RB7.

Obs.: Como não tem um bit especificando interrupção de fim de esrita na EEPROM, a rotina para tratar essa interrupção deve verificar se os outros bits de sinalização de interrupção estão em 0.

A rotina de interrupção deve zerar o bit sinalizador após tratar a interrupção.

Quando for gerada uma interrupção o PIC desabilita automatimamente o bit GIE (global Interrupt Enable) do registro INTECON de modo a desbilitar todas as interrupções restantes. Para poder retornar ao programa principal e reinicializar em 1 este bit deve-se utilisar a instrução em assembler RETFIE.

Mais informações:

(55)

Utilizando interrupções com o PICBASIC

Para se utilizar interrupções com o PICBASIC deve-se utilizar a seguinte estrutura:

ON INTERRUPT GOTO minha_interrupcao ‘rotina de atendimento de interrupção é ‘minha_interrupção

INTCON = %10010000 ‘habilita interrupção no pino RB0 ...

DISABLE ‘desabilita interrupção

minha_interrupcao: LED = 1

RESUME ‘retorna para o programa principal

ENABLE ‘habilita interrupções

Interrupção utilizando o pino RBO/INT

1) Simule o programa e explique seu funcionamento:

CHAVE0 VAR PORTB.0 LED7 VAR PORTB.7

TRISB = %00000001 'configura RB0 como entrada

ON INTERRUPT GOTO INTERRUPCAO 'define rotina de interrupçao

INTCON = %10010000 'habilita interrupçao INTE OPTION_REG.6 = 1 'na subida do sinal

LOOP:

LED7 = 1 'faz pino RB7 = 1

GOTO LOOP ' para sempre

'subrotina de atendimento de interrupçao

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

Interrupção utilizando a mudança dos pinos RB4-RB7 2) Simule o programa e explique seu funcionamento:

CHAVE7 VAR PORTB.7 LED1 VAR PORTB.1

(56)

56

TRISB = %11110001 'configura RB7-RB4 como entradas

ON INTERRUPT GOTO INTERRUPCAO 'define rotina de interrupçao

INTCON = %10001000 'habilita interrupçao RB4-RB7

LOOP:

LED1 = 1 'faz pino RB1 = 1 GOTO LOOP ' para sempre 'subrotina de atendimento de interrupçao

DISABLE 'desabilita interrupcoes

INTERRUPCAO:

'caso ocorra uma interrupcao LED1 = 0 'faz RB1 =0

PAUSE 10 ' espera 10ms

INTCON.0 = 0 'limpa flag de interrupcao RESUME

ENABLE 'retorna para o programa principal END

Interrupção como o overflow do TIMER 0 (pino RA4/T0CK)

3) Simule o programa abaixo e explique seu funcionamento:

CHAVE0 VAR PORTB.0 LED1 VAR PORTB.1

TRISB = %00000000 'configura PORTB como saida

ON INTERRUPT GOTO INTERRUPCAO 'define rotina de interrupçao TMR0 = 250

OPTION_REG.5 = 1 'na subida do sinal

INTCON = %10100000 'habilita interrupçao TOIE

LOOP:

LED1 = 1 'faz pino RB1 = 1

GOTO LOOP ' para sempre

'subrotina de atendimento de interrupçao

DISABLE 'desabilita interrupcoes

INTERRUPCAO:

'caso ocorra uma interrupcao LED1 = 0 'faz RB1 =0

PAUSE 2 ' espera 10ms

INTCON.2 = 0 'limpa flag de interrupcao TMR0 = 250

RESUME

ENABLE 'retorna para o programa principal END

(57)

4) Modifique o programa 1 para que a interrupção ocorra na descida do sinal no pino RB0/INT, anote o programa e simule.

5) Modifique o programa 1 para que quando ocorra a interrupção, faça os pinos RA1=1 e RA2=1 durante 1ms

6) Modifique o programa 2 para que quando ocorra a interrupção, faça o pino RA3=1 durante 2ms. 7) Modifique o programa 3 para que ocorra a interrupção quando forem aplicados 10 pulsos no pino

RA4/T0CKI

8) Modifique o programa 1 para que a cada interrupção, ocorra uma contagem das interrupções em um display de 7 segmentos

9) Modifique o programa 2 para que a cada interrupção, ocorra uma contagem das interrupções em um display LCD

10) Modifique o program 3 para que ocorra uma interrupção quando forem aplicados 8 pulsos no pino RA4/T0CKI, e a cada interrupção, mostrar a mensagem em um display de LCD, "contagem terminada"

Referências

Documentos relacionados

Para preparar a pimenta branca, as espigas são colhidas quando os frutos apresentam a coloração amarelada ou vermelha. As espigas são colocadas em sacos de plástico trançado sem

A tem á tica dos jornais mudou com o progresso social e é cada vez maior a variação de assuntos con- sumidos pelo homem, o que conduz também à especialização dos jor- nais,

Detectadas as baixas condições socioeconômicas e sanitárias do Município de Cuité, bem como a carência de informação por parte da população de como prevenir

Após a queima, para os corpos com a presença do sienito observou-se que os valores de densidade diminuíram (comparados às respectivas densidades a seco), já

No entanto, maiores lucros com publicidade e um crescimento no uso da plataforma em smartphones e tablets não serão suficientes para o mercado se a maior rede social do mundo

Acreditamos que o estágio supervisionado na formação de professores é uma oportunidade de reflexão sobre a prática docente, pois os estudantes têm contato

O valor da reputação dos pseudônimos é igual a 0,8 devido aos fal- sos positivos do mecanismo auxiliar, que acabam por fazer com que a reputação mesmo dos usuários que enviam

Os roedores (Rattus norvergicus, Rattus rattus e Mus musculus) são os principais responsáveis pela contaminação do ambiente por leptospiras, pois são portadores