¿Es posible manejar 4 pantallas de siete segmentos con MSP430G2231?

1

Estoy tratando de enseñarme electrónica y mi objetivo es crear un reloj digital con 4 dígitos.

Tengo un MSP430G2231 que solo tiene 8 puertos disponibles por lo que puedo decir.

Vi algunos métodos para controlar múltiples pantallas de siete segmentos, como usar un multiplexor o transistores. Pero no parece posible con MSP430G2231 debido a su falta de puertos.

¿Estoy equivocado? ¿O podría hacerse? Si es así, ¿cómo?

    
pregunta frbry

4 respuestas

4

Como dice Leon, puedes usar un expansor de E / S, o incluso un controlador de pantalla LED. En el pasado, he usado el MAX7219, pero este es un dispositivo de 5V, para 3.3V tienes que ir al MAX6950. Esto puede manejar hasta cinco dígitos de 7 segmentos (el 6951 puede hacer 8), por lo que puede ser adecuado para su reloj. Se controla a través de SPI, por lo que solo necesita 3 pines de E / S de su controlador. El controlador realiza la multiplexación por usted, tiene un BCD a un decodificador de 7 segmentos y puede controlar el brillo a través del software. Un problema menor puede ser el paquete. El 7219 estaba disponible en DIL, pero el 6950 solo viene en un TSOP de 0.635 mm.

Dicesquenoquieresuncristal(¿porquéno?).Paraunreloj,normalmenteusaríauncristalparaobtenerlaprecisiónrequerida.Perotambiénpuedetrabajarconlafrecuenciadered,quealargoplazo,comomeses,esinclusomásprecisa.

editar
LeóncomentaacertadamenteelaltopreciodelMAX6950.ElMAX7219esmáseconómico,perocomodije,esundispositivode5V.Comosolonecesita3líneasparaconducir,puedeagregarfácilmentealgunoscambiosdenivel.Untransistorserásuficiente,almenossinoteimportagolpearelSPI(porqueinviertelaseñal).SideseautilizarelSPIenchip,necesitauncambiadordenivelnoinversor,como FXL4T245 (paquete difícil sin embargo).

Alternativamente, solo compre un MSP430 con más pines de E / S :-)

    
respondido por el stevenvh
4

Yo usaría 2 x 74HC 595 registros de desplazamiento He probado el ejemplo de código y el esquema Aquí enlace y funciona sin problema - sugeriría reemplazar el uln2003 con algunos transistores npn 2n2222 o 2n3909

    #include <msp430g2231.h>

unsigned int counter = 0;                   // Counter variable
unsigned int digitCounter = 0;            // Digit counter
unsigned char digit = 0;               // Single digit to be displayed
unsigned char bcd7digit[10] = {0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F}; // BCD to 7 digit map
unsigned char digitSelector[4] = {0x01, 0x02, 0x04, 0x08}; // Digit selector map

void main(void)
{
  WDTCTL = WDTPW + WDTHOLD;                 // Stop WDT

  P1OUT |= 0x01;                      // Port P1.0 will be used to latch
  P1DIR |= 0x01;

  USICTL0 |= USIPE6 + USIPE5 + USIMST + USIOE; // Out & clk enable, SPI Master
  USICTL1 |= USICKPH + USIIE;               // Counter interrupt, flag remains set
  USICKCTL = USIDIV_7 + USISSEL_2;          // /128 SMCLK
  USICTL0 &= ~USISWRST;                     // USI released for operation
  USICNT = USI16B;                           // Enable 16 bit

  CCTL0 = CCIE;                             // CCR0 interrupt enabled
  CCR0 = 500;                        //
  TACTL = TASSEL_2 + MC_1 + ID_3;           // SMCLK, upmode

  _bis_SR_register(LPM0_bits + GIE);        // Enter LPM0 w/ interrupt
}

// Timer A0 interrupt service routine
#pragma vector = TIMERA0_VECTOR
__interrupt void Timer_A (void)
{   
  digitCounter++;                       // Increase digit counter
  digitCounter &= 0x03;                // Mask, counter range is 0-3
  digit = counter>>(4 * digitCounter);       // Shift digits right
  digit &= 0x0F;                      // Mask, we need first digit only
  USISRL = bcd7digit[digit];             // Get segments from the map
  USISRH = digitSelector[digitCounter];    //
  if(digitCounter == 0) {
     counter = _bcd_add_short(counter, 0x01);// Decimally increase counter's when on first digit
  }
  USICNT |= 16;                              // Start USI
}

// USI interrupt service routine
#pragma vector = USI_VECTOR
__interrupt void USI_TXRX (void)
{
  USICTL1 &= ~USIIFG;                     // Clear pending flag
  P1OUT &= ~0x01;                     // Latch data
  P1OUT |= 0x01;
}

Otra opción sería usar 4 x 74HC595 y usar uno cada uno, por cada 7 segmentos que tengas, esto corta el multiplexado y puedes enviar una cadena de serie a través de la interfaz SPI o golpearlo. muy similar a la anterior. pero usa menos alfileres. Solo una idea

    
respondido por el jsolarski
1

Creo que en realidad tiene 8 pines de E / S (no puertos, tiene un puerto) disponible si usa un cristal, que es suficiente para cuatro pantallas multiplexadas de siete segmentos si usa un expansor de puerto adecuado. Sin embargo, podría ser sensato utilizar un dispositivo con más E / S.

Un expansor de puerto adecuado es el PCF8575, que puede ser conectado al MSP430G2231 a través de I2C. Te dará 16 I / Os. Cuesta menos de $ 2.

    
respondido por el Leon Heller
0

Puede conectar la salida de la USI (SPI) a un registro de desplazamiento 74HC164, que puede controlar una pantalla de 7 segmentos. El bit final del primer 74HC164 se puede conectar en modo de cascada a otro 74HC164, y luego a otro 74HC164 ... Entonces, con 4 piezas de 74HC164 en serie, simplemente transmite 4 bytes desde el USI para mostrar 4 dígitos.

Consulte enlace en el USI.

    
respondido por el TAN Ah Teck

Lea otras preguntas en las etiquetas