Página 1 de 2

LPC 2148 e Display alfa-numerico de 16 segmentos

MensagemEnviado: 07 Jul 2010 11:13
por verd
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?

MensagemEnviado: 07 Jul 2010 11:18
por styg
eu se tenho IO sobrando faço a interface com 8 bits, que é mais rapido.

mas geralmente como nao tenho, vou de 4bits msm.

MensagemEnviado: 07 Jul 2010 11:20
por verd
stig esqueci de comentar, é display alfa-numérico!! tenho que enviar 16 bits para ele!!

MensagemEnviado: 07 Jul 2010 12:30
por Rodrigo_P_A
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ê

MensagemEnviado: 07 Jul 2010 12:46
por barboza
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.

MensagemEnviado: 07 Jul 2010 13:29
por verd
Valeu Rodrigo!!!

Obrigado pelas dicas barboza!!!

MensagemEnviado: 08 Jul 2010 08:00
por verd
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!!

MensagemEnviado: 09 Jul 2010 07:58
por verd
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

MensagemEnviado: 09 Jul 2010 08:29
por barboza
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;
}

MensagemEnviado: 09 Jul 2010 10:10
por verd
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]

MensagemEnviado: 09 Jul 2010 10:24
por barboza
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;
}

MensagemEnviado: 14 Jul 2010 16:37
por barboza
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;
}

MensagemEnviado: 15 Jul 2010 09:08
por verd
barboza mudei a diretiva do projeto!! vou fazer utilizando rtos, a idéia é futuramente utilizar UML para organizar o desenvolvimento dos projetos!!

MensagemEnviado: 15 Jul 2010 09:09
por barboza
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!

MensagemEnviado: 15 Jul 2010 10:59
por verd
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!!