Sistemas Microcontrolados - ccfacape.webnode.com · ... CCS, PICmicroC, C18, etc. Adotamos para...

42
Sistemas Microcontrolados Programando o PIC Prof. Sergio F. Ribeiro Ciência da Computação Microcontroladores e Robótica - FACAPE Linguagem C Características: estruturada alto nível (comparada ao Assembly) facilidade de acesso ao hardware portabilidade curva de aprendizagem reduzida reutilização de código 2

Transcript of Sistemas Microcontrolados - ccfacape.webnode.com · ... CCS, PICmicroC, C18, etc. Adotamos para...

Sistemas MicrocontroladosProgramando o PICProf. Sergio F. RibeiroCiência da ComputaçãoMicrocontroladores e Robótica - FACAPE

Linguagem C Características:

estruturada alto nível (comparada ao Assembly) facilidade de acesso ao hardware portabilidade curva de aprendizagem reduzida reutilização de código 2

Microcontroladores e Robótica - FACAPEPalavras Reservadas

As palavras reservadas não podem ser utilizadas como identificadores.Palavras-chave reservadas da Linguagem Cauto break case charconst continue default dodouble else enum externfloat for goto ifint long register returnstruct switch typedef unionunsigned void volatile while 3Microcontroladores e Robótica - FACAPE

Tipos de DadosTipo Tamanho em bits Intervalounsigned char 8 0 a 255(signed) char 8 -128 a +127(signed) short (int) 8 -128 a +127unsigned short (int) 8 0 a 255(signed) int 16 -32768 a +32767unsigned int 16 0 a 65535(signed) long int 32 -2147483648 a +2147483647unsigned long int 32 0 a 4294967295float 32 -1.5 x 1045 a +3.4 x 1038double 32 -1.5 x 1045 a +3.4 x 1038void 0 nenhum valor 4

Microcontroladores e Robótica - FACAPERepresentação Numérica na Linguagem C

Bases: binária octal decimal hexadecimal

Exemplo: representação do número 50 nas diferentes bases: 50 ⇒ decimal 0x32 ⇒ hexadecimal 0b00110010 ⇒ binário 062 ⇒ octal 5

Microcontroladores e Robótica - FACAPEOperadores Lógicos

São usados para realizar testes booleanos entre elementos em um teste condicional.OPERADOR AÇÃO&& AND (E)|| OR (OU)! NOT (NÃO) 6

Microcontroladores e Robótica - FACAPEOperadores Lógicos Bit a Bit

São utilizados para operações lógicas entre elementos ou variáveis.OPERADOR AÇÃO& AND (E)| OR (OU)^ XOR (OU EXCLUSIVO)~ NOT (NÃO)>> Deslocamento à direita<< Deslocamento à esquerda 7Microcontroladores e Robótica - FACAPE

Compilador MikroC Existe no mercado vários compiladores para desenvolvi-mento de programas na Linguagem C para microcontro-ladores PIC como: Hi-Tech, CCS, PICmicro C, C18, etc. Adotamos para nosso treinamento o compilador MikroCda Microelektronika por ser bastante poderosa e fácil de trabalhar. Permite editar, simular e compilar programas das famílias 12, 16 e 18 da Microchip. Além de também possuir uma vasta biblioteca de controle de periféricos dos microcontroladores PIC. A versão estudante é gratuito para desenvolvimento de programas de até 2Kwords, o que o torna bastante atraente também para uso educacional. 8

Microcontroladores e Robótica - FACAPECompilador MikroC

9Microcontroladores e Robótica - FACAPE

Funções do Compilador O compilador MikroC possui varias funções prontas que auxiliam em:

manipulação de I/O configuração de registradores leitura do conversor A/D configuração e uso dos timers delays PWM matemáticas ..... 10

Microcontroladores e Robótica - FACAPEFunções do Compilador

Podemos definir atrasos por meio de funções de delay como: delay_cycles()delay_cycles(1); // aguarda 1 ciclo delay_us()delay_us(1); // aguarda 1 microssegundo delay_ms()delay_ms(1); // aguarda 1 milissegundo 11

Microcontroladores e Robótica - FACAPEPortas de I/O

Permitem a comunicação com o mundo exterior. Organizados por PORTs, podem ser definidos como entradas ou saídas conforme a necessidade. Dois registradores para manipulação: TRISx e PORTx. Configurando a direção do pino (registrador TRIS):0 ⇒ pino configurado como saída (Output).1 ⇒ pino configurado como entrada (Input).Exemplo: TrisA = 0b00000001; // define o RA0 como// entrada digital 12

Microcontroladores e Robótica - FACAPEPortas de I/O

Lendo o estado do pino:if(RA0_bit == 0) // se pino RA0 estiver com valor 0comandoX; // executa comando x Lendo estado do PORT inteiro:int valor;valor = PortA;if(PortB == 128) // se pino RB7 igual a 1comandoY; // executa comando Y 13

Microcontroladores e Robótica - FACAPELendo TeclasHardware: Isto é possível, desde que ative o pull-up interno do PortB.No MikroC se faz:RBPU_bit = 0; ouOPTION_REG = 0x00;Quando for usar um botão no PortA, deve-se desativar os comparadores internos do µC. No MikroC se faz:CMCON = 7; 14

Microcontroladores e Robótica - FACAPEAcionando LedEsquema 1: Ligação alto-ativo 15

Microcontroladores e Robótica - FACAPEAcionando LedEsquema 2: Ligação baixo-ativo 16

Microcontroladores e Robótica - FACAPEExemplo de um programa C

Segue abaixo o programa para fazer piscar o led conectado ao pino B0 do PIC16F628A. Isso equivale a um “hello world” quando se está aprendendo a programar em C para PIC.void main() // pisca o led a uma frequência de 1 HzTrisB = 0x00; // configura toda a porta B como saídaPortB = 0x00; // atribui nível baixo a todos os pinos em Bwhile(1) // laço infinitoRB0_bit = 0; // nível baixo em B0 (apaga led)delay_ms(500); // atraso de 500ms (0,5s)RB0_bit = 1; // nível alto em D0 (acende led)delay_ms(500); // mais um atraso de 500ms 17

Microcontroladores e Robótica - FACAPEExemplo de um programa C

Programa equivalente ao anterior.#define Led RB0_bit // macro Led associado ao pino B0void main() // pisca o led a uma frequência de 1 HzTrisB = 0x00; // configura toda a porta B como saídaPortB = 0x00; // atribui nível baixo a todos os pinos em Bwhile(1) // laço infinitoLed = ~Led; // inverte o nível lógico do pino B0delay_ms(500); // atraso de 500ms (0,5s) 18

Microcontroladores e Robótica - FACAPEPrática

Considerando o programa exemplo anterior, compile, grave e teste. Simule no Proteus. 19Bounce / Debounce

Bounce são ruídos gerados ao pressionar uma tecla, e a duração desses ruídos é pequena (alguns milisegundos). Isso significa que ao apertamos o botão apenas 1 vez, o programa pode acabar interpretando que apertamos o botão mais de 20 vezes em seguida. Debouncing é uma técnica que corrige esse problema de interpretação. Há solução por hardware e por software.Microcontroladores e Robótica - FACAPEruídos filtro 20

Microcontroladores e Robótica - FACAPEBounce / DebounceCódigo que provoca o bounce: Código com o debounce:

21Microcontroladores e Robótica - FACAPE

Exercício 01 – LEDs Crie um sistema microcontrolado com 4 leds no nibbleinferior do portB e 4 teclas no nibble superior do portBusando a técnica de debounce nas teclas. Os botões (push-buttons) deverão ter as seguintes funções:

BT1 ⇒ incrementa valor nos leds (contagem binária de 0 a 15). BT2 ⇒ decrementa valor nos leds. BT3 ⇒ zera valor dos leds. BT4 ⇒ inverte estado dos leds.Para uma melhor implementação, faça uso dos pull-ups internos do PortB. 22

Microcontroladores e Robótica - FACAPEExercício 01 – Esquemático

23Exercício 01 – Código#define Botao0Inc RB4_bit#define Botao1Dec RB5_bit#define Botao2Zer RB6_bit#define Botao3Inv RB7_bitvoid main() unsigned char nibble = 0;TrisB = 0x00;PortB = 0xF0;NOT_RBPU_bit = 0;CMCON = 7;while(1)PortB = nibble;if(!Botao0Inc)delay_ms(250);nibble++;if(nibble > 15)nibble = 0;if(!Botao1Dec)delay_ms(250);if(nibble == 0)nibble = 15;elsenibble--;if(!Botao2Zer)nibble = 0;if(!Botao3Inv)delay_ms(250);nibble ^= 0x0F; código com debounce. 24

Microcontroladores e Robótica - FACAPEDisplay de 7 Segmentos

O display de sete segmentos é um dispositivo composto de sete leds retangulares (de a até g) e um ponto (pt). Sobre cada segmento há resistores externos para limitar a corrente a um nível seguro para que não danifique o led. O display pode ser do tipo:

catodo comum ⇒ comum = aterrado; segmentos = nível alto. anodo comum ⇒ o comum recebe nível alto e os segmentos recebem nível baixo. 25

Microcontroladores e Robótica - FACAPEDisplay de 7 SegmentosLigando o display de 7 segmentos catodo comum no PIC.

26

Microcontroladores e Robótica - FACAPEDisplay de 7 SegmentosCódigo de display de sete segmentos catodo comum.

27Microcontroladores e Robótica - FACAPE

Exercício 02 – Display 7 Seg. Desenvolva uma aplicação para que o valor no display de sete segmentos catodo comum seja incrementado ao apertar uma determinada tecla, e decrementado quando pressionado outra tecla, e mais uma terceira tecla para reiniciar o valor da contagem do display. O valor deve ir de 0 a 9, e voltar a 0 após incrementar o 9. E se decrementar a partir do 0, deve voltar a 9. 28

Microcontroladores e Robótica - FACAPEExercício 02 – Esquemático

29Exercício 02 – Código Versão 1#define Botao0Inc RA0_bit#define Botao1Dec RA1_bit#define Botao2Zer RA2_bitvoid main() unsigned char display[] = 0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F, 0x6F; unsigned short valor = 0;TrisA = 0xFF;TrisB = 0x00;PortA = 0xFF;PortB = 0x00;CMCON = 7;while(1)if(!Botao0Inc)delay_ms(250);valor++;if(valor == 10)valor = 0;if(!Botao1Dec)delay_ms(250);if(valor == 0)valor = 9;elsevalor--;if(!Botao2Zer)valor = 0;PortB = display[valor]; 30

Exercício 02 – Código Versão 2#define Botao0Inc RA0_bit#define Botao1Dec RA1_bit#define Botao2Zer RA2_bitvoid main() unsigned char display[] = 0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F, 0x6F; unsigned short valor = 0;bit entrou;TrisA = 0xFF;TrisB = 0x00;PortA = 0xFF;PortB = 0x00;CMCON = 7;entrou = 0;while(1)if(!Botao0Inc && !entrou)entrou = 1;valor++;if(valor == 10)valor = 0;if(!Botao1Dec && !entrou)entrou = 1;if(valor == 0)valor = 9;elsevalor--;if(!Botao2Zer)valor = 0;if(Botao0Inc && Botao1Dec && entrou)entrou = 0;PortB = display[valor]; 31

Microcontroladores e Robótica - FACAPEDisplay LCD

Módulos de display LCD de caracteres alfanuméricos são interfaces de comunicação visual muito úteis e atraentes. São encontrados em muitos aparelhos domésticos, eletro-eletrônicos, automóveis, instrumentos de medição, etc. O compilador MikroC possui uma gama de funções de biblioteca para a manipulação de displays LCD. 32

Microcontroladores e Robótica - FACAPEDisplay LCD

Ao ligar o LCD ao PIC, são usados 4 pinos de dados, 2 pinos de controle e mais 2 pinos de alimentação.33

Microcontroladores e Robótica - FACAPEExercício 03 – Display LCD

Criar uma aplicação para exibir no display LCD o seguinte texto:FACAPEC. da Computacao Faça uso de dois push-buttons. Um botão fará com que o texto rotacione para a esquerda, e o outro botão fará com que o texto pisque a uma frequência de 2Hz. 34

Microcontroladores e Robótica - FACAPEExercício 03 – Esquemático

35Microcontroladores e Robótica - FACAPE

Exercício 03 – Código#define Button0Rot RA0_bit#define Button1Pisca RA1_bit// Lcd pinout settingssbit LCD_RS at RB1_bit;sbit LCD_EN at RB2_bit;sbit LCD_D4 at RB4_bit;sbit LCD_D5 at RB5_bit;sbit LCD_D6 at RB6_bit;sbit LCD_D7 at RB7_bit;// Pin directionsbit LCD_RS_Direction at TRISB1_bit;sbit LCD_EN_Direction at TRISB2_bit;sbit LCD_D4_Direction at TRISB4_bit;sbit LCD_D5_Direction at TRISB5_bit;sbit LCD_D6_Direction at TRISB6_bit;sbit LCD_D7_Direction at TRISB7_bit;void main() bit rotaciona, pisca;short int i, desloc = 0;TrisA = 0xFF;TrisB = 0x00;PortA = 0xFF;PortB = 0x00;CMCON = 7;rotaciona = 0;pisca = 0;Lcd_Init();Lcd_Cmd(_LCD_CLEAR);Lcd_Cmd(_LCD_CURSOR_OFF);Lcd_Out(1,1,"FACAPE");Lcd_Out(2,1,"C. da Computacao");delay_ms(300); 36

Microcontroladores e Robótica - FACAPEExercício 03 – Códigowhile(1)if(!Button0Rot)rotaciona = 1;pisca = 0;Lcd_Cmd(_LCD_TURN_ON);Lcd_Cmd(_LCD_CLEAR);Lcd_Cmd(_LCD_RETURN_HOME);Lcd_Out(1,1,"FACAPE");Lcd_Out(2,1,"C. da Computacao");for(i = 0;i < 16;i++)Lcd_Cmd(_LCD_SHIFT_LEFT);delay_ms(300);Lcd_Cmd(_LCD_CLEAR);Lcd_Out(1,16,"FACAPE");Lcd_Out(2,16,"C. da Computacao");

if(!Button1Pisca)rotaciona = 0;pisca = 1;Lcd_Cmd(_LCD_RETURN_HOME);Lcd_Cmd(_LCD_CLEAR);Lcd_Out(1,1,"FACAPE");Lcd_Out(2,1,"C. da Computacao");delay_ms(300);if(rotaciona)Lcd_Cmd(_LCD_SHIFT_LEFT);delay_ms(300);desloc++;if(desloc > 30)Lcd_Cmd(_LCD_CLEAR);Lcd_Out(1,16,"FACAPE");Lcd_Out(2,16,"C. da Computacao");desloc = 0; 37Exercício 03 – Códigoif(pisca)Lcd_Cmd(_LCD_TURN_ON);delay_ms(300);Lcd_Cmd(_LCD_TURN_OFF);delay_ms(300);Microcontroladores e Robótica - FACAPE 38

Microcontroladores e Robótica - FACAPEInterrupções

São eventos assíncronos. Desvia o programa automaticamente para o vetor de interrupção (0x04). São classificados em dois grupos:

convencionais por periféricos 39

Microcontroladores e Robótica - FACAPEMapa de Interrupções

40

Microcontroladores e Robótica - FACAPELógica da Interrupção

41Interrupção Externa e por Mudança de Estado no Port B42

Microcontroladores e Robótica - FACAPEExercício 04 – Mini Calculadora

Implemente um sistema microcontrolado de uma mini calculadora constituído de um teclado com 13 teclas no PortB: 10 para os dígitos (de 0 a 9) e 3 para as operações (soma, subtração e resultado). O teclado é a entrada do sistema. A saída é constituída de 5 LEDsligados ao PortA (exibe o resultado em binário). o sistema está restrito a fazer operações sobre números de um dígito (entre 0 e 9), onde, por exemplo, a maior soma será 9 + 9, cujo resultado é mostrado em binário nos LEDs. deve-se usar interrupção por mudança de estado no PortB a fim de monitorar as teclas acionadas no teclado. deve-se usar interrupção externa para a tecla do resultado (=). 43

Microcontroladores e Robótica - FACAPEExercício 04 – Esquemático

44

Microcontroladores e Robótica - FACAPEExercício 04 – Códigounsigned short operacao, tecla = 0, operando1 = 0;void interrupt()if(RBIF_bit)RBIF_bit = 0;if(!RB4_bit)if(!RB1_bit)tecla = 7;else if(!RB2_bit)tecla = 8;else if(!RB3_bit)tecla = 9;PortA = tecla;if(!RB5_bit)if(!RB1_bit)tecla = 4;else if(!RB2_bit)tecla = 5;

else if(!RB3_bit)tecla = 6;PortA = tecla;if(!RB6_bit)if(!RB1_bit)tecla = 1;else if(!RB2_bit)tecla = 2;else if(!RB3_bit)tecla = 3;PortA = tecla;if(!RB7_bit)if(!RB1_bit)tecla = 0;PortA = tecla; 45Microcontroladores e Robótica - FACAPE

Exercício 04 – Códigoelse if(!RB2_bit)PortA = 0x10;operacao = 10; // +operando1 = tecla;else if(!RB3_bit)PortA = 0x18;operacao = 11; // -operando1 = tecla;if(INTF_bit)INTF_bit = 0;if(operacao == 10)PortA = operando1 + tecla;if(operacao == 11)PortA = operando1 - tecla;operando1 = 0; void main() TrisA = 0x00;TrisB = 0xF1;PortA = 0x00;PortB = 0xFF;CMCON = 0x07;NOT_RBPU_bit = 0;GIE_bit = 1;PEIE_bit = 0;INTE_bit = 1;INTEDG_bit = 0;RBIE_bit = 1;while(1)PortB = 0xFD;delay_ms(100);PortB = 0xFB;delay_ms(100);PortB = 0xF7;delay_ms(100); 46

Microcontroladores e Robótica - FACAPETimers

São periféricos internos ao microcontrolador. Interrupções pelo timer são utilizadas para:

contagem de tempos contagem de eventos

O PIC16F628A possui 3 timers: Timer0 ⇒ 8 bits (usa o registrador TMR0) Timer1 ⇒ 16 bits (usa os registradores TMR1H:TMR1L) Timer2 ⇒ 8 bits (usa o registrador TMR2 e PR2) 47

Microcontroladores e Robótica - FACAPETimer0 – Configuração

48

Microcontroladores e Robótica - FACAPETimer0 – RegistradoresRegistradores associados ao Timer0:

49Microcontroladores e Robótica - FACAPE

Timer1 – Configuração50

Microcontroladores e Robótica - FACAPETimer1 – RegistradoresRegistradores associados ao Timer1:

51Microcontroladores e Robótica - FACAPE

Timer2 – Configuração52

Microcontroladores e Robótica - FACAPETimer2 – RegistradoresRegistradores associados ao Timer2:

53Microcontroladores e Robótica - FACAPE

Exercício 05 – Timers Utilize o Timer0 para criar uma base de tempo para piscar um led a uma frequência de 2Hz, e utilize o Timer2 para piscar um outro led a uma frequência de 10Hz.Obs: considere o uso de um oscilador externo de 4MHz. 54

Microcontroladores e Robótica - FACAPEExercício 05 – Esquemático

55Microcontroladores e Robótica - FACAPE

Exercício 05 – Códigounsigned contTimer0 = 0, contTimer2 = 0;void interrupt() // tempo_estouro = (2^8 - TMR0) * prescale * ciclo_maquinaif(T0IF_bit) // 2ms = (256 - TMR0) * 16 * 1usT0IF_bit = 0; // TMR0 = 131TMR0 = 131;contTimer0++;if(contTimer0 == 125)RB0_bit = ~RB0_bit;contTimer0 = 0;if(TMR2IF_bit) // tempo_estouro = PR2 * prescale * postscale * ciclo_maquinaTMR2IF_bit = 0; // 2ms = PR2 * 1 * 10 * 1uscontTimer2++; // PR2 = 200if(contTimer2 == 25)RB1_bit = ~RB1_bit;contTimer2 = 0; 56

Microcontroladores e Robótica - FACAPEExercício 05 – Códigovoid main() TrisB = 0xFC;PortB = 0xFC;GIE_bit = 1;PEIE_bit = 1;OPTION_REG = 0x83; // prescale = 16 para o Timer0T0IE_bit = 1;TMR0 = 131;T2CON = 0x4C; // Timer2 ligado, prescale = 1, postscale = 10TMR2IE_bit = 1;PR2 = 200;while(1); 57Módulo CCP

O módulo CCP é um periférico que permite, ao programador, controlar e medir diversos eventos. O módulo CCP (Capture/Compare/PWM) possui um registrador de 16 bits que pode operar como captura, comparação ou modulação PWM. Veremos agora somente o modo ‘captura’. Este modo usa o Timer1 como temporizador. O modo ‘captura’ possui dois registradores, CCPR1H e CCPR1L, que copia os valores do Timer1 (TMR1H e TMR1L).Microcontroladores e Robótica - FACAPE 58

Microcontroladores e Robótica - FACAPEModo Captura

59Microcontroladores e Robótica - FACAPE

Modo Captura60

Microcontroladores e Robótica - FACAPEModo Captura

Registradores associados ao módulo CCP.61

Microcontroladores e Robótica - FACAPEExercício 06 – Modo Captura

Desenvolva uma rotina que mostre em um LCD o tempo, em microssegundos, de nível alto de um pulso fornecido por um gerador de frequência ao pino RB3 do PIC. Use o modo de Captura do módulo CCP.Obs: use as diversas frequências do gerador de frequência presente no kit do laboratório. Calcule, teoricamente, o valor do pulso e compare com o valor mostrado no LCD. 62

Microcontroladores e Robótica - FACAPEExercício 06 – Esquemático

63Microcontroladores e Robótica - FACAPE

Exercício 06 – Códigosbit LCD_RS at RB1_bit;sbit LCD_EN at RB2_bit;sbit LCD_D4 at RB4_bit;sbit LCD_D5 at RB5_bit;sbit LCD_D6 at RB6_bit;sbit LCD_D7 at RB7_bit;sbit LCD_RS_Direction at TRISB1_bit;sbit LCD_EN_Direction at TRISB2_bit;sbit LCD_D4_Direction at TRISB4_bit;sbit LCD_D5_Direction at TRISB5_bit;sbit LCD_D6_Direction at TRISB6_bit;sbit LCD_D7_Direction at TRISB7_bit;// End LCD module connectionsunsigned char tempoH, tempoL;unsigned long tempoPulso;char tempoString[15];void interrupt()if(CCP1IF_bit && CCP1CON == 0x05)CCP1IF_bit = 0;CCP1IE_bit = 0;CCP1CON = 0x04; // captura na descidaCCP1IE_bit = 1;TMR1H = 0x00;TMR1L = 0x00;TMR1ON_bit = 1;else if(CCP1IF_bit && CCP1CON == 0x04)CCP1IF_bit = 0;tempoH = CCPR1H;tempoL = CCPR1L;CCP1IE_bit = 0;CCP1CON = 0x05; // captura na subidaCCP1IE_bit = 1;TMR1ON_bit = 0; 64

Microcontroladores e Robótica - FACAPEExercício 06 – Códigovoid main() TrisB = 0x09;PortB = 0x00;GIE_bit = 1;PEIE_bit = 1;TMR1IE_bit = 1;CCP1CON = 0x05;CCP1IE_bit = 1;T1CON = 0x00; // Prescale 1, Timer1 desligadoLcd_Init();Lcd_Cmd(_LCD_CLEAR);Lcd_Cmd(_LCD_CURSOR_OFF);Lcd_Out(1,1,"Duracao do Pulso");Lcd_Out(2,12,"us");delay_ms(100);while(1)tempoPulso = (tempoH << 8) + tempoL; // tempo em usLongToStr(tempoPulso, tempoString);Lcd_Out(2,1,tempoString);delay_ms(100); 65

Microcontroladores e Robótica - FACAPEExercício 07 – PWM

Implemente um sistema microcontrolado que varie a iluminação de um LED em quatro estados: desligado, iluminação baixa, média e alta. Um botão é usado no pino RB0 para ativar interrupção externa. Toda vez que o botão for pressionado, o estado do LED é alterado na ordem acima e de forma cíclica. A alteração da iluminação é obtida por meio de uma variação do sinal PWM no pino RB3, modificando-se o duty cycle do pulso. 66

Microcontroladores e Robótica - FACAPEExercício 07 – Esquemático

67Microcontroladores e Robótica - FACAPE

Exercício 07 – Códigounsigned short duty = 0;void interrupt()if(INTF_bit)INTF_bit = 0;duty += 33;if(duty > 100)duty = 0;PWM1_Set_Duty((duty*255)/100); void main() TrisB = 0x01;PortB = 0x01;NOT_RBPU_bit = 0;GIE_bit = 1;PEIE_bit = 0;INTEDG_bit = 0;INTE_bit = 1;PWM1_Init(5000);PWM1_Start();while(1); 68

Microcontroladores e Robótica - FACAPEExercício 08 – EEPROM

Criar um sistema microcontrolado que exiba em um display de 7 segmentos uma contagem contínua de 0 a 9 a uma frequência de 1Hz com as seguintes características: O display deve estar conectado ao Port B (do B1 ao B7). Usar um botão no pino B0 para acionar interrupção externa. Via interrupção externa, gera-se uma escrita na memória EEPROM, armazenando no endereço 1016 o valor de inicialização da contagem. Este valor de inicialização deve ser aquele presente no display no momento em que o botão foi pressionado. Usar um LED amarelo no pino A0 que pisque uma vez, em 200ms, indicando a escrita na memória EEPROM. Ligar um botão de reset no pino MCLR. Toda vez que o sistema for ligado ou reiniciado, a contagem deve começar do valor armazenado na EEPROM. 69Microcontroladores e Robótica - FACAPE

Exercício 08 – Esquemático70

Microcontroladores e Robótica - FACAPEExercício 08 – Códigounsigned short indice;void interrupt()if(INTF_bit)INTF_bit = 0;EEPROM_Write(0x10,indice);RA0_bit = 1;delay_ms(200);RA0_bit = 0;void main() unsigned char display[] = 0x7F, 0x0D, 0xB7, 0x9F, 0xCD, 0xDB, 0xFB, 0x0F, 0xFF, 0xDF;TrisA = 0x00;TrisB = 0x01;

PortA = 0x00;PortB = 0x01;CMCON = 0x07;NOT_RBPU_bit = 0;GIE_bit = 1;PEIE_bit = 0;INTEDG_bit = 0;INTE_bit = 1;indice = EEPROM_Read(0x10);delay_ms(50);while(1)PortB = display[indice];delay_ms(1000);indice++;if(indice > 9)indice = 0; 71Microcontroladores e Robótica - FACAPE

Bluetooth O nome Bluetooth é uma homenagem ao rei da Dinamarca e Noruega Harald Blatand (em inglês Harold Bluetooth).

Blatand é conhecido por unificar as tribos norueguesas, suecas e dinamarquesas. da mesma forma, o protocolo procura unir diferentes tecnologias, como smartphones e computadores.

Bluetooth é um protocolo padrão de comunicação sem fio entre dispositivos de baixo consumo com baixo alcance. dependendo da potência: 1 metro, 10 metros, 100 metros.

O uso dos dispositivos requer emparelhamento. parear dispositivos é o ato de estabelecer uma comunicação segura “aprendendo” uma senha secreta.

A velocidade de transmissão de dados é baixa: 1 Mb/s, 3Mb/s ou até 50Mb/s 72

Microcontroladores e Robótica - FACAPEBluetooth

O módulo Bluetooth HC-06 é usado para comunicação wireless entre um microcontrolador PIC e algum outro dispositivo com Bluetooth (computador, smartphone, tablet, etc). As informações recebidas pelo módulo são repassadas ao PIC via serial (protocolo RS-232 da USART). O alcance do módulo é de cerca de 10mt. Esse módulo funciona apenas em modoslave (escravo).

ou seja, permite que outros dispositivos seconectem à ele, mas não permite que elepróprio se conecte a outros dispositivosbluetooth. 73Microcontroladores e Robótica - FACAPE

Exercício 09 – Serial Para uma comunicação serial, use as funções UART que o MikroC disponibiliza (consulte o seu Help). Deve-se criar um sistema que acenda e apague LEDs de acordo com a tecla do PC acionada.

tecla R ou r deve acender ou apagar o LED vermelho. tecla G ou g deve acender ou apagar o LED verde. tecla Y ou y deve acender ou apagar o LED amarelo. tecla D ou d deve incrementar o display de 7 segmentos de 0 a 9. tecla C ou c deve decrementar o display de 7 segmentos. tecla B ou b deve tocar um beep a cada 100ms ou a cada 1s (frequência: 1100Hz) ou desligar.

Inicialmente, entre o PC e o PIC, use uma conexão USB. Depois, use conexão bluetooth entre o PC e o PIC. 74

Microcontroladores e Robótica - FACAPEExercício 09 – Esquemático

75Microcontroladores e Robótica - FACAPE

Exercício 09 – Código#define LED_RED RB7_bit#define LED_GREEN RB6_bit#define LED_YELLOW RB5_bitvoid main() unsigned char indice = 0, display[] = 0x9F, 0x06, 0x5B, 0x4F, 0xC6, 0xCD, 0xDC, 0x07, 0xDF, 0xC7;char codigo, beep = 0;TrisA = 0x00;TrisB = 0x0F;PortA = 0x00;PortB = 0x0F;CMCON = 0x07;T0CS_bit = 0;UART1_Init(9600);Sound_Init(&PortB,4);delay_ms(100);while(1)PortA = display[indice];if(UART1_Data_Ready())codigo = UART1_Read();delay_ms(100);if(beep == 1)Sound_Play(1100,1000);delay_ms(1000);else if(beep == 2)Sound_Play(1100,100);delay_ms(100);switch(codigo)case 'r':case 'R':LED_RED = ~LED_RED;break;case 'g':case 'G':LED_GREEN = ~LED_GREEN;break; 76

Microcontroladores e Robótica - FACAPEExercício 09 – Códigocase 'y':case 'Y':LED_YELLOW = ~LED_YELLOW;break;case 'b':case 'B':beep++;if(beep > 2)beep = 0;break;case 'd':case 'D':indice++;if(indice > 9)indice = 0;break;

case 'c':case 'C':if(indice == 0)indice = 9;elseindice--;break;default: ;codigo = '\0'; 77Conversão Analógico-DigitalGráfico que mostra a atuação do conversor A/D.Ordenada ⇒ tensão analógica.Abscissa ⇒ valores binários gerados.Microcontroladores e Robótica - FACAPE O conversor A/D (ou ADC) é um dispositivo eletrônico capaz de gerar uma representação digital a partir de uma grandeza analógica (tensão ou corrente elétrica). Um conversor A/D de 10 bits, recebendo uma tensão analógica entre 0V e 5V, gera valores binários de 0 (0000000000) a 1023 (1111111111).

Se o sinal de entrada do conversor A/D for 2.5V, por exemplo, o valor binário gerado será 51210 (10000000002 ou 20016). 78

Microcontroladores e Robótica - FACAPEConversão Analógico-Digital

O uso do conversor A/D é bem simples, sendo um dos periféricos mais simples de serem utilizados nos microcontroladores. O PIC16F628A não dispõe de um conversor A/D. Usaremos o PIC16F688 por possuir um conversor A/D internamente. Para exemplificar o uso do conversor A/D, resolveremos o exercício seguinte que gera uma saída em função da alteração de um potenciômetro. 79

Microcontroladores e Robótica - FACAPEExercício 10 – Conversão A/D

Implemente um sistema microcontrolado que, ao girar a haste de um potenciômetro de 10kΩ, faça uma sequência de 5 LEDs acenderem um a um da esquerda para a direita, de acordo com o giro do potenciômetro. O giro inverso fará os LEDs apagarem. A variação da resistência do potenciômetro é analógica. Logo, deve-se usar a conversão A/D para que em espaços regulares de resistência, vá se acendendo ou apagando os LEDs na saída. 80

Microcontroladores e Robótica - FACAPEExercício 10 – Esquemático

81Microcontroladores e Robótica - FACAPE

Exercício 10 – Códigovoid main() unsigned valor;TrisA = 0xFF;TrisC = 0x00;PortA = 0x00;PortC = 0x00;CMCON0 = 0x07;ANSEL = 0x01;ADCON0 = 0x01; while(1)valor = ADC_Read(0);delay_ms(100);if(valor >= 0 && valor <= 170)PortC = 0x00;if(valor > 170 && valor <= 340)PortC = 0x01;if(valor > 340 && valor <= 510)PortC = 0x03;if(valor > 510 && valor <= 680)PortC = 0x07;if(valor > 680 && valor <= 850)PortC = 0x0F;if(valor > 850 && valor <= 1023)PortC = 0x1F; 82

Microcontroladores e Robótica - FACAPEBibliografia

Desbravando o PIC – Ampliado e Atualizado para PIC16F628A – David José de Souza. Datasheet do PIC16F628A. Material online de Fábio B. de Souza –www.fbseletronica.wordpress.com 83