Contador digital Kit Picminas Multiplexado

Ver o tópico anterior Ver o tópico seguinte Ir em baixo

Contador digital Kit Picminas Multiplexado

Mensagem  BRENNO CARVALHO em Ter Out 05, 2010 1:34 pm

Bom dia Bruno, Tenho vontade de implementar o contador do kit picminas para contar ate 9999 no formato up-down.
Ja consegui fazer isso com dois displays, mas gostaria de fazer o contador funcionar com saidas multiplexadas. Se conseguir utilizar o sistema de saida multiplexado, iria diminuir a quantidade de saidas do ci e simplificar o projeto, podendo utilizar as outras saidas para funções auxiliares.
Se puder me auxiliar em como fazer com dois displays, tentarei modifica-lo para funcionar com quatro displays.
Abraços.


BRENNO CARVALHO

Mensagens : 2
Data de inscrição : 05/10/2010

Ver perfil do usuário

Voltar ao Topo Ir em baixo

Re: Contador digital Kit Picminas Multiplexado

Mensagem  Bruno S. Avelar em Sex Out 22, 2010 11:37 am

Olá brenno,

Primeiramente desculpe a demora da resposta.
Andei muito atarefado na empresa esse mês.

O nosso KIT PICMinas básico não possui displays de 7 segmentos multiplexados.
Mas é muito bacana você querer implementar projetos usando esse conhecimento. Isso é muito usado em sistemas embarcados hoje em dia para. É possível fazer isso usando nosso KIT básico que você tem, para isso voce usará os bornes de conexão e um protoboard ou placa perfurada para montar o hardware necessário.

Vantagem:
Como você disse, é economizar portas do seu microcontrolador
Desvantagens
- usar um pouco mais de componentes em seu projeto
- usar mais processamento do microcontrolador
- um firmware um pouco mais elaborado.
Como funciona:
A idéia da multiplexação é acender um display de 7 segmentos por vez em uma ordem com o número que se deseja mostrar, mas fazer este chaveamento em uma velocidade suficiente (maior ou igual a 50 Hz) para enganar os olhos humanos.
Funcionamento a baixa frequencia:

Funcionamento a alta frequencia:

Essas imagens foram retiradas do site: http://www.ee.pucrs.br/~terroso/html/7_segmentos.html

Hardware:
Existem várias maneiras de se implementar o hardware para multiplexação do display de 7 segmentos.
A mais simples e mais utilizada é ligar todos os pinos de dados (pinos que ligam os LEDs) entre si e a portas do microcontrolador (ver figura) e os pinos de alimentação dos displays cada um a uma porta do microcontrolador utilizando um transitor como chave para a corrente vir da alimentação e nao do pino do microcontrolador.


Essa imagem foi retirada de:http://www.siliconchip.com.au/cms/A_111861/article.html

Se quiser economizar mais portas voce pode usar um CI de BCD para 7seg como o 7448. Caso queira economizar o processador reduzindo a varredura em momentos que o display nao estiver atualizando pode adicionar um buffer em cada porta de cada display que garantira que o ultimo estado seja mantido.

Firmware
A ideia do firmware é escrever em um display por vez. Para isso basta colocar nivel lógico 0 em 3 das 4 portas de controle (ligadas a alimentação dos displays) e 1 na outra. Colocar o dado nas portas de dados fazendo que este display acenada o número desejado. Após, colocar nivel lógico 1 em outra porta de controle e 0 na anterior e repetir o procedimento.

Espero ter ajudado,
Bruno S. Avelar
avatar
Bruno S. Avelar
Admin

Mensagens : 74
Data de inscrição : 26/07/2009
Idade : 33
Localização : Belo Horizonte MG

Ver perfil do usuário http://picminas.forumeiros.com

Voltar ao Topo Ir em baixo

Participante novo no pedaço

Mensagem  Euri Paschoalino em Qui Mar 31, 2011 10:06 pm

Primeiro gostaria de parabenizá-lo pelo site.Sou iniciante com PIC , já fiz 2 projetos bem simples e adorei trabalhar c/ microcontroladores.
Gostaria de saber se vç tem algum projeto semelhante a esse contador , mas com o PIC 16f628a em linguagem C. Como sou iniciante ainda não domino a lógica do "C" por isso agradeceria se vç tivesse o algorítmo completo e o hardware.
Obrigado
Euri

Euri Paschoalino

Mensagens : 1
Data de inscrição : 31/03/2011

Ver perfil do usuário

Voltar ao Topo Ir em baixo

Re: Contador digital Kit Picminas Multiplexado

Mensagem  Bruno S. Avelar em Dom Jul 10, 2011 1:47 pm

Olá Euri,
Infelizmente nao tenho projeto com o PIC16F628.
Eu criei uma blibioteca para o PIC18F4550 que posso disponibilizar aqui para você. Tenho ela para PIC32 também. Você terá que trabalhar nela para torna-la compatível com o PIC16F628. Eu acredito que não seja muito difícil. Se você fizer isto e nao se importar, gostaria que postasse aqui no forum o resultado ok?

Segue a biblioteca:

display7seg.h
Código:

/******************************************************************************
 *
 *            Curso SEMPRA de Microcontroladores (PIC18F4550)
 *
 ******************************************************************************
 * Nome do Arquivo:    display_7seg.h
 * Dependencias:       Veja seção INCLUDES
 * Processador:         PIC18F4550
 * Opção de Clock:      HS 20MHz (externo) - CPU: 48MHz   
 * Compilador:           C18 v3.20 ou superior
 * Empresa:           SEMPRA
 *
 * Plataforma:         Kit E-P18 (Sempra)
 *
 * Autor:            Bruno S. Avelar
 * Data:            v1 - 10/Fev/2011
 *                  
 *
 * Descrição:           Biblioteca de funções para escrever no display multiplexado
 *                  de 7 segmentos do KIT E-P18 (Sempra)
 *                  Os  4 displays são do tipo ANODO COMUM e seus segmentos
 *                  são LIGADOS com nivel lógico ZERO.
 *                  O display apresenta 4 digitos e seus respectivos
 *                  pontos decimais.
 *                  Nesta biblioteca usa-se os rótulos:
 *                  D - digito
 *                  p - ponto decimal do digito
 *
 *                  Nomes usados para os segmentos do displays presentes
 *                  no Kit E-P18:
 *
 *                      Display 4      Display 3      Display 2      Display 1           
 *                     (B3)           (B2)         (B1)           (B0)

 *                    ---a---          ---a---        ---a---        ---a---
 *                   |      |      |      |      |      |      |      |
 *                   f      b      f      b      f      b      f      b   
 *                   |      |      |      |      |      |      |      |   
 *                    ---g---       ---g---        ---g---        ---g---
 *                   |      |      |      |      |      |      |      |         
 *                   e      c      e      c      e      c      e      c      
 *                   |      |      |      |      |      |      |      |         
 *                    ---d--- .p    ---d--- .p       ---d--- .p       ---d--- .p      
 *
 *                  A multiplexação é feita pela função uptate() que coloca cada
 *                  valor em seu respectivo dígito enquanto os outros estão apagados.
 *                   Os displays sao numerados da esquerda para direita.
 *                  
 *
 *****************************************************************************/

/** I N C L U D E S **********************************************************/
#include <p18cxxx.h>   // Biblioteca com as definições do PIC selecionado
                  //no projeto, neste caso, o modelo 18F4550.

/** D E F I N E S ************************************************************/

// Define os pinos do display de 7 seg que estão ligados nas portas do PIC18F4550
// LEMBRANDO QUE O DISPLAY É DO TIPO CATODO COMUM e para cada segmento:
//         1: LIGADO
//         0: desligado

// digito mais significativo
#define Display_a    PORTDbits.RD2
#define Display_b    PORTDbits.RD3
#define Display_c    PORTDbits.RD5
#define Display_d    PORTDbits.RD6
#define Display_e    PORTDbits.RD7
#define Display_f    PORTDbits.RD1
#define Display_g    PORTDbits.RD0
#define Display_p    PORTDbits.RD4

#define Display1    PORTBbits.RB3
#define Display2    PORTBbits.RB2
#define Display3    PORTBbits.RB1
#define Display4    PORTBbits.RB0



/** P R O T O T I P O S *******************************************************/

/******************************************************************************
 * Funcao:           void Config_display_7seg (void)
 * Entrada:        Nenhuma (void)
 * Saída:             Nenhuma (void)
 * Descrição:      Configura portas do PIC 18F4550 que estão conectadas ao
 *               displays de 7 segmentos como saida.
 *               Desliga todos os segmentos do display apos a configuração
 *
 *****************************************************************************/
 extern void Config_display_7seg (void);

/******************************************************************************
 * Funcao:           void W_display_7S(unsigned int caracter, unsigned char ponto)
 *
 * Entrada:        char caracter: valor decimal de 0 a 9999 a ser apresentado no display
 *               char ponto: se deseja ligar o ponto decimal e a posição do ponto
 *                     0b00000000     :desliga ponto decimal
 *                     0b00000001      :liga ponto decimal do diplay 1
 *                     0b00000010     :liga ponto decimal do diplay 2
 *                     0b00000100      :liga ponto decimal do diplay 3
 *                     0b00001000      :liga ponto decimal do diplay 4
 *
 * Saída:             Nenhuma (void)
 * Descrição:      Escreve valor decimal de 0000 a 9999 nos display's de 7 segmentos.
 *               e salva o valor de cada dígito nas variaveis globais correspondentes.
 *               Este valor fica armazenado e é preciso chamar periodicamente a função
 *               update para manter o número visível.
 *               Liga/desliga o ponto decimal.
 *
 *****************************************************************************/
 extern void W_display_7seg(unsigned int caracter, unsigned char ponto);

/******************************************************************************
 * Funcao:           void Update_7S()
 *
 * Entrada:        Nenhuma (void)
 *               
 * Saída:             Nenhuma (void)
 * Descrição:      Deve chamada a cada xx ms durante a execução do programa.
 *               É recomendado que esta função seja chamada em uma interrupção
 *                ativada pelo timer.
 *
 *****************************************************************************/
 extern void Update_7seg();

/******************************************************************************
 * Funcao:           void SetSements_7S_2D(char numero)
 *
 * Entrada:        Número que deve aparecer no diplay
 *               
 * Saída:             Nenhuma (void)
 * Descrição:      A função organiza a porta D com o número recebido.
 *
 *****************************************************************************/
 extern void SetSements_7S_2D(char numero);
/******************************************************************************
 * Funcao:           void SetDisplay_7S(char numero,char display)
 *
 * Entrada:        Número que deve aparecer no diplay, display em que o número
 *               deve aparecer
 * Saída:             Nenhuma (void)
 * Descrição:      A função escreve um número em um display.
 *
 *****************************************************************************/
 extern void SetDisplay_7S(char numero, char display);


display7seg.c
Código:


/******************************************************************************
 *
 *            Curso SEMPRA de Microcontroladores (PIC18F4550)
 *
 ******************************************************************************
 * Nome do Arquivo:    display_7seg.h
 * Dependencias:       Veja seção INCLUDES
 * Processador:         PIC18F4550
 * Opção de Clock:      HS 20MHz (externo) - CPU: 48MHz   
 * Compilador:           C18 v3.20 ou superior
 * Empresa:           SEMPRA
 *
 * Plataforma:         Kit E-P18 (Sempra)
 *
 * Autor:            Bruno S. Avelar
 * Data:            v1 - 10/Fev/2011
 *                  
 *
 * Descrição:           Biblioteca de funções para escrever no display multiplexado
 *                  de 7 segmentos do KIT E-P18 (Sempra)
 *                  Os  4 displays são do tipo ANODO COMUM e seus segmentos
 *                  são LIGADOS com nivel lógico ZERO.
 *                  O display apresenta 4 digitos e seus respectivos
 *                  pontos decimais.
 *                  Nesta biblioteca usa-se os rótulos:
 *                  D - digito
 *                  p - ponto decimal do digito
 *
 *                  Nomes usados para os segmentos do displays presentes
 *                  no Kit E-P18:
 *
 *                      Display 4      Display 3      Display 2      Display 1           
 *                     (B3)           (B2)         (B1)           (B0)

 *                    ---a---          ---a---        ---a---        ---a---
 *                   |      |      |      |      |      |      |      |
 *                   f      b      f      b      f      b      f      b   
 *                   |      |      |      |      |      |      |      |   
 *                    ---g---       ---g---        ---g---        ---g---
 *                   |      |      |      |      |      |      |      |         
 *                   e      c      e      c      e      c      e      c      
 *                   |      |      |      |      |      |      |      |         
 *                    ---d--- .p    ---d--- .p       ---d--- .p       ---d--- .p      
 *
 *                  A multiplexação é feita pela função uptate() que coloca cada
 *                  valor em seu respectivo dígito enquanto os outros estão apagados.
 *                   Os displays sao numerados da esquerda para direita.
 *                  
 *
 *****************************************************************************/


/** I N C L U D E S **********************************************************/
#include   "display_7seg.h"


/** V A R I A V E I S  G L O B A I S******************************************/
   unsigned char Digitvalue[5];
                        
   unsigned char pto;
   
   unsigned char contUpdate = 0;


/** F U N C O E S ************************************************************/

/******************************************************************************
 * Funcao:           void Config_display_7seg_2D (void)
 * Entrada:        Nenhuma (void)
 * Saída:             Nenhuma (void)
 * Descrição:      Configura portas do PIC 18F4550 que estão conectadas ao
 *               display duplo de 7 segmentos como saida.
 *               Desliga todos os segmentos do display apos a configuração
 *
 *****************************************************************************/
void Config_display_7seg (void)
{
   // Configura as portas conectadas aos Leds que formam os dígitos como portas de Saída
   TRISDbits.TRISD0=0;    //CONFIGURA A PORTA RD0 COMO SAIDA (Display_a)
   TRISDbits.TRISD1=0;    //CONFIGURA A PORTA RD1 COMO SAIDA (Display_b)
   TRISDbits.TRISD2=0;    //CONFIGURA A PORTA RD2 COMO SAIDA (Display_c)
   TRISDbits.TRISD3=0;    //CONFIGURA A PORTA RD3 COMO SAIDA (Display_d)
   TRISDbits.TRISD4=0;    //CONFIGURA A PORTA RD4 COMO SAIDA (Display_e)
   TRISDbits.TRISD5=0;    //CONFIGURA A PORTA RD5 COMO SAIDA (Display_f)
   TRISDbits.TRISD6=0;    //CONFIGURA A PORTA RD6 COMO SAIDA (Display_g)
   TRISDbits.TRISD7=0;    //CONFIGURA A PORTA RD7 COMO SAIDA (Display_p)

   // Configura as portas conectadas aos seletores dos diplays como portas de saída

   TRISBbits.TRISB0=0;    //CONFIGURA A PORTA RB0 COMO SAIDA (Display1)
   TRISBbits.TRISB1=0;    //CONFIGURA A PORTA RB1 COMO SAIDA (Display2)
   TRISBbits.TRISB2=0;    //CONFIGURA A PORTA RB2 COMO SAIDA (Display3)
   TRISBbits.TRISB3=0;    //CONFIGURA A PORTA RB3 COMO SAIDA (Display4)

   // desliga o digito(display é do tipo ANODO COMUM, logo "1" desliga o segmento)
   Display_a=0;
    Display_b=0;
    Display_c=0;
    Display_d=0;
    Display_e=0;
    Display_f=0;
    Display_g=0;
     Display_p=0;
   
   // Desliga todos os displays:
   Display1 = 0;
   Display2 = 0;
   Display3 = 0;
   Display4 = 0;
}

/******************************************************************************
 * Funcao:           void W_display_7S_2D(unsigned int caracter, unsigned char ponto)
 *
 * Entrada:        char caracter: valor decimal de 0 a 9999 a ser apresentado no display
 *               char ponto: se deseja ligar o ponto decimal e a posição do ponto
 *                     0b00000000     :desliga ponto decimal
 *                     0b00000001      :liga ponto decimal do diplay 1
 *                     0b00000010     :liga ponto decimal do diplay 2
 *                     0b00000100      :liga ponto decimal do diplay 3
 *                     0b00001000      :liga ponto decimal do diplay 4
 *
 * Saída:             Nenhuma (void)
 * Descrição:      Escreve valor decimal de 0000 a 9999 nos display's de 7 segmentos.
 *               Este valor fica armazenado e é preciso chamar periodicamente a função
 *               update para manter o número visível.
 *               Liga/desliga o ponto decimal.
 *
 *****************************************************************************/
void W_display_7seg(unsigned int caracter, unsigned char ponto)
{
   
   Digitvalue[4] = caracter/1000;            //calcula o digito mais significativo
                                    // através da função que retorna o quociente
                                    // da divisão inteira por 1000.
   Digitvalue[3] = (caracter/100)%10;   //calcula o segundo digito mais significativo

   Digitvalue[2] = ((caracter/10)%100)%10;   //calcula o terceiro digito mais significativo   

   Digitvalue[1] = (((caracter%1000)%100)%10);   //calcula digito menos significativo   
      
   pto = ponto;
}

/******************************************************************************
 * Funcao:           void Update_7S_2D()
 *
 * Entrada:        Nenhuma (void)
 *               
 * Saída:             Nenhuma (void)
 * Descrição:      Deve chamada a cada xx ms durante a execução do programa.
 *               É recomendado que esta função seja chamada em uma interrupção
 *                ativada pelo timer.
 *
 *****************************************************************************/
 void Update_7seg()
 {
   if(contUpdate < 4)
   {
         SetDisplay_7S(Digitvalue[contUpdate],contUpdate);
         contUpdate++;
   }
   else
   {
      contUpdate = 0;
   }
}
/******************************************************************************
 * Funcao:           void SetSements_7S_2D(char numero)
 *
 * Entrada:        Número que deve aparecer no diplay
 *               
 * Saída:             Nenhuma (void)
 * Descrição:      A função organiza a porta D com o número recebido.
 *
 *****************************************************************************/
 void SetSements_7S(char numero)
 {
   // liga segmentos correspondentes
   // display é do tipo ANODO COMUM, logo "1" desliga o segmento
   switch(numero)
   {
      case 0:
         Display_a=1;
          Display_b=1;
          Display_c=1;
          Display_d=1;
          Display_e=1;
          Display_f=1;
          Display_g=0;
      break;
      
      case 1:
         Display_a=0;
          Display_b=1;
          Display_c=1;
          Display_d=0;
          Display_e=0;
          Display_f=0;
          Display_g=0;
      break;

      case 2:
         Display_a=1;
          Display_b=1;
          Display_c=0;
          Display_d=1;
          Display_e=1;
          Display_f=0;
          Display_g=1;
      break;

      case 3:
         Display_a=1;
          Display_b=1;
          Display_c=1;
          Display_d=1;
          Display_e=0;
          Display_f=0;
          Display_g=1;
      break;
      
      case 4:
         Display_a=0;
          Display_b=1;
          Display_c=1;
          Display_d=0;
          Display_e=0;
          Display_f=1;
          Display_g=1;
      break;

      case 5:
         Display_a=1;
          Display_b=0;
          Display_c=1;
          Display_d=1;
          Display_e=0;
          Display_f=1;
          Display_g=1;
      break;

      case 6:
         Display_a=1;
          Display_b=0;
          Display_c=1;
          Display_d=1;
          Display_e=1;
          Display_f=1;
          Display_g=1;
      break;

      case 7:
         Display_a=1;
          Display_b=1;
          Display_c=1;
          Display_d=0;
          Display_e=0;
          Display_f=0;
          Display_g=0;
      break;
      
      case 8:
         Display_a=1;
          Display_b=1;
          Display_c=1;
          Display_d=1;
          Display_e=1;
          Display_f=1;
          Display_g=1;
      break;

      case 9:
         Display_a=1;
          Display_b=1;
          Display_c=1;
          Display_d=0;
          Display_e=0;
          Display_f=1;
          Display_g=1;
      break;
      
      default:
         Display_a=1;
          Display_b=1;
          Display_c=1;
          Display_d=1;
          Display_e=1;
          Display_f=1;
          Display_g=1;
      break;
    }
}

void SetDisplay_7S(char numero, char display)
{
   switch(display)
   {
   case 1:
         Display1 = 1;   
         Display2 = 0;
         Display3 = 0;
         Display4 = 0;
         if(pto == 0b000001)
         {
            Display_p = 1;
         }
         else
         {
            Display_p = 0;
         }
   break;
   case 2:
         Display1 = 0;   
         Display2 = 1;
         Display3 = 0;
         Display4 = 0;
         if(pto == 0b000010)
         {
            Display_p = 1;
         }
         else
         {
            Display_p = 0;
         }

   break;
   case 3:
         Display1 = 0;   
         Display2 = 0;
         Display3 = 1;
         Display4 = 0;
         if(pto == 0b000100)
         {
            Display_p = 1;
         }
         else
         {
            Display_p = 0;
         }
   break;
   case 4:
         Display1 = 0;   
         Display2 = 0;
         Display3 = 0;
         Display4 = 1;
         if(pto == 0b001000)
         {
            Display_p = 1;
         }
         else
         {
            Display_p = 0;
         }
   break;
   /*default:
         Display1 = 0;   
         Display2 = 0;
         Display3 = 0;
         Display4 = 0;
         Display_p = 0;
   break;
   */
   }
   SetSements_7S(numero);

}

Espero ter ajudado,

Bruno S. Avelar
avatar
Bruno S. Avelar
Admin

Mensagens : 74
Data de inscrição : 26/07/2009
Idade : 33
Localização : Belo Horizonte MG

Ver perfil do usuário http://picminas.forumeiros.com

Voltar ao Topo Ir em baixo

Re: Contador digital Kit Picminas Multiplexado

Mensagem  Conteúdo patrocinado


Conteúdo patrocinado


Voltar ao Topo Ir em baixo

Ver o tópico anterior Ver o tópico seguinte Voltar ao Topo

- Tópicos similares

 
Permissão deste fórum:
Você não pode responder aos tópicos neste fórum