Apostila de Microcontroladores PIC Utilizando a linguagem de programação PICBASIC Lázaro Aparecido Pires de Camargo
1
Sumário
1.Introduçã 1.Introdução o ................................ ................................................. .................................. .................................. ................................... ........................... ......... 3 2.Acessan 2.Acessando do os pinos de I/O .................................. ................................................... .................................. ................................ ............... 5 3.Instruçã 3.Instrução o FOR ... NEXT .................................. ................................................... .................................. .................................. ..................... .... 7 4.Instruçã 4.Instrução o IF...THEN...E IF...THEN...ELSE...E LSE...ENDIF NDIF ................................ ................................................. .................................. ..................... .... 9 5.Instruçã 5.Instrução o WHILE...WEN WHILE...WEND.................. D................................... .................................. .................................. .................................. ................. 11 6.Instruçã 6.Instrução o GOSUB .................................. .................................................... ................................... .................................. ............................ ........... 13 7.Exercícios de Revisão - Conceitos Básicos..................... Básicos............ ................... ................... .................. ................ ....... 17 8.Conectand 8.Conectando o um LCD em um microcontro microcontrolador lador PIC ................................... ........................................... ........ 20 9.Conectand 9.Conectando o um display display de 7 Segmentos............ Segmentos............................. .................................. ............................... .............. 24 10.Convers 10.Conversor or A/D............................................ A/D............................................................. .................................. .................................. ....................... ...... 27 11.Comunica 11.Comunicação ção Serial............................. Serial............................................... ................................... .................................. ............................ ........... 33 12.Utilizan 12.Utilizando do a memória EEPROM interna do PIC ................................ ................................................. ................. 40 13.Instruçã 13.Instrução o PWM ................................... .................................................... .................................. .................................. ............................... .............. 43 14.Controle de um motor de passo utilizando utilizando o microcontrolador microcontrolador PIC........... PIC.. ............. .... 44 15.Utilizan 15.Utilizando do Interrupç Interrupções ões ................................ ................................................. .................................. .................................. .................... ... 54 16.Conectan 16.Conectando do um teclado teclado no PIC ................................. .................................................. .................................. ....................... ...... 58 17.Módulo 17.Módulo Comparado Comparadorr Analógico Analógico ................................ ................................................. .................................. ....................... ...... 62 18.Microco 18.Microcontrol ntrolador ador PIC 12F675....................... 12F675........................................ .................................. .................................. .................... ... 66 19.Resumo do Compilador PicBasic Pro (PBP)................. (PBP)........ .................. .................. .................. .................. ......... 70
2
Sumário
1.Introduçã 1.Introdução o ................................ ................................................. .................................. .................................. ................................... ........................... ......... 3 2.Acessan 2.Acessando do os pinos de I/O .................................. ................................................... .................................. ................................ ............... 5 3.Instruçã 3.Instrução o FOR ... NEXT .................................. ................................................... .................................. .................................. ..................... .... 7 4.Instruçã 4.Instrução o IF...THEN...E IF...THEN...ELSE...E LSE...ENDIF NDIF ................................ ................................................. .................................. ..................... .... 9 5.Instruçã 5.Instrução o WHILE...WEN WHILE...WEND.................. D................................... .................................. .................................. .................................. ................. 11 6.Instruçã 6.Instrução o GOSUB .................................. .................................................... ................................... .................................. ............................ ........... 13 7.Exercícios de Revisão - Conceitos Básicos..................... Básicos............ ................... ................... .................. ................ ....... 17 8.Conectand 8.Conectando o um LCD em um microcontro microcontrolador lador PIC ................................... ........................................... ........ 20 9.Conectand 9.Conectando o um display display de 7 Segmentos............ Segmentos............................. .................................. ............................... .............. 24 10.Convers 10.Conversor or A/D............................................ A/D............................................................. .................................. .................................. ....................... ...... 27 11.Comunica 11.Comunicação ção Serial............................. Serial............................................... ................................... .................................. ............................ ........... 33 12.Utilizan 12.Utilizando do a memória EEPROM interna do PIC ................................ ................................................. ................. 40 13.Instruçã 13.Instrução o PWM ................................... .................................................... .................................. .................................. ............................... .............. 43 14.Controle de um motor de passo utilizando utilizando o microcontrolador microcontrolador PIC........... PIC.. ............. .... 44 15.Utilizan 15.Utilizando do Interrupç Interrupções ões ................................ ................................................. .................................. .................................. .................... ... 54 16.Conectan 16.Conectando do um teclado teclado no PIC ................................. .................................................. .................................. ....................... ...... 58 17.Módulo 17.Módulo Comparado Comparadorr Analógico Analógico ................................ ................................................. .................................. ....................... ...... 62 18.Microco 18.Microcontrol ntrolador ador PIC 12F675....................... 12F675........................................ .................................. .................................. .................... ... 66 19.Resumo do Compilador PicBasic Pro (PBP)................. (PBP)........ .................. .................. .................. .................. ......... 70
2
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 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
RE2
RE1
RE0
PORTE 3
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
0
0
0
0
0
0
Configuração da PORTC:
c) TRISD =%00000000 0
0
Configuração da PORTC:
4
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
PORTB=%
END
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 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..)
5
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 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
6
3. Instrução FOR...NEXT conta = inicio TO fim {STEP {-} Inc } {Corpo } NEXT {Conta }
FOR
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 Serout 0, N2400,[#i, “ “]
‘Conta de 1 a 10 ‘Envia cada numero para
‘ Pin0 serialmente ‘ Retorna e faz a proxima contagem
NEXT i
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 FOR A = 0 TO 3 STEP 2 PORTB = PORTB >> 1 7
PAUSE 2 NEXT A END
c)
CONTADOR
VAR
BYTE
TRISB = %00000000 FOR CONTADOR = 0 TO 9 PORTB = CONTADOR PAUSE 2 NEXT CONTADOR END d)
VOLTA:
X
VAR
BYTE
TRISB = %00000000 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;
8
4. Instrução IF...THEN...ELSE...ENDIF Comp {AND/OR Comp ...} Comp {AND/OR Comp …} Declaração…
IF IF
THEN Rotulo THEN
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
If
B0 <> 10 Then B0 = B0 + 1 B1 = B1 - 1
Endif
pushd
' Se a pino RA0 for igual ' a zero, salte para o ' rótulo pushd ' Se B0 for diferente de 10, faça ' incrementa B0 ' incrementa B1
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 THEN MOTOR1 = 1 PAUSE 1 ELSE MOTOR1 = 0 PAUSE 1 ENDIF IF CHAVE2 =1
THEN
MOTOR2 = 1 PAUSE 1 ELSE MOTOR2 = 0 PAUSE 1 ENDIF 9
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.
10
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 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. Instrução GOSUB
Salta para a subrotina em Rotulo. ....... ....... beep: High 0
GOSUB beep
‘Executa subrotina chamada beep
Sound 1,[80,10] Low 0 Return
‘Ligue o Led ligado em Pin0 ‘Bipe no Alto-falante 'Desliga o Led ‘Volta p/ rotina principal
1) Simule os programas abaixo: a) LAMPADA1 LAMPADA2 LAMPADA3 LAMPADA4 LAMPADA5
VAR VAR VAR VAR 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
DIREITA ESQUERDA DIREITA 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:
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 são as vantagens de se utilizar subrotinas em um programa? 8) Qual é a ultima instrução em uma subrotina?
16
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: Constante 45 100 %00110011 "TIMAO" $BA
Tipo
Constante %11111111 "2007" 240 $FE %10001111
Tipo 3) Como estão configurados os pinos das portas (entrada ou saída), com os seguintes valores dos registros TRIS:
a) TRISB = %00110001 RB7 RB6 RB5 RB4
RB3
RB2
RB1
RB0
b) TRISC = %11100101 RC7 RC6 RC5 RC4
RC3
RC2
RC1
RC0
4) Simule os programas abaixo: a) LED5 VAR LED7 VAR
PORTB.5 PORTB.7
TRISB = %00000000 PORTB = %00000000 LED5 = 1 LED7 = 1
PORTB =
END
b) A
VAR
BYTE
TRISB = %00000000 PORTB = %10000000 FOR A = 0 TO 5 PORTB = PORTB >> 1
17
PAUSE NEXT A END
5
PORTB =
c) 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
PORTB =
END
d) TEMP LED3
VAR VAR
PORTD.1 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 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 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
19
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 2 3 4 5 6 7 8 9 10 11 12 13 14
Vss Vdd Vo RS R/W E D0 D1 D2 D3 D4 D5 D6 D7
Terra, 0V Alimentação, +5V Ajuste da tensão de contraste Seleção – Dados/Controle Leitura/Escrita no LCD Enable – Habilitação 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 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 $FE,2 $FE,$0C $FE,$0E $FE,$0F $FE,$10 $FE,$14 $FE,$C0
Limpa o display Retorno (inicio da primeira linha) Cursor desligado Cursor sublinhado ligado Cursor piscante Move o cursor uma posição à esquerda Move o cursor uma posição à 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 conexão do LCD no microcontrolador, utilizando-se comandos DEFINE.
20
1) Simule o programa abaixo: (obs. Não se esqueça de configurar o modulo LCD na simulação)
RB7 RB6 RB5 RB4
D7 D6 D5 D4
Microcontrolador
LCD
PIC
RB1 RB0
RS E 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 LCDOUT "OI"
;Limpa LCD ;Escreve "OI" no LCD
PAUSE 1
;Espera 1ms
LCDOUT $FE,$C0 LCDOUT "GENTE AMIGA"
;Move o cursor para a segunda linha ;Escreve "GENTE AMIGA"
goto inicio
end
21
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 LCDOUT "CONTADOR = ",#CONTADOR
;Limpa LCD ;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
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 “lâmpadas 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:
Confi ura ão de um dis la catodo
Pode-se conectar um display de 7 segmentos anodo comum ao PIC 16F84 da seguinte forma:
5 Number 6 0
1001 0010 Segments 1000 1100 0010 0000
$92 Hex $82 $C0
7 1 8 2
1111 1111 1000 1001 1000 1010 0000 0100
$F8 $F9 $80 $A4
9 3
1001 1011 1000 0000
$98 $B0
4
1001 1001
$99
Exemplo para escrever “O” em um display de 7 segmentos anodo comum: TRISB = %00000000 PORTB = %11000000
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 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
25
WHILE SENSOR1 = 1 PORTB = %11111001 WEND GOTO VOLTA d)
END
X NUMERO1
VAR
BYTE
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.
26
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
O módulo conversor A/D do PIC 16F877 tem 8 canais como mostra a figura abaixo:
27
ADCIN
Instrução 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 DEFINE DEFINE
'define uma variável de 8 bits
ADC_BITS 8 ADC_CLOCK 3 ADC_SAMPLEUS 50
'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
' PORTA como entrada 'PORTB como saída 'PORTA como entrada analógica
ADCIN 0,LEITURA
' Le canal 0 (RA0) e armazena na variável Leitura
PORTB = LEITURA END
' Escreve Leitura no PORTB
As configurações do registro ADCON1 estão 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 número 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, 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 DEFINE DEFINE
ADC_BITS ADC_CLOCK ADC_SAMPLESUS
VAR
ADVAL
10 3 50
' ajusta número de bits do conversor A/D ' ajusta fonte de clock ' ajusta o tempo de amostragem em us
WORD
TRISA = %11111111 TRISB = %00000000 ADCON1 = %10000010 INICIO:
ADCIN IF
0,ADVAL
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: PORTB = %00011111
30
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 DEFINE DEFINE DEFINE DEFINE DEFINE
LCD_DREG LCD_DBIT LCD_RSREG LCD_RSBIT LCD_EREG LCD_EBIT
PORTD 4 PORTD 0 PORTD 1
DEFINE DEFINE
LCD_BITS LCD_LINES
4 2
DEFINE DEFINE
LCD_COMMANDUS LCD_DATAUS
2 5
'Define parametros do conversor A/D
DEFINE DEFINE DEFINE
ADC_BITS ADC_CLOCK ADC_SAMPLEUS
LEITURA_AD LEITURA_MV
10 3 50
VAR VAR
' ajusta numero de bits do conversor A/D ' ajusta fonte de clock (3=rc) ' ajusta tempo de amostragem em microssegundos
WORD WORD
TRISA = %111111111 ADCON1 = %10000010
LCDOUT LCDOUT
$FE,1 "VALOR DO A/D"
' LIMPA DISPLAY
INICIO:
ADCIN
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 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"
32
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 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 numérico (uma variavél ou uma constante) irá enviar o caracter ASCII correspondente: 13 - retorno a primeira coluna 10 - avanço de linha
33
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 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
;aguarda até que o caracter "A" seja recebido ;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
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 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 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
VAR var var
PORTB.6 byte 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 TX
VAR VAR
BYTE PORTC.0
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]
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
VAR var var var
EEPROM EEPROM
["wxyz"] 8,[100]
PORTB.1 byte byte byte
loop: B0 = 63 For B1 = 10 To B0 B2 = B1 + 100
' EEPROM[0..3] = 119..122 ' EEPROM[8] = 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 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 TRISB = %00000000
;define variável VAR1 ;configura PORTB como saída
VAR1 = 09 WRITE $20,VAR1 PAUSE 1 READ $20,PORTB END
;escreve o conteúdo de VAR1 no endereço 20h da ;EEPROM ;espera 1ms ;le o conteúdo do endereço 20h da memória ;EEPROM, e transfere para PORTB ;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 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 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; 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;
41
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 preencher a memória EEPROM com 20h, e escrever no LCD, “ MEMORIA RUIM”
42
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 4MHz 20MHz
Duração (Cycle) ~ 5ms ~ 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, 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
43
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. No do passo 1 2 3 4
A 1 0 0 0
Bobina B C 0 0 1 0 0 1 0 0
Decimal D 0 0 0 1
8 4 2 1
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 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 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 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
TRISC = %00000000
Passo 1
;PORTC como saida
INICIO: PORTC = %00001000
;passo 1 Passo 2
PAUSE 1 PORTC = %00000100
;passo 2
PAUSE 1 PORTC = %00000010
;passo 3
PAUSE 1 PORTC = %00000001 PAUSE 1
;passo 4 Passo 3
GOTO INICIO END
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
TRISC = %00000000
Passo 1
;PORTC como saida
INICIO: PORTC = %00001100
;passo 1
Passo 2
pause 1 PORTC = %00000110
;passo 2
PAUSE 1 PORTC = %00000011
;passo 3
PAUSE 1 PORTC = %00001001
;passo 4
PAUSE 1
Passo 3
GOTO INICIO END
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
TRISC = %00000000
;PORTC saida
PORTC = %00000000
;limpa PORTC
inicio: PORTC = %00001000
Passo 2
;passo 1
pause 1 PORTC = %00001100
;passo 2
PAUSE 1 PORTC = %00000100
;passo 3
PAUSE 1 PORTC = %00000110
;passo 4
Passo 3
PAUSE 1 PORTC = %00000010
;passo 5
PAUSE 1 PORTC = %00000011
;passo 6
PAUSE 1 PORTC = %00000001
;passo 7
PAUSE 1 PORTC = %00001001
Passo 4
;passo 8
PAUSE 1 GOTO INICIO END
47
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 A 1 1 2 0 3 0 4 0
Bobina B C 0 0 1 0 0 1 0 0
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 0 0 0 1
8 4 2 1
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 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 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 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 PORTC pause PORTC PAUSE PORTC PAUSE PORTC PAUSE
= 1 = 1 = 1 = 1
STEP 1
%00001000
;passo 1
%00000100
;passo 2
%00000010
;passo 3
%00000001
;passo 4
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
50
; Bobina D - pino RC0 CHAVE0 VAR PORTB.0 TRISB = %11111111 TRISC = %00000000
;PORTB como entrada ;PORTC como saida
INICIO: if
CHAVE0 = 1 THEN PORTC PAUSE PORTC PAUSE PORTC PAUSE PORTC PAUSE
= 1 = 1 = 1 = 1
%00001000
;passo 1
%00000100
;passo 2
%00000010
;passo 3
%00000001
;passo 4
PORTC pause PORTC PAUSE PORTC PAUSE PORTC PAUSE ENDIF
= 1 = 1 = 1 = 1
%00000001
;passo 1
%00000010
;passo 2
%00000100
;passo 3
%00001000
;passo 4
ELSE
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
;passo 4
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 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
;passo 1
%00001100
;passo 2
%00000100
;passo 3
%00000110
;passo 4
%00000010
;passo 5
%00000011
;passo 6
%00000001
;passo 7
%00001001
;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 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. 2. 3. 4.
A troca de estado em RB0 (External interrupt RB0/INT pin). Ao final da contagem do registro TMR0 (TMR0 overflow interrupt). A troca de estado sobre uma das linhas de RB4 a RB7 (PORTB change interrupts). 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: http://www.dpi.ufv.br/disciplinas/inf251/files/processadores/cursopic/node1.html
54
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 minha_interrupcao: LED = 1 RESUME ENABLE
‘desabilita interrupção ‘retorna para o programa principal ‘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 OPTION_REG.6 = 1
'habilita interrupçao INTE 'na subida do sinal
LED7 = 1
'faz pino RB7 = 1
GOTO LOOP
' para sempre
LOOP:
'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
55
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: 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
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 TMR0 = 250 OPTION_REG.5 = 1 INTCON = %10100000
'define rotina de interrupçao 'na subida do sinal 'habilita interrupçao TOIE
LED1 = 1
'faz pino RB1 = 1
GOTO LOOP
' para sempre
LOOP:
'subrotina de atendimento de interrupçao 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 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"
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. Módulo Comparador Analógico 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
;entrada VIN;entrada VIN+ ;C2OUT
PORTB.0
TRISA = %11111111 TRISB = %00000000 CMCON = 5
;comparador trabalhando no modo 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 saída do comparador 3) Modifique o programa 1, para que escreva no PORTB os seguintes valores: a) se a tensão na entrada AN2 for maior que a tensão na entrada AN1, escrever %11111111 no PORTB b) se a tensão na entrada AN2 for menor que a tensão na entrada AN1, escrever %01010101 no PORTB 4) Simule e explique o funcionamento do programa: ENTRADA1 ENTRADA2 LED7 SAIDA_COMP2
var VAR var var
PORTA.1 PORTA.2 PORTA.7 CMCON.7
FLAG CONTADOR
VAR VAR
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 estão 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
;comparador trabalhando no modo 2 ;configura referencia de tensão VREF = 1,25V
CLEAR INICIO: IF SAIDA_CP1 = 1 THEN LED0 = 1 ELSE LED0 = 0
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 estão sendo utilizadas agora? 8) Modifique o programa “6”, para trabalhar com uma tensão de referência de 3,59V 9) Modifique o programa “6”, para trabalhar com uma tensão de referência de 1,04V 10) Elabore um programa que meça 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 estão 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
;comparador trabalhando no modo 3
CLEAR INICIO: IF SAIDA_CP1 = 1 THEN LED5 = 1 ELSE LED5 = 0 ENDIF IF SAIDA_CP2 = 1 THEN LED7 = 1 ELSE LED7 = 0
64
ENDIF GOTO INICIO END
12) Modifique o programa “11” para que: a) se a tensão na entrada AN0 for menor que a tensão de referencia, acionar o pino RB0 durante 2ms b) se a tensão na entrada AN1 for maior que a tensão de referência, 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 tensão na entrada AN0 for maior que a referencia, ativar a saida RB0 b) quando a tensão na entrada AN0 for menor que a referencia, ativar a saida RB3 c) quando a tensão na entrada AN1 for maior que a referencia, ativar a saida RB5 d) quando a tensão na entrada AN1 for menor que a referência, ativar a saída RB6
65
18. Microcontrolador PIC 12F675
6 pinos de I/O 1 comparador analógico 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
;configura todos os pinos como I/O ;comparadores analógicos desligados
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
;LED como GPIO.0 ; todos os pinos como I/O digital ; comparador desligado
TRISIO=%00000000 LOOP:
66
LOW LED PAUSE 5
;liga LED em GPIO.0 ;atraso de 5 milisegundos
HIGH LED PAUSE 5
;desliga LED em GPIO.0 ;atraso de 5 milisegundos
GOTO LOOP
;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"
;definicoes para
Serout
DEFINE CHAR_PACING 500
;Define parametros para ADCIN Define Define Define
ADC_BITS ADC_CLOCK ADC_SAMPLEUS
TX
GPIO.1
; pino de transmissao em GP0
byte
; cria adval para armazenar o resultado
Var
adval var
ADCON0.7 = 0 ANSEL = %00111000 CMCON = 7 Pause 1 loop: ADCIN 3, adval Serout TX, T2400, ["
8 3 50
; numero de bits no resultado ; fonte de clock (3=rc) ; tempo de amostragem em us
; justifica resultado para a esquerda ; AN3 analogico, restante digital ; comparador analogico desligado ; espera 1 ms ; Le canal 3 para adval Valor: ", #adval,13,10]
;Mostra valor em decimal
Pause 1
; espera 1 ms
Goto loop
; faz para sempre
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: @
device
mclr_off
LED PB
var GPIO.0 Var GPIO.3
ANSEL = 0 CMCON = 7
; ;
GPIO.0 -> led GPIO.3 -> push button
; todos os pinos i/o digital ; comparadores desligados
loop: If PB = 0 Then Low LED Else High LED Endif Goto loop End
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 padrão 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 extensão .BAS . Exemplo: programa BLINK.BAS ‘ Programa exemplo para piscar um LED ligado ao ‘ pino PORTB loop: High
PORTB.0 Pause 500
‘ liga o led ‘ atraso de 0.5 seg
Low
PORTB.0 Pause 500
‘ desliga o led ‘ atraso de 0.5 seg
Goto
loop
‘ volta ao loop
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 Rótulos de linha ou “label”
Usados para marcar declarações , para referencia com os comandos GOTO ou GOSUB. aqui: Serout 0,N2400, [“Olah, Pessoal!”, 13,10} Goto aqui Variáveis
Variáveis são onde dados temporários são guardados num programa do PicBasicPro. São criadas com a palavra-chave “VAR” Variáveis podem ser bits, bytes ou palavras. Rótuto
VAR Tamanho{.Modificadores}
Cao Gato
var var
byte bit
‘ cao é uma var de 8 bits ‘ gato é uma var de 1 bit
70
w0
var
word
‘ w0 é uma var de 2 bytes
Aliases
VAR pode também ser usada para criar um “alias” (um outro nome) para uma variável. Toto
var
cao
‘ toto é outro nome de cao
Pulga
var
cao.0
‘ pulga e´ o bit0 de cao
b0
var
w0.byte0
‘b1 e´o primeiro byte de w0
b1
var
w0.byte1 ‘b0 e´o segundo byte de w0
Constantes
Rotulo COM Expressao constante Ratos Ratoeiras
con con
3 ratos * 1000
'Ratos = 3
Constantes Numéricas
Constante Decimal:
100
Constante Binária:
%10100101
Constante hexadecimal:
$F2
Constante de caracteres:
‘Valor decimal 100
“d”
Pinos
Os pinos podem ser acessados usando o nome PORTe o número do bit: PORTB.1 = 1 ‘ Fixa PORTB, bit 1 em Lázaro 1 Pode-se atribuir um nome para um pino, usando o comando VAR: Led
var
PORTA.3 High
led
‘renomeia PORTA.3 ‘como led ‘fixa led em nivel alto
Para configuar um pino ou porta como saída ou entrada, utiliza-se o registrador TRIS Fixando um bit TRIS em 0, torna o pino uma saída. Fixando um bit TRIS em 1, torna o pino uma entrada. TRISA = %00000000 TRISB = %11111111
‘ todos os pinos do PORTA ‘ como saídas ‘ todos os pinos do PORTB ‘ como entradas
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
DEFINE
HSER_BAUD 2400
Operações Matemáticas
Op. Matemático + * ** */ / // << n >> n ABS COS SIN SQR MAX MIN DCD NCD DIG REV & | ^ ~ &/ |/ ^/
Descrição
Adição Subtração Multiplicação 16 bits superiores da multiplicação 16 bits do meio da multiplicação Divisão Resto (Modulo) Deslocamento p/ Esquerda n posições Deslocamento p/ Direita n posições Valor Absoluto Cosseno Seno Raiz Quadrada Máximo Minimo Decodifica 2n Codifica Digito Inverte Bits AND Lógico OR Lógico OR exclusivo Lógico (XOR) NOT Lógico (inversora) NOT AND Lógico NOT OR Lógico NOT OR Exclusivo Lógico
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
‘Isola o bit 0 de B0
B0 = B0 | %00000001
‘Liga o bit 0 de B0
B0 = B0 ^ %00000001
‘Inverte o estado do
‘bit 0 de B0
72
Operadores de Comparação
São usados em declarações IF...THEN para comparar uma expressão com outra. Operador de Descrição Comparação = ou == Igual <> ou != Não Igual < Menor que > Maior que <= Menor ou Igual a >= Maior ou Igual a Exemplo: If I > 10 Then loop Operadores Lógicos
Os operadores lógicos diferem dos operadores a bit. Eles produzem um resultado verdadeiro/falso de sua operação. Valores de 0 são tratados como falso. Qualquer valor é tratado como verdadeiro. Eles são mais usados em conjunto com os operadores IF...THEN. Operador Lógico AND ou && OR ou || XOR ou ^^ NOT AND NOT OR NOT XOR
Descrição AND Lógico OR Lógico OR Exclusivo Lógico NAND Lógico NOR Lógico NXOR Lógico
If (A == maior) AND (B > medio) Then run Algumas declarações do PicBasicPro FOR...NEXT conta = inicio TO fim {STEP {-} Inc } {Corpo } NEXT {Conta }
FOR
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 Serout 0, N2400,[#i, “ “]
‘Conta de 1 a 10 ‘Envia cada numero para
NEXT i
‘ Pin0 serialmente ‘ 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, “ “]
73
NEXT B2
‘retorna e faz a proxima contagem
Serout 0,N2400,[10] ‘Envia um avanço de linha GOSUB
Rotulo
Salta para a subrotina em Rotulo. ....... ....... beep: High 0
GOSUB beep
‘Executa subrotina chamada beep
Sound 1,[80,10] Low 0 Return
‘Ligue o Led ligado em Pin0 ‘Bipe no Alto-falante 'Desliga o Led ‘Volta p/ rotina principal
IF...THEN...ELSE...ENDIF IF IF
Comp {AND/OR Comp ...} Comp {AND/OR Comp …} Declaração…
THEN Rotulo THEN
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
If
B0 <> 10 Then B0 = B0 + 1 B1 = B1 - 1
Endif
pushd
' Se a pino RA0 for igual ' a zero, salte para o ' rótulo pushd ' Se B0 for diferente de 10, faça ' incrementa B0 ' incrementa B1
WHILE...WEND WHILECondição Declaração......
WEND
Executa repetidamente "Declaração" enquanto (While) a Condição for verdadeira. Exemplo: i =1 WHILE i <= 10 Serout PortB.7,N2400,["No:", #i,13,10] i=i+1 WEND
'menor ou igual a
'Enquanto i for 'igual a 10,e ' executa....
74
HIGH pino
Faz o pino especificado ir para nível alto (5V). HIGH PORTA.0
' pino RA0 = 1 (5V)
led
PORTB.4
var HIGH led
' define RB4 como led ' led = 1
Outro modo de levar um pino, para nivel alto, se ele ja foi configurado como saída, é: PORTB.4 = 1
' Fixa o pino RB4 em nivel alto (5V)
LOW pino
Faz o pino especificado ir para nível baixo (0V). LOW PORTA.0
' pino RA0 = 0 (0V)
lampada
PORTB.5 'define RB5 como lampada LOW lampada ' lampada = 0
var
Outro modo de levar um pino, para nivel baixo, se ele ja foi configurado como saída, é: PORTB.4 = 0 PAUSE
' Fixa o pino RB4 em nivel baixo (0V) período
Faz uma pausa no programa, durante "periodo" milisegundos. Periodo pode ser de 0ms até 65535 milisegundos. PAUSE
1000
PAUSEUS
periodo
'Atraso de 1 segundo
Faz uma pausa no programa durante "periodo" microsegundos. Período pode ser de 24us ate 65535us. PAUSEUS
1000 'Atraso de 1 milisegundo
SOUND pino,[Nota,Duração{,Nota,Duração...}]
Gera tons no pino especificado. se "Nota" 0 é silencio Notas de 1 a 127 são tons Notas de 128 a 255 são ruidos brancos Nota 1 é de 78,74Hz Nota 127 é de 10KHz Duraçao é 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
10uF PINO
+
ALTO-FALANTE
SOUND PORTB.7, [100,10,50,10] ' envia 2 sons ' consecutivos no pino 'RB7. WHITE Endereço, Valor
Escreve "Valor" na EEPROM do microcontrolador no "Endereço" especificado. temporizado, e leva cerca de 10 milisegundos para ser executado. Ex: WRITE5,B0
Cada Write é auto-
' Envia valor de B0 para o endereço 5 'da EEPROM do PIC
READ Endereço, Var
Lê o conteúdo do endereço especificado da EEPROM, e guarda o resultado na variavel "Var". Ex: READ
5,B2
' Lê o conteúdo do endereço 5 da ' EEPROM, e armazena na variável ' B2
SERIN pino, modo, {timeout, rotulo,} { [ Qualificador...],} {Item....}
Recebe um ou mais itens no Pino no formato assincrono padrão, 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 assíncrono padrão 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 avanço de 'lingua, no pino PORTA.3, 'serialmente Algumas outras declarações disponiveis no PicBasicPro:
DEBUG DTMFOUT LCDOUT PULSIN PULSOUT
: Saída serial assíncrona p/ um pino : Gera tons de discagem em um pino : Mostra caracteres em um LCD : Mede a largura de um pulso em um pino : Gera pulso em um pino
76