Página 1 de 2
LPC 2148 e Display alfa-numerico de 16 segmentos

Enviado:
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?

Enviado:
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.

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

Enviado:
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ê

Enviado:
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.

Enviado:
07 Jul 2010 13:29
por verd
Valeu Rodrigo!!!
Obrigado pelas dicas barboza!!!

Enviado:
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!!

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

Enviado:
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;
}

Enviado:
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]

Enviado:
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;
}

Enviado:
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;
}

Enviado:
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!!

Enviado:
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!

Enviado:
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!!