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

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

Tengo un MSP430G2231 que tiene solo 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 por falta de puertos.

¿Me equivoco? O se podria hacer? Si es así, ¿cómo?

msp430 DIPS de 14 pines tiene 10 puertos P1.0 a P1.7 y P2.6 y p2.7
@jsolarski: al menos necesitaría 11: 7 para los segmentos y 4 para los dígitos. (Y tal vez algunos botones)
@stevenh ¿es buen momento para usar el nuevo msp430g2x52 o msp430g2x12 de 20 pines? 16 pines para GPIO +8K espacio de programación y 256b ram

Respuestas (4)

Como dice Leon, puede usar un expansor de E/S, o incluso mejor, 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 controlar 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 decodificador de BCD a 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 paso de 0,635 mm.

ingrese la descripción de la imagen aquí

Dices que no quieres un cristal (¿por qué no?). Para un reloj, normalmente usaría un cristal para obtener la precisión requerida. Pero también puede trabajar con la frecuencia de la red, que a largo plazo, como meses, es aún más precisa.

edit
Leon comenta correctamente sobre el alto precio del MAX6950. El MAX7219 es más económico, pero como dije, es un dispositivo de 5V. Dado que solo necesita 3 líneas para conducirlo, podría agregar fácilmente algunos cambiadores de nivel. Un transistor será suficiente, al menos si no le importa golpear el SPI (porque invierte la señal). Si desea utilizar el SPI en el chip, necesita un cambiador de nivel no inversor, como el FXL4T245 (aunque es un paquete difícil).

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

¡El MAX6950 cuesta $13.84 de Digi-Key!
¿Entonces? No es como si pidiera barato, pidió lo posible.
@Leon - Sí, eso no es barato. Me pregunto porque. Es un dado bastante simple, 17000 transistores. IIRC Compré el 7219 por 2,50 euros.
@Leon: busqué otros controladores de pantalla de Maxim y descubrí que el MAX6955 (que usted recomendó aquí ) ¡cuesta incluso el doble! ($28)
Parece que Maxim recibió comentarios de clientes que consideraron que el max7219 era demasiado grande, por lo que pasaron de un DIP delgado de 24 pines a un QSOP de 16 pines (¡5 mm de largo frente a 30!). Esos pines son demasiado pequeños para la multiplexación habitual como la que usa el max7219, por lo que el max6950 usa charlieplexing.

Usaría 2 registros de desplazamiento 74HC 595. Probé el ejemplo de código y el esquema aquí http://www.43oh.com/forum/viewtopic.php?f=9&t=255 y funciona sin problemas. Sugeriría reemplazando el uln2003 con algunos transistores npn 2n2222 o 2n3909

ingrese la descripción de la imagen aquí

    #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 tenga, esto corta la multiplexación y puede enviar una cadena en serie a través de la interfaz SPI o explotarla. muy similar al anterior. pero usa menos pines. Solo una idea

Creo que en realidad tiene 8 pines de E/S (no puertos, tiene un puerto) disponibles 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 usar un dispositivo con más E/S.

Un expansor de puertos adecuado es el PCF8575, que se puede conectar al MSP430G2231 a través de I2C. Le dará 16 E/S. Cuesta menos de $2.

No quiero usar ningún cristal externo. ¿Puedo usar los pines XIN, XOUT para mis propósitos de E/S?
¡Si desea algún tipo de precisión, un cristal es esencial! Aunque prescindas de él, no tendrás suficientes salidas (necesitas 11).
sí, puede usar xin y xout, están etiquetados como P2.6 y P2.7
@Leon: el PCF8575 no es muy adecuado como controlador de LED. La corriente máxima permitida del dispositivo es de 100 mA, por lo que si desea controlar 16 LED simultáneamente (2 dígitos en el reloj de @frbry), solo puede tener 6 mA por LED
Necesitaría algunos transistores de controlador.
@Leon - "algunos transistores de controlador". Sí, 16 de ellos. Más 16 resistencias adicionales. Hm. ¿No sería más apropiado algo como TPIC6C595? No hace I2C, pero es lo suficientemente fácil de usar. Y necesitaría dos de ellos para 16 E/S (son conectables en cascada), pero al menos no necesita toda esa comida para pollos.

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

Consulte http://singamicro-30-msp430g2231.blogspot.com/ en el USI.

Un esquema sería útil. Además, los blogs y los enlaces externos desaparecen, así que incluya la parte principal del texto en su respuesta y enlace al blog como referencia. Eso mantiene su respuesta relevante incluso si el contenido desaparece.