Contador digital Kit Picminas Multiplexado
3 participantes
Página 1 de 1
Contador digital Kit Picminas Multiplexado
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.
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
Re: Contador digital Kit Picminas Multiplexado
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
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
Participante novo no pedaço
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
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
Re: Contador digital Kit Picminas Multiplexado
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
display7seg.c
Espero ter ajudado,
Bruno S. Avelar
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
Tópicos semelhantes
» Contador digital lcd " 0000 "
» Incrementar contador
» PROJETO ALARME DIGITAL
» Duvida Relogio Digital
» Incrementar contador
» PROJETO ALARME DIGITAL
» Duvida Relogio Digital
Página 1 de 1
Permissões neste sub-fórum
Não podes responder a tópicos
|
|