Universidade Federal do Piauí Centro de Tecnologia epartamento de Engenharia Elétrica CIRCUITOS IGITIS II Programação do PIC Prof. Marcos Zurita zurita@ufpi.edu.br www.ufpi.br/zurita Teresina - 2011
Sumário 1. Comandos de Saída no CCS C 2. Comandos de Entrada no CCS C 3. isplay de 7 Segmentos 4. Módulos LC 5. Conversor / Interno 6. Temporizadores 2
1. Comandos de Saída no CCS C 3
Comandos de Saída no CCS C Comandos de Saída no CCS C set_tris_x() output_bit() output_low() output_high() output_float() output_x() 4
Comandos de Saída no CCS C set_tris_x(config) Configura os pinos da porta X como entrada ou saída: Bit = 1: entrada (1 lembra I de input ). Bit = 0: saída (0 lembra O de output ). Ex: set_tris_b(0b00000111); /* configura os pinos da porta B: b0 a b2 como entradas b3 a b7 como saídas */ 5
Comandos de Saída no CCS C output_bit(pino, estado) Coloca o pino indicado em nível lógico alto ou baixo, conforme o estado especificado. Caso a direção do pino não esteja configurada como saída, ela é alterada automaticamente antes da atribuição. Ex: output_bit(pin_a2,1); // coloca o pino 2 em nível 1 output_bit(pin_a2,0); // coloca o pino 2 em nível 0 6
Comandos de Saída no CCS C output_low(pino) Coloca o pino indicado em nível lógico baixo (idem a output_bit(pino,0)). Caso a direção do pino não esteja configurada como saída, ela é alterada automaticamente antes da atribuição. Ex: #define LE pin_a0 output_low(pin_b7); output_low(le); // coloca o pino B7 em nível 0 // coloca o pino 0 em nível 0 7
Comandos de Saída no CCS C output_high(pino) Coloca o pino indicado em nível lógico alto (idem a output_bit(pino,1)). Caso a direção do pino não esteja configurada como saída, ela é alterada automaticamente antes da atribuição. Ex: #define OUTRO_LE pin_c1 output_high(pin_d0); // coloca o pino 0 em nível 1 output_high(outro_le);// coloca o pino C1 em nível 1 8
Comandos de Saída no CCS C output_float(pino) Coloca o pino indicado em tri-state (como entrada). Quando um pino não está sendo utilizado ou está desconectado, é conveniente deixa-lo em 3-state para economizar energia. Ex.: output_float(pin_c7); // coloca o pino C7 em 3-state 9
Comandos de Saída no CCS C output_x(valor) Coloca um byte inteiro na saída da porta X. Caso a direção da porta não esteja configurada como saída, ela é alterada automaticamente antes da atribuição. Ex: output_b(0x0f); /* Toda a porta B é colocada como saída Os pinos B0 a B3 em nível alto; Os pinos B4 a B7 em nível baixo. */ 10
Comandos de Saída no CCS C Ex. 1: Semáforo de 3 Tempos Escreva um programa para controlar um semáforo de 3 tempos cujo circuito é representado abaixo. O tempo de cada estado deve ser: V: 5 s M: 2 s VM: 4 s Funcionamento ininterrupto. XTL = 4MHz. 11
Comandos de Saída no CCS C Porta B: Portas, C, e E: pinos ligados aos LEs devem ser configurados como pinos de saída; demais pinos devem ser configurados como entrada; todos os pinos devem ser configurados como tri-state. Escolha corretamente as instruções de mudança de estado dos pinos para assegurar que os demais não terão suas direções (E/S) iniciais alteradas. Utilize a função delay_ms() para ajustar os tempos. Modele o circuito e simule o programa. Se simulação correr bem, implemente-o na plataforma de prototipagem. 12
2. Comandos de Entrada no CCS C 13
Comandos de Entrada no CCS C Comandos de Entrada no CCS C int input() int input_x() 14
Comandos de Entrada no CCS C int input(pino) Retorna o estado do pino indicado. Ex.: tecla = input(pin_d2); /* lê o nível lógico do pino d2 e copia para a Variável tecla. */ 15
Comandos de Entrada no CCS C int input_x() Retorna um byte contendo o valor lido da porta indicada. Ex: dado8bits = input_b(pin_d2); // lê a porta B e guarda na variável dado. 16
Comandos de Entrada no CCS C Ex. 2: Semáforo de 3 Tempos Comandado ltere o projeto do semáforo de modo que ele só saia do verde 5 segundos após a solicitação de passagem de um pedestre, por meio de um botão. solicitação só deve ser aceita após o botão ser liberado. Voltando para o verde o semáforo volta a aguardar nova solicitação. 17 XTL = 4MHz.
3. isplay de 7 Segmentos 18
isplay de 7 segmentos isplay de 7 Segmentos Como cada segmento é um LE, os mesmos cuidados tomados com a limitação de corrente em LEs comuns devem ser tomados. Composto por 7 (ou 8) LEs conectados em Catodo Comum ou em nodo Comum. Pode ser acionado diretamente pelo microcontrolador ou através de um decodificador BC para 7 segmentos. 19
isplay de 7 segmentos tivação ireta Requer 7 pinos do uc (8 se o ponto for usado). Não requer componentes intermediários (salvo os resistores de limitação de corrente). Permite gerar outros caracteres além dos dígitos. 20
isplay de 7 segmentos Representação do lfabeto em 7 Segmentos a b c d e f g h i j k l m B C E F G H I J K L M n o p q r s t u v w x y z N O P Q R S T U V W X Y Z 21
isplay de 7 segmentos tivação Via ecodificador BC Requer 4 pinos do uc (5 se o ponto for usado). Requer um componente adicional: ec BC->7 segm. Permite gerar apenas os dígitos de 0 a 9 (para maioria dos decodificadores comerciais). 22
isplay de 7 segmentos Multiplexação de isplays Em aplicações que requerem mais de um display, a quantidade de pinos de I/O necessária para comandar diretamente todos eles pode tornar-se inviável. solução mais comum para este problema é comandalos de forma multiplexada, isto é, ativando um a um alternadamente em alta velocidade. esvantagens: É necessário o refresh contínuo dos displays, mesmo não havendo alteração no valor mostrado. Quanto maior o número de displays multiplexados, maior será o tempo que cada um passará desligado e consequentemente, menor será seu brilho aparente. 23 umento da complexidade do sistema.
isplay de 7 segmentos Ex.: Multiplexação de 4 displays. 24
isplay de 7 segmentos Ex. 3: Voltímetro True-RMS Um voltímetro True-RMS baseado em um microcontrolador está sendo projetado. O valor da tensão lida deve ser apresentado através de 4 displays de 7 segmentos, sendo o ponto decimal deslocado automaticamente pelo uc, conforme a faixa de tensão lida. Proponha um circuito capaz de acionar os 4 displays e seus respectivos pontos, utilizando uma única porta de 8 bits do uc. 25
isplay de 7 segmentos Ex. 4: Cronômetro Escreva um programa para cronometrar o tempo em décimos de segundos decorrido após o reset. 26
Comandos de Saída no CCS C O programa deve conter uma sub-rotina dedicada apenas a apresentar nos displays o valor passado para ela como argumento. contagem deve reiniciar automaticamente quando o tempo atingir FFFF. Modele o circuito e simule o programa. Se simulação correr bem, implemente-o na plataforma de prototipagem. 27
4. Módulos LC 28
Módulos LC Os Módulos de isplay LC Em sistemas embarcados é comum a necessidade de interação do sistema com o usuário. Quando o volume de informações visuais a serem entregues cresce, o uso de LEs indicadores ou displays de 7 segmentos pode tornar-se inadequado ou mesmo inviável. solução mais simples para esse problema é adoção de módulos LC como interface de exibição. 29
Módulos LC Módulos de display LC são padronizados, isto é, possuem uma interface comum e obedecem ao mesmo protocolo de comunicação, independente da resolução. Entre os mais populares estão os Módulos de display LC alfanuméricos, baseados no H44780 da Hitachi. Resoluções comerciais: 8x1 a 40x4 (caracteres x linhas). 30
Módulos LC Características dos Módulos LC Baseados no H44780 Capacidade de exibição de caracteres alfanuméricos, pontuação, símbolos matemáticos, letras gregas e caracteres kana; Capacidade de exibição de caracteres customizados; Recursos de deslocamento automático de mensagens (para a direita e para a esquerda); Exibição opcional do cursor; Retenção automática do conteúdo (não requer refresh); Interfaceamento através de 6 a 11 pinos; Baixo custo. 31
Módulos LC Módulos de isplay LC: lgumas Resoluções 32
Módulos LC Módulos de isplay LC: Cores 33
Módulos LC Tela do Módulo LC Cada caractere é formado por uma matriz de 5x8 ou 5x11 pixels. Um módulo 16x2 pode conter duas linhas de 16 caracteres cada. O ajuste de contraste é dado pela tensão no pino 3 (0 a 5V) e pode ser feito simplesmente através de um trim-pot. 34
Módulos LC Módulos de isplay LC: Pinagem PINO 1 2 3 4 5 6 7 8 9 10 11 12 13 14 NOME Vss Vdd Vee RS R/W E 0 1 2 3 4 5 6 7 FUNÇÂO Terra (GN) Vcc (5V) Contraste (0 a 5V) Register Select Read / Write Enable ata bit 0 ata bit 1 ata bit 2 ata bit 3 ata bit 4 ata bit 5 ata bit 6 ata bit 7 35
Módulos LC Memórias Internas Internamente o Módulo LC contém 3 blocos de memória: RM (isplay ata RM) RM de ados Mostrados. CGRM (Caracter Generator RM) RM do Gerador de Caracteres. CGROM (Caracter Generator ROM) - ROM do Gerador de Caracteres. 36
Módulos LC Memória RM rmazena os caracteres que serão exibidos na tela. Tem capacidade para armazenar até 80 caracteres; Sua operação é bastante simples: caracteres enviados ao módulo são armazenados em posições consecutivas da memória (endereço incrementado automaticamente). tela exibirá os caracteres contidos dentro da janela de visualização, cuja posição relativa pode ser movida para a direita ou para a esquerda, criando o efeito de shifting. 37
Módulos LC Memória CGROM Contém o mapa de todos os caracteres padrão que podem ser exibidos na tela. Cada caractere está associado a uma posição de memória 38
Módulos LC Os primeiros 128 caracteres da CGROM são mapeados de forma que seus códigos correspondam aos da Tabela SCII: Ex.: se o caractere 65 ('') é enviado ao módulo ele exibirá a letra ''. 39
Módulos LC Memória CGRM rmazena caracteres customizados pelo usuário. Pode conter até 8 caracteres de 5x8 pixels. Cada símbolo é gerado a partir de 8 registros de 8 bits (apenas os bits 0 a 4 são usados). 40
Módulos LC Interfacemento LC - PIC Pode ser feito através da biblioteca lcd.c do diretório picc\drivers, para módulos compatíveis com o H44780. Interfaceamento no modo de 4 bits. Opera de modo transparente ao usuário através da função printf(). 41
Módulos LC Biblioteca lcd.c Utiliza os bits b0 a b2 e b4 a b7 da porta ou B (default porta ) Para empregar a porta B deve-se retirar o comentário da instrução da linha 39 do arquivo lcd.c : #define use_portb_lcd TRUE 42
Módulos LC Conexão Entre o LC e o PIC +5V Vdd 5KΩ RS E R1 R0 Vss R/W 3 R3 Vee R2 4 R4 0 5 R5 1 6 R6 2 7 R7 LC PIC 43
Módulos LC Interfacemento Com LC Principais rotinas da biblioteca lcd.c void lcd_init() void lcd_gotoxy(byte x, byte y) void lcd_putc(char c) char lcd_getc(byte x, byte y) byte lcd_read_byte() void lcd_send_byte(byte address, byte n) 44
Módulos LC Rotina lcd_init() Inicializa o LC Configura como LC de 2 linhas (default); Seta o modo de operação em 4 bits; Seleciona cursor simples; Limpa a tela; Posiciona o cursor na posição (0,0). pós a inicialização o LC está pronto para receber caracteres. 45
Módulos LC Rotina lcd_gotoxy(byte x, byte y) Posiciona o cursor de escrita na coluna x, linha y da tela. Rotina lcd_putc(char c) Imprime um ou mais caracteres na tela. Rotina lcd_getc(byte x, byte y) Retorna o caractere localizado na coluna x, linha y. É necessário que o pino R/W esteja conectado ao PIC para poder utiliza-la. 46
Módulos LC Rotina lcd_read_byte() Lê o último byte enviado ao LC. É necessário que o pino R/W esteja conectado ao PIC. Rotina lcd_send_byte(byte address, byte n) Envia um byte de controle (address = 0) ou de caractere (address = 1) ao LC. 47
Módulos LC Palavras de Controle do LC 48
Módulos LC Interfaceamento com o LC Incluir a biblioteca lcd.c Inicializar o LC com lcd_init() #include <lcd.c> // biblioteca de suporte ao LC void main() { // instruções de inicialização do PIC } int coisa = 12; lcd_init(); // inicializa o módulo LC lcd_putc( Teste LC\n ); printf(lcd_putc, Time: %U s, coisa); 49
Módulos LC Ex. 5: Cronômetro LC Reescreva o programa do cronômetro para exibir o tempo em um módulo LC de 16x2 caracteres. 50
Módulos LC contagem deve reiniciar automaticamente quando o tempo atingir FFFF. Modele o circuito e simule o programa. Se simulação correr bem, implemente-o na plataforma de prototipagem. 51
5. Conversor / Interno 52
Conversor / Interno Conversor / Interno Conversor por aproximação sucessiva; Resolução máxima de 10 bits; Múltiplas entradas multiplexadas; Clock configurável; Impedância máxima da fonte: 10KΩ. Tempo de aquisição: de 10 a 20 µs. 53
Conversor / Interno Comandos Básicos Para Conversão / iretiva #device adc=10 O comando setup_adc_ports(xxx) Configura as portas do xxx pode assumir valores como LL_NLOG NO_NLOG R0_R1_R3_NLOG R0_R1_NLOGR3_REF Configurações possíveis de xxx definidos na biblioteca do dispositivo ( 16F877.h, neste caso). 54
Conversor / Interno Possíveis Configurações do C no PIC16F877 MOO N7 N6 N5 N4 N3 N2 N1 N0 Vref+ Vref- LL_NLOG V VSS NLOG_R3_REF Vref+ N3 VSS _NLOG V VSS _NLOG_R3_REF Vref+ N3 VSS R0_R1_R3_NLOG V VSS R0_R1_NLOG_R3_REF Vref+ N3 Vss NO_NLOGS --- --- NLOG_R3_R2_REF Vref+ Vref- N3 N2 NLOG_NOT_RE1_RE2 V VSS NLOG_NOT_RE1_RE2_REF_R3 Vref+ Vref- N3 VSS NLOG_NOT_RE1_RE2_REF_R3_R2 Vref+ Vref- N3 N2 _NLOG_R3_R2_REF Vref+ Vref- N3 N2 R0_R1_NLOG_R3_R2_REF Vref+ Vref- N3 N2 R0_NLOG V VSS R0_NLOG_R3_R2_REF Vref+ Vref- N3 N2 =Entrada nalógica =Entrada/Saída igital 55
Conversor / Interno O Comando setup_adc(mode) Configura se o modo de operação do conversor. O modo de operação resume-se a habilitação ou não do C e, em caso positivo, sua frequência de operação. Por exemplo, mode pode assumir valores como: C_OFF C_CLOCK_INTERNL C_CLOCK_IV_32 Valores de mode definidos na biblioteca do dispositivo ( 16F877.h, neste caso). 56
Conversor / Interno set_adc_channel(channel) Seleciona o canal do / em que serão feita as próximas leituras. Para um conversor de 8 canais pode assumir valores de 0 a 7. read_adc() Colhe uma amostra analógica no canal selecionado. O valor da amostra deve estar entre 0 e Vref Volts (normalmente Vref = 5V). 57
Conversor / Interno Exemplo de código para aquisição no canal 6: #device adc=10 // conversor de 10bits void main() { int16 tensao; // instruções de configuração do PIC... setup_c_ports(ll_nlog); // Toda porta como // entradas analógicas setup_adc(c_clock_internl); // C com clock interno set_adc_channel(6); // Seleciona o canal 6 tensao = read_adc(); // Faz uma aquisição } 58
Conversor / Interno Ex. 6: Voltímetro Escreva um programa exibir a tensão (0 a 5V) lida no canal 1 do / em um LC de 16x2 caracteres. 59
Conversor / Interno O conversor / deverá operar no modo 10 bits. Utilize V como Vref+ e VSS como Vref precisão da leitura deve ser informada na primeira linha do LC (p/ ex.: Tensão +/- 8 mv: ); tensão deve ser exibida com 3 casas decimais de precisão na segunda linha do LC. Modele o circuito e simule o programa. Se simulação correr bem, implemente-o na plataforma de prototipagem. 60
Conversor / Interno Ex. 7: Termômetro igital Reescreva o código do exemplo anterior para que ele apresente também a temperatura dada por um sensor. 61
Conversor / Interno Sensor de temperatura utilizado: LM35. Saída: 0mV + 10mv/ C. O conversor / deverá operar no modo 10 bits. Utilize V como Vref+ e VSS como Vref temperatura deve ser informada na primeira linha do LC (p/ ex.: Temp.: 026.5 C ); tensão deve ser exibida com 3 casas decimais de precisão na segunda linha do LC. Modele o circuito e simule o programa. Se simulação correr bem, implemente-o na plataforma de prototipagem. 62
6. Temporizadores (Timers) 63
Temporizadores Temporizadores (Timers) São circuitos destinados a contagem do tempo. 64
Temporizadores Temporizadores digitais podem ser implementados simplesmente através de um contador cujo incremento (ou decremento) é comandado por uma fonte de clock de frequência precisa e conhecida. Considere um contador de 3 Início bits incrementado por um clock 1 ms 1 ms de 1kHz: 0 Um incremento será feito a cada 1ms. Um estouro do contador ocorrerá a cada 8ms. O sistema comporta-se como um temporizador capaz de contar intervalos de 8ms. 1 7 1 ms 1 ms 6 1 ms 2 3 5 1 ms 4 1 ms 1 ms 65
Temporizadores detecção de tempo decorrido é feita através da detecção do estouro do contador, isto é, toda vez que, após atingir o valor máximo, um incremento provoca a transição para o valor zero, reiniciando a contagem. ois parâmetros de um timer são notáveis neste ponto: Resolução: é intervalo de tempo entre cada incremento, sendo dependente do clock de entrada do temporizador. Para este exemplo a resolução é de 1ms. Período de Estouro: (overflow period) é o intervalo entre dois estouros consecutivos do temporizador. epende da resolução e do número de incrementos entre um estouro o o valor máximo do contador. Para este exemplo vale 8ms. Tamanho: é o número de bits do contador associado ao temporizador. Neste exemplo o temporizador é de 3 bits. 66
Temporizadores Reduzindo o Período de Estouro Reduzindo-se o número de estados da máquina é possível contar intervalos de tempo menores. Isto pode ser obtido por meio de desvios na sequência de contagem. Início esvios podem ser síncronos 1 ms 1 ms (consumindo um ciclo de clock) 0 ou assíncronos (ocorrendo tão 7 1 1 ms 1 ms logo o estado proibido seja 0 ou 1 ms detectado). 6 2 1 ms 3 5 1 ms 4 1 ms 1 ms 67
Temporizadores Uma forma de tornar o número de estados configurável é comparar o estado atual da máquina a um valor informado e reinicia-la caso este valor seja alcançado. Tal solução é comumente adotada por requerer apenas um comparador binário de Início mesma dimensão (em bits) 1 ms do temporizador. 1 ms 0 Para o exemplo adotado, o 1 ms 1 7 1 ms período de estouro poderia 1 ms ser reduzido para 5 ms CMP & 6 2 RESET configurando-se o comparador para reiniciar após o 1 ms 1 ms 3 5 estado 4. 1 ms 4 1 ms 68
Temporizadores umentando o Período de Estouro esde que o número máximo de estados da máquina é fixado pelo contador, o período de estouro do temporizador pode ser aumentado de três formas: Via Prescaler: O prescaler ou pré-escalonador nada mais é que um divisor de clock configurável capaz de dividir o clock de alimentação do temporizador. Para o exemplo dado, se um prescaler de 2:1 fosse usado, o período de estouro do timer passaria de 8 para 16ms. Via Postscaler: O postscaler ou pós-escalonador pode ser visto como um divisor de estouros. Ele conta um determinado número de estouros do contador antes de sinalizar um estouro em sua saída; Uso conjunto do Prescaler + Postscaler. 69
Temporizadores Temporizadores no PIC16F877 O PIC16F877 possui três temporizadores independentes: Timer 0; Timer 1; Timer 2. Cada temporizador possui características e recursos diferentes, embora sejam baseados nos mesmos princípios anteriormente expostos. 70
Temporizadores Timer 0 Possui uma vasta gama de aplicações. Pode ser programado para gerar pulsos de duração arbitrária, medir o tempo ou contar pulsos externos. Suas características são: Tamanho: 8 bits; Prescaler: 8 bits; Postscaler: não possui; Fonte de clock selecionável: Interna: RTCC (fosc/4); Externa: Pino R4/T0CK. Clock externo com borda de detecção selecionável; Interrupção associada ao estouro do contador. 71
incompleto 72
Bibliografia Milan Verle, PIC Microcontrollers Programming in C, 1a Ed., MikroElektronika, 2009. Fábio Pereira, Microcontroladores PIC: programação em C, 7 ed., Érica, 2009. Custom Computer Services Inc., C Compiler Reference Manual, 2011. Microchip Tec. Inc., 8-bit PIC Microcontrollers, ata Sheet, 2010. Microchip Tec. Inc., PIC16F87X - 28/40/44-Pin Enhanced Flash Microcontrollers, ata Sheet, 2003. 73