LPC 2148 e Display alfa-numerico de 16 segmentos

Software e Hardware para linha ARM

Moderadores: 51, guest2003, Renie, gpenga

LPC 2148 e Display alfa-numerico de 16 segmentos

Mensagempor verd » 07 Jul 2010 11:13

Alguem já mexeu com display de 16 segmentos no arm??

qual é mais vantagem, em meu projeto não vou utilizar muitos I/O´s do arm:

- utilizar um port para cada barramento/segmento do display total de 16?

- utilizar um multiplexador 74hc373??

qual da menos trabalho?
Editado pela última vez por verd em 07 Jul 2010 11:21, em um total de 1 vez.
"Tem pessoas qua acham que sabem tudo....
eu já acho que não sei nada!!!"
verd
Byte
 
Mensagens: 262
Registrado em: 28 Ago 2008 10:15

Mensagempor styg » 07 Jul 2010 11:18

eu se tenho IO sobrando faço a interface com 8 bits, que é mais rapido.

mas geralmente como nao tenho, vou de 4bits msm.
Lucas
Avatar do usuário
styg
Word
 
Mensagens: 799
Registrado em: 16 Out 2006 08:24
Localização: Floripa abaixo de zero.

Mensagempor verd » 07 Jul 2010 11:20

stig esqueci de comentar, é display alfa-numérico!! tenho que enviar 16 bits para ele!!
"Tem pessoas qua acham que sabem tudo....
eu já acho que não sei nada!!!"
verd
Byte
 
Mensagens: 262
Registrado em: 28 Ago 2008 10:15

Mensagempor Rodrigo_P_A » 07 Jul 2010 12:30

verd escreveu:stig esqueci de comentar, é display alfa-numérico!! tenho que enviar 16 bits para ele!!


baixa o esquema do kit que eu faço aqui: http://www.mcu.com.br/loja/produtover.aspx?produtoid=1

talvez sirva de referência para você
---
Avatar do usuário
Rodrigo_P_A
Dword
 
Mensagens: 2237
Registrado em: 12 Out 2006 18:27
Localização: Osasco - S.P - Brasil

Mensagempor barboza » 07 Jul 2010 12:46

Acho que se não vai usar todos os IO's, o mais fácil e barato é aproveita-los nos display.


Já fiz um projeto com 11 displays de 8 (7+1) segmentos + 8 leds ligados ao LPC2103, além usar algumas teclas e o AD.

Nesta configuração usei 20 IO's para os displays 8 (seg) + 11 (dsp) + 1 (led).

Use 16 io's aos segmentos e outros tantos para cada display através de um transistor.

Lembre de usar display com anodo comum para as portas do LPC ficarem ligadas aos segmentos e drenar a corrente.
Os homens mentiriam muito menos se as mulheres fizessem menos perguntas.
Avatar do usuário
barboza
Word
 
Mensagens: 948
Registrado em: 17 Out 2006 13:42
Localização: Longe de onde gostaria de estar

Mensagempor verd » 07 Jul 2010 13:29

Valeu Rodrigo!!!

Obrigado pelas dicas barboza!!!
"Tem pessoas qua acham que sabem tudo....
eu já acho que não sei nada!!!"
verd
Byte
 
Mensagens: 262
Registrado em: 28 Ago 2008 10:15

Mensagempor verd » 08 Jul 2010 08:00

Funcionou legal! to simulando a aplicação no proteus com um LPC 2138, o legal é que com o AM eu consigo simular os displays de 16 segmentos do proteus, já com o PIC ele não funcionava, dava erro no componente!!
"Tem pessoas qua acham que sabem tudo....
eu já acho que não sei nada!!!"
verd
Byte
 
Mensagens: 262
Registrado em: 28 Ago 2008 10:15

Mensagempor verd » 09 Jul 2010 07:58

Imagem



alguem pode me dar alguma dica do melho geito de fazer a varredura dos displays??

montei como no esquema acima, funcionou só que estou escrevendo tudo na unha, e mandando ligar os displays na unha.

qual o modo correto de fazer? por interrupção de timer0??http://dc217.4shared.com/img/336976436/75342222/imagem.JPG?sizeM=7
"Tem pessoas qua acham que sabem tudo....
eu já acho que não sei nada!!!"
verd
Byte
 
Mensagens: 262
Registrado em: 28 Ago 2008 10:15

Mensagempor barboza » 09 Jul 2010 08:29

Faça por int,

Um exemplo:

Código: Selecionar todos
static  void    p_display_isr   (void)  __irq
{
   static  U8      u8_display_idx = 0;

   // Clear Flag
   T0IR = 1;

   // Apague o display
   M_PORT_DSP_ALL_OFF;
   M_PORT_SEG_ALL_OFF;

   M_PORT_SEG_ON(u8_display_espelho[u8_display_idx]);
   M_PORT_DSP_ON(u8_display_idx);

   if ( ++u8_display_idx == sizeof(u8_display_ptr_espelho) )
   {
      u8_display_idx = 0;
   }

   //Dummy
   VICVectAddr = 0x00000000;
}
Os homens mentiriam muito menos se as mulheres fizessem menos perguntas.
Avatar do usuário
barboza
Word
 
Mensagens: 948
Registrado em: 17 Out 2006 13:42
Localização: Longe de onde gostaria de estar

Mensagempor verd » 09 Jul 2010 10:10

barboza eu estava tentando implementar a seguinte interrupção para fazer um teste, ora q ocorrer a interrupção irá setar todos os ports P1, mas não dá nem sinal de vida!!! o que está errado?

Código: Selecionar todos
       
#include <LPC213x.H>
#include "Timer.h"


#define CPU_CLOCK   60000000                               
#define DATA_FREQ       1920                   
                                                                         
#define VPB_CLOCK   ( CPU_CLOCK / 1 )           
#define TIM_TICK    ( VPB_CLOCK / DATA_FREQ )   


void vConfiguraTimer(void)
{
   T0MR0             = TIM_TICK - 1;               
    T0MCR             = 3;                           
    T0TCR             = 1;                           
    VICVectAddr4       = (unsigned long) irq_vTimer;   
    VICVectPriority4   = 8;                           
    VICIntEnable       |= (1 << 4);                     
}




__irq void irq_vTimer(void)
{
   IOSET1=0XFFFFFFFF; // TESTE PARA SETAR AS PORTAS P1. PARA VER SE ESTÁ OCORRENDO A INTERRRUPÇÃO

   T0IR        = 1;                           
    VICVectAddr = 0;                           
}



[/code]
"Tem pessoas qua acham que sabem tudo....
eu já acho que não sei nada!!!"
verd
Byte
 
Mensagens: 262
Registrado em: 28 Ago 2008 10:15

Mensagempor barboza » 09 Jul 2010 10:24

Cara, de uma olhada no que fiz, e avalie as diferenças.

Código: Selecionar todos
// Macros
#define M_PORT_SEG_OUT          (IODIR |= GPIO_ALL_SEG)
#define M_PORT_SEG_ALL_OFF      (IOSET = GPIO_ALL_SEG)
#define M_PORT_DSP_OUT          (IODIR |= GPIO_ALL_DSP)
#define M_PORT_DSP_ALL_OFF      (IOSET = GPIO_ALL_DSP)
#define M_PORT_DSP_ON(x)        (IOCLR = (1U<<(x+GPIO_DSP_BASE)))
#define M_PORT_LED_ON(x)        (IOCLR = ((x&0x7F)<<GPIO_LED_BASE))
#define M_PORT_SEG_ON(x)        (IOCLR = ((u8_const_hex_to_7seg[x-' '])<<GPIO_SEG_BASE))

// Interrupt
#define XTAL                    12E6L
#define M                               6L
#define P                               2L
#define CPUCLK                  (XTAL*M)
#define XCLKDIV                 (CPUCLK/4)
#define DSP_FREQ_VAR    (12*100)                        // 100Hz por cada display
#define DSP_FREQ_INT    (XCLKDIV/DSP_FREQ_VAR)

#define DSP_VIC_BIT                     (4)
#define DSP_VIC_ENABLE_INT      ((1<<5)|(DSP_VIC_BIT))
#define DSP_VIC_BIT_INT         (1<<DSP_VIC_BIT)

/************************************************************************
        FUNCAO:         p_display_init
        PARAMETROS: NENHUM
        RETORNO:        NENHUM
        DESCRICAO:      INICIALIZA AS DEFINIÇÕES DO DISPLAY 7 SEGMENTOS
*************************************************************************/
void    p_display_init  (void)
{
    M_PORT_SEG_OUT;
    M_PORT_DSP_OUT;

    // Desliga as portas
    p_display_off();
   
    memset(&u8_display_espelho, ' ', sizeof(u8_display_espelho));
   
    // Define a função da interrupção
    VICVectAddr0 = (U32) p_display_isr;
    VICVectCntl0 = DSP_VIC_ENABLE_INT;
    VICIntEnable = DSP_VIC_BIT_INT;
   
    T0MCR = 0x00000003;
    T0MR0 = DSP_FREQ_INT;

    // Enable timer 0
    p_display_on();
}

/************************************************************************
        FUNCAO:         p_display_off
        PARAMETROS: NENHUM
        RETORNO:        NENHUM
        DESCRICAO:      DESLIGA A INT E DESLIGA O DISPLAY
*************************************************************************/
void    p_display_off   (void)
{
    // Disable timer 0
    T0TCR &= ~0x00000001;

    // Garanta o nível das portas
    M_PORT_SEG_ALL_OFF;
    M_PORT_DSP_ALL_OFF;
}

/************************************************************************
        FUNCAO:         p_display_on
        PARAMETROS: NENHUM
        RETORNO:        NENHUM
        DESCRICAO:      LIGA A INT DO DISPLAY
*************************************************************************/
void    p_display_on    (void)
{
    // Enable timer 0
    T0TCR |= 0x00000001;
}
Os homens mentiriam muito menos se as mulheres fizessem menos perguntas.
Avatar do usuário
barboza
Word
 
Mensagens: 948
Registrado em: 17 Out 2006 13:42
Localização: Longe de onde gostaria de estar

Mensagempor barboza » 14 Jul 2010 16:37

Não vi onde acaba o seu main e nem onde esta o while(1); no final.


Código: Selecionar todos
static  char      u8_display_espelho[3];


void main (void)
{
        M_PORT_SEG_OUT;
        M_PORT_DSP_OUT;

        // Garanta o nível das portas
        M_PORT_SEG_ALL_OFF;
        M_PORT_DSP_ALL_OFF;

        strcpy(u8_display_espelho, "123");

        // Define a função da interrupção
        VICVectAddr0 = (U32) p_display_isr;
        VICVectCntl0 = DSP_VIC_ENABLE_INT;
        VICIntEnable = DSP_VIC_BIT_INT;
       
        T0MCR = 0x00000003;
        T0MR0 = DSP_FREQ_INT;

        // Enable timer 0
        T0TCR |= 0x00000001;

      // forever
      while(1);
}

void p_display_isr (void) __irq
{
        static  U8      u8_display_idx = 0;

        // Clear Flag
        T0IR = 1;

        // Apague o display
        M_PORT_DSP_ALL_OFF;
        M_PORT_SEG_ALL_OFF;

        M_PORT_DSP_ON(u8_display_idx);
        M_PORT_SEG_ON(u8_display_espelho[u8_display_idx]);

        if ( ++u8_display_idx == sizeof(u8_display_espelho) )
        {
                u8_display_idx = 0;
        }

        //Dummy
        VICVectAddr = 0x00000000;
}
Os homens mentiriam muito menos se as mulheres fizessem menos perguntas.
Avatar do usuário
barboza
Word
 
Mensagens: 948
Registrado em: 17 Out 2006 13:42
Localização: Longe de onde gostaria de estar

Mensagempor verd » 15 Jul 2010 09:08

barboza mudei a diretiva do projeto!! vou fazer utilizando rtos, a idéia é futuramente utilizar UML para organizar o desenvolvimento dos projetos!!
"Tem pessoas qua acham que sabem tudo....
eu já acho que não sei nada!!!"
verd
Byte
 
Mensagens: 262
Registrado em: 28 Ago 2008 10:15

Mensagempor barboza » 15 Jul 2010 09:09

verd escreveu:barboza mudei a diretiva do projeto!! vou fazer utilizando rtos, a idéia é futuramente utilizar UML para organizar o desenvolvimento dos projetos!!


Isso não muda a necessidade da int.
Se não roda uma int, imagina um RTOS e UML!
Os homens mentiriam muito menos se as mulheres fizessem menos perguntas.
Avatar do usuário
barboza
Word
 
Mensagens: 948
Registrado em: 17 Out 2006 13:42
Localização: Longe de onde gostaria de estar

Mensagempor verd » 15 Jul 2010 10:59

barboza eu to meio perdidão ainda, to aprendendo a mexer com o arm! aprendi o basicão do hardware e num mando muito bem na programação ainda, consegui fazer as interrupções no LPC2378, que foi no que eu aprendi, ai funcionava belezinha, eu estava tentando portar meu código para o LPC 2138 para simular no proteus, ai estava meio perdido com as configurações, mas F***, estava simulando no proteus, que dava muito pau e não simulava direito! já abandonei!! comprei um kit LPC 1768 e um JTAG, estou aguardando chegar, vou direcionar os estudos para o LPC 1768 utilizando rtos. No momento estou aprendendo o rtos com o keil, depois iniciarei o desenvolvimento em cima do kit! ai f****! hehehe!

Valeu barboza! obrigado pela pasciência!!
"Tem pessoas qua acham que sabem tudo....
eu já acho que não sei nada!!!"
verd
Byte
 
Mensagens: 262
Registrado em: 28 Ago 2008 10:15

Próximo

Voltar para ARM

Quem está online

Usuários navegando neste fórum: Nenhum usuário registrado e 1 visitante

cron

x