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?
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.
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 :-)
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
#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.
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.
jsolarski
stevenvh
jsolarski