57056742 Apostila Microcontroladores Lazaro 1

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

Transcript of 57056742 Apostila Microcontroladores Lazaro 1

Page 1: 57056742 Apostila Microcontroladores Lazaro 1

1

Apostila de Microcontroladores PIC

Utilizando a linguagem de programação PICBASIC

Lázaro Aparecido Pires de Camargo

Page 2: 57056742 Apostila Microcontroladores Lazaro 1

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 micro controlador 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 19.Resumo do Compilador PicBasic Pro (PBP)......... ............................................ 70

Page 3: 57056742 Apostila Microcontroladores Lazaro 1

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 PORTE RE2 RE1 RE0

Page 4: 57056742 Apostila Microcontroladores Lazaro 1

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:

Page 5: 57056742 Apostila Microcontroladores Lazaro 1

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=%

PORTB=%

Page 6: 57056742 Apostila Microcontroladores Lazaro 1

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. 10) Modifique o exercicio 9, incluindo a PORTD

Page 7: 57056742 Apostila Microcontroladores Lazaro 1

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 FOR A = 0 TO 3 STEP 2 PORTB = PORTB >> 1

Page 8: 57056742 Apostila Microcontroladores Lazaro 1

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;

Page 9: 57056742 Apostila Microcontroladores Lazaro 1

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 ENDIF

Page 10: 57056742 Apostila Microcontroladores Lazaro 1

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.

Page 11: 57056742 Apostila Microcontroladores Lazaro 1

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 o u 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 END

Page 12: 57056742 Apostila Microcontroladores Lazaro 1

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 6) Elabore um programa , que, enquanto o pino RD5 = 0, fazer o pino RC0 piscar a cada 1 ms.

Page 13: 57056742 Apostila Microcontroladores Lazaro 1

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

Page 14: 57056742 Apostila Microcontroladores Lazaro 1

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:

Page 15: 57056742 Apostila Microcontroladores Lazaro 1

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

Page 16: 57056742 Apostila Microcontroladores Lazaro 1

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? 8) Qual é a ultima instrução em uma subrotina?

Page 17: 57056742 Apostila Microcontroladores Lazaro 1

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

Page 18: 57056742 Apostila Microcontroladores Lazaro 1

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

Page 19: 57056742 Apostila Microcontroladores Lazaro 1

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

Page 20: 57056742 Apostila Microcontroladores Lazaro 1

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 Tambem deve-se definir como é a conexão do LCD no microcontrolador, utilizando-se comandos DEFINE.

Page 21: 57056742 Apostila Microcontroladores Lazaro 1

21

1) Simule o programa abaixo: (obs. Não se esqueça de configurar o modulo LCD na simulação)

MicrocontroladorPIC

LCD

RB7

RB6

RB5

RB4

RB1

RB0 E

RS

D7

D6

D5

D4

R/W GND

DEFINE LCD_DREG PORTB ;PORTB conectado nas li nhas 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 d o 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 comun icação de 4 bits com o LCD DEFINE LCD_LINES 2 ;Define display de 2 li nhas DEFINE LCD_COMMANDUS 2000 ;Define atraso para env io de comandos para o LCD DEFINE LCD_DATAUS 50 ;Define atraso para env io 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 s egunda linha LCDOUT "GENTE AMIGA" ;Escreve "GENTE AMIGA" goto inicio end

Page 22: 57056742 Apostila Microcontroladores Lazaro 1

22

2) Modifique o programa 1, para escrever seu nome no LCD; 3) Simule o programa abaixo: DEFINE LCD_DREG PORTB ;PORTB conectado nas li nhas 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 d o 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 comun icação de 4 bits com o LCD DEFINE LCD_LINES 2 ;Define display de 2 li nhas DEFINE LCD_COMMANDUS 2000 ;Define atraso para env io de comandos para o LCD DEFINE LCD_DATAUS 50 ;Define atraso para env io de dados para o LCD CONTADOR VAR BYTE INICIO: LCDOUT $FE,1 ;Limpa LCD LCDOUT "CONTADOR = ",#CONTADOR ;Escre ve valor da variavel contador CONTADOR = CONTADOR + 1 ;Incre menta variavel contador PAUSE 1 ;Esper a 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

Page 23: 57056742 Apostila Microcontroladores Lazaro 1

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”

Page 24: 57056742 Apostila Microcontroladores Lazaro 1

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

Page 25: 57056742 Apostila Microcontroladores Lazaro 1

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

Page 26: 57056742 Apostila Microcontroladores Lazaro 1

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.

Page 27: 57056742 Apostila Microcontroladores Lazaro 1

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 O módulo conversor A/D do PIC 16F877 tem 8 canais como mostra a figura abaixo:

Page 28: 57056742 Apostila Microcontroladores Lazaro 1

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

As configurações do registro ADCON1 estão mostradas abaixo:

Page 29: 57056742 Apostila Microcontroladores Lazaro 1

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

Page 30: 57056742 Apostila Microcontroladores Lazaro 1

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: PORTB = %00011111

Page 31: 57056742 Apostila Microcontroladores Lazaro 1

31

GOTO INICIO END 5) Modifique o programa 4, para o conversor trabalh ar 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 END

Page 32: 57056742 Apostila Microcontroladores Lazaro 1

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"

Page 33: 57056742 Apostila Microcontroladores Lazaro 1

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 10 - avanço de linha

Page 34: 57056742 Apostila Microcontroladores Lazaro 1

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 ca racter seja recebido serialmente ; e armazena na variavel VALOR PORTB = VALOR PAUSE 1 GOTO INICIO END

Page 35: 57056742 Apostila Microcontroladores Lazaro 1

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 ca racter "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

Page 36: 57056742 Apostila Microcontroladores Lazaro 1

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 IF (B0 < "a") or (B0 > "z") then IMPRIMA

Page 37: 57056742 Apostila Microcontroladores Lazaro 1

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 SEROUT TX,T2400,["loop1 case 2",10,13]

Page 38: 57056742 Apostila Microcontroladores Lazaro 1

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 EE PROM For B1 = 10 To B0 B2 = B1 + 100 ' EEPROM[10..63] = 110. .163

Page 39: 57056742 Apostila Microcontroladores Lazaro 1

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

Page 40: 57056742 Apostila Microcontroladores Lazaro 1

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

Page 41: 57056742 Apostila Microcontroladores Lazaro 1

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;

Page 42: 57056742 Apostila Microcontroladores Lazaro 1

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 preencher a memória EEPROM com 20h, e escrever no LCD, “ MEMORIA RUIM”

Page 43: 57056742 Apostila Microcontroladores Lazaro 1

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

Page 44: 57056742 Apostila Microcontroladores Lazaro 1

44

14. Controle de um motor de passo utilizando o micr ocontrolador 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 4 0 0 0 1 1

Page 45: 57056742 Apostila Microcontroladores Lazaro 1

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

Page 46: 57056742 Apostila Microcontroladores Lazaro 1

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

Page 47: 57056742 Apostila Microcontroladores Lazaro 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

Page 48: 57056742 Apostila Microcontroladores Lazaro 1

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

Page 49: 57056742 Apostila Microcontroladores Lazaro 1

49

Construindo o hardware para conectar o motor de pas so no microcontrolador

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

MotorMicrocontrolador 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 Bobina B: Pino RB6

Page 50: 57056742 Apostila Microcontroladores Lazaro 1

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

Page 51: 57056742 Apostila Microcontroladores Lazaro 1

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

Page 52: 57056742 Apostila Microcontroladores Lazaro 1

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 Lcdout "MOTOR DE PASSO"

Page 53: 57056742 Apostila Microcontroladores Lazaro 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=”

Page 54: 57056742 Apostila Microcontroladores Lazaro 1

54

15. Utilizando Interrupções A interrupção é uma técnica particular do PIC que p ermite 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: http://www.dpi.ufv.br/disciplinas/inf251/files/processadores/cursopic/node1.html

Page 55: 57056742 Apostila Microcontroladores Lazaro 1

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 rot ina de interrupçao INTCON = %10010000 'habilita i nterrupçao INTE OPTION_REG.6 = 1 'na subida do sinal LOOP: LED7 = 1 'faz pino R B7 = 1 GOTO LOOP ' para semp re 'subrotina de atendimento de interrupçao DISABLE 'desabilita interrupcoes INTERRUPCAO: 'caso ocorr a uma interrupcao LED7 = 0 'faz RB7 =0 PAUSE 10 ' espera 10 ms INTCON.1 = 0 'limpa flag de interrupcao RESUME ENABLE 'retorna pa ra 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

Page 56: 57056742 Apostila Microcontroladores Lazaro 1

56

TRISB = %11110001 'configura RB7-RB4 como entradas ON INTERRUPT GOTO INTERRUPCAO 'define rot ina de interrupçao INTCON = %10001000 'habilita i nterrupçao RB4-RB7 LOOP: LED1 = 1 'faz pino R B1 = 1 GOTO LOOP ' para semp re 'subrotina de atendimento de interrupçao DISABLE 'desabilita interrupcoes INTERRUPCAO: 'caso ocor ra uma interrupcao LED1 = 0 'faz RB1 = 0 PAUSE 10 ' espera 1 0ms INTCON.0 = 0 'limpa flag de interrupcao RESUME ENABLE 'retorna pa ra 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 rot ina de interrupçao TMR0 = 250 OPTION_REG.5 = 1 'na subida do sinal INTCON = %10100000 'habilita i nterrupçao TOIE LOOP: LED1 = 1 'faz pino R B1 = 1 GOTO LOOP ' para semp re 'subrotina de atendimento de interrupçao DISABLE 'desabilita interrupcoes INTERRUPCAO: 'caso ocorr a uma interrupcao LED1 = 0 'faz RB1 =0 PAUSE 2 ' espera 10 ms INTCON.2 = 0 'limpa flag de interrupcao TMR0 = 250 RESUME ENABLE 'retorna pa ra o programa principal END

Page 57: 57056742 Apostila Microcontroladores Lazaro 1

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"

Page 58: 57056742 Apostila Microcontroladores Lazaro 1

58

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

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

Page 59: 57056742 Apostila Microcontroladores Lazaro 1

59

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

Page 60: 57056742 Apostila Microcontroladores Lazaro 1

60

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

Page 61: 57056742 Apostila Microcontroladores Lazaro 1

61

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

Page 62: 57056742 Apostila Microcontroladores Lazaro 1

62

17. Módulo Comparador Analógico

1) Simule e explique o funcionamento do programa: ; modulo comparador - modo 5 ENTRADA1 var PORTA.1 ;entrada VIN- ENTRADA2 VAR PORTA.2 ;entrada VIN+ SAIDA_COMP2 var CMCON.7 ;C2OUT LED0 VAR 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 indi que o estado da saída do comparador 3) Modifique o programa 1, para que escreva no PORT B 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 var PORTA.1 ;entrada VIN- ENTRADA2 VAR PORTA.2 ;entrada VIN+ LED7 var PORTA.7 SAIDA_COMP2 var CMCON.7 ;C2OUT FLAG VAR BIT CONTADOR VAR BYTE TRISA = %01111111 TRISB = %00000000 CMCON = 5 ;comparador trabalhando no modo 5

Page 63: 57056742 Apostila Microcontroladores Lazaro 1

63

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 cont agem 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 VAR CMCON.6 SAIDA_CP2 VAR CMCON.7 LED0 VAR PORTB.0 LED1 VAR PORTB.1 TRISA = %11111111 TRISB = %00000000 CMCON = 2 ;comparador trabalhando no modo 2 VRCON = %10100110 ;configura referencia de te nsão VREF = 1,25V CLEAR INICIO: IF SAIDA_CP1 = 1 THEN LED0 = 1 ELSE LED0 = 0

Page 64: 57056742 Apostila Microcontroladores Lazaro 1

64

ENDIF IF SAIDA_CP2 = 1 THEN LED1 = 1 ELSE LED1 = 0 ENDIF GOTO INICIO END 7) Modifique o programa “6”, utilizando CMCON = %0 0001010, 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. Quand o este sinal for maior que 2.50V, o pino RB7 deve ser ativado. 11) Simule e explique o programa. Quais entradas do s comparadores estão sendo utilizadas? SAIDA_CP1 VAR CMCON.6 SAIDA_CP2 VAR CMCON.7 LED5 VAR PORTB.5 LED7 VAR 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

Page 65: 57056742 Apostila Microcontroladores Lazaro 1

65

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 r eferencia, ativar a saida RB0 b) quando a tensão na entrada AN0 for menor que a r eferencia, ativar a saida RB3 c) quando a tensão na entrada AN1 for maior que a r eferencia, ativar a saida RB5 d) quando a tensão na entrada AN1 for menor que a r eferência, ativar a saída RB6

Page 66: 57056742 Apostila Microcontroladores Lazaro 1

66

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 ;configura todos os pinos c omo I/O CMCON = 7 ;comparadores analógicos de sligados 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 ;LED como GPIO.0 ANSEL = 0 ; todos os pinos como I/O digi tal CMCON = 7 ; comparador desligado TRISIO=%00000000 LOOP:

Page 67: 57056742 Apostila Microcontroladores Lazaro 1

67

LOW LED ;liga LED em GPIO.0 PAUSE 5 ;atraso de 5 milisegundos HIGH LED ;desliga LED em GPIO.0 PAUSE 5 ;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 ADC_BITS 8 ; numero de bits no result ado Define ADC_CLOCK 3 ; fonte de clock (3=rc) Define ADC_SAMPLEUS 50 ; tempo de amostragem em us TX Var GPIO.1 ; pino de transmissao em GP0 adval var byte ; cria adval para armazenar o resultado ADCON0.7 = 0 ; justifica resultado para a esque rda ANSEL = %00111000 ; AN3 analogico, restant e digital CMCON = 7 ; comparador analogico desli gado Pause 1 ; espera 1 ms loop: ADCIN 3, adval ; Le canal 3 para adval Serout TX, T2400, [" Valor: ", #adval,13,10] ;Mos tra valor em decimal Pause 1 ; espera 1 ms Goto loop ; faz para sempre End

Page 68: 57056742 Apostila Microcontroladores Lazaro 1

68

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;

Page 69: 57056742 Apostila Microcontroladores Lazaro 1

69

9) Simule o programa: @ device mclr_off LED var GPIO.0 ; GPIO.0 -> led PB Var GPIO.3 ; GPIO.3 -> push button ANSEL = 0 ; todos os pinos i/o digital CMCON = 7 ; 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 GP1 GP0 1 1 0 0 1 1 1 0 1 Se o pino GP3= 1 GP2 GP1 GP0 1 1 1 0 0 0 1 0 1 Se o pino GP4 = 0 GP2 GP1 GP0 0 0 1 0 1 0 1 1 1 Se o pino GP4 = 1 GP2 GP1 GP0 1 1 1 0 1 0 1 1 1

Page 70: 57056742 Apostila Microcontroladores Lazaro 1

70

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 ‘ liga o led Pause 500 ‘ atraso de 0.5 seg

Low PORTB.0 ‘ desliga o led Pause 500 ‘ 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 var byte ‘ cao é uma var de 8 bits Gato var bit ‘ gato é uma var de 1 bit

Page 71: 57056742 Apostila Microcontroladores Lazaro 1

71

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 con 3 'Ratos = 3 Ratoeiras con ratos * 1000 Constantes Numéricas Constante Decimal: 100 ‘Valor decimal 100 Constante Binária: %10100101 Constante hexadecimal: $F2 Constante de caracteres: “d” Pinos Os pinos podem ser acessados usando o nome PORTe o número do bit: PORTB.1 = 1 ‘ Fixa PORTB, bit 1 em 1 Pode-se atribuir um nome para um pino, usando o comando VAR: Led var PORTA.3 ‘renomeia PORTA.3 ‘como led High 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 ‘ todos os pinos do PORTA ‘ como saídas TRISB = %11111111 ‘ todos os pinos do PORTB

‘ como entradas Define

Lázaro

Page 72: 57056742 Apostila Microcontroladores Lazaro 1

72

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

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) << n Deslocamento p/ Esquerda n

posições >> n Deslocamento p/ Direita n posições ABS Valor Absoluto COS Cosseno SIN Seno SQR Raiz Quadrada MAX Máximo MIN Minimo DCD Decodifica 2n NCD Codifica DIG Digito REV 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

Page 73: 57056742 Apostila Microcontroladores Lazaro 1

73

Operadores de Comparação São usados em declarações IF...THEN para comparar uma expressão com outra. Operador de Comparação

Descriçã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 Descrição AND ou && AND Lógico OR ou || OR Lógico XOR ou ^^ OR Exclusivo Lógico NOT AND NAND Lógico NOT OR NOR Lógico NOT XOR NXOR Lógico If (A == maior) AND (B > medio) Then run Algumas declarações do PicBasicPro 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, “ “]

Page 74: 57056742 Apostila Microcontroladores Lazaro 1

74

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. 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 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 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

Page 75: 57056742 Apostila Microcontroladores Lazaro 1

75

HIGH pino Faz o pino especificado ir para nível alto (5V). HIGH PORTA.0 ' pino RA0 = 1 (5V) led var PORTB.4 ' define RB4 como led HIGH 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 var PORTB.5 'define RB5 como lampada LOW lampada ' lampada = 0 Outro modo de levar um pino, para nivel baixo, se ele ja foi configurado como saída, é: PORTB.4 = 0 ' Fixa o pino RB4 em nivel baixo (0V) PAUSE período Faz uma pausa no programa, durante "periodo" milisegundos. Periodo pode ser de 0ms até 65535 milisegundos. PAUSE 1000 'Atraso de 1 segundo PAUSEUS periodo 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

Page 76: 57056742 Apostila Microcontroladores Lazaro 1

76

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. Cada Write é auto-temporizado, e leva cerca de 10 milisegundos para ser executado. Ex: WRITE5,B0 ' 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 PicBasicP ro: DEBUG : Saída serial assíncrona p/ um pino DTMFOUT : Gera tons de discagem em um pino LCDOUT : Mostra caracteres em um LCD PULSIN : Mede a largura de um pulso em um pino PULSOUT : Gera pulso em um pino

+

10uFPINO

ALTO-FALANTE

+

10uFPINO

ALTO-FALANTE

Page 77: 57056742 Apostila Microcontroladores Lazaro 1

77

SHIFTFIN : Entrada serial sincrona SHIFTOUT : Saída serial sincrona I2CREAD : Le os bytes de um dispositivo I2C I2CWRITE : Escreve bytes em um dispositivo I2C ON INTERRUPT :Executa subrotina BASIC em uma :interrupção POT :Le valor de um potenciometro em um pino RANDOM :Gera um número pseudo-aleatório Endereços na Internet sobre o PICBASIC (maio/2004): www.microchip.com

www.epanorama.net

www.melabs.com/index.htm

www.mikroelektronika.co.yu

www.rentron.com/PicBasic1.htm

www.asm51.eng.br/