Ich versuche, mir Elektronik beizubringen, und mein Ziel ist es, eine Digitaluhr mit 4 Ziffern zu erstellen.
Ich habe einen MSP430G2231, der, soweit ich das beurteilen kann, nur 8 verfügbare Ports hat.
Ich habe einige Methoden zum Ansteuern mehrerer Sieben-Segment-Anzeigen gesehen, wie die Verwendung eines Multiplexers oder von Transistoren. Mit MSP430G2231 scheint dies jedoch nicht möglich zu sein, da es an Ports mangelt.
Liege ich falsch? Oder könnte man das machen? Wenn ja, wie?
Wie Leon sagt, können Sie einen E / A-Expander oder noch besser einen LED-Anzeigetreiber verwenden. In der Vergangenheit habe ich den MAX7219 verwendet, aber dies ist ein 5-V-Gerät, für 3,3 V müssen Sie zum MAX6950 gehen. Dies kann bis zu fünf 7-Segment-Ziffern ansteuern (der 6951 kann 8), so dass dies möglicherweise für Ihre Uhr geeignet ist. Es wird über SPI gesteuert, sodass Sie nur 3 E / A-Pins Ihres Controllers benötigen. Der Treiber erledigt das Multiplexing für Sie, hat einen BCD-zu-7-Segment-Decoder und Sie können die Helligkeit per Software steuern. Ein kleines Problem kann das Paket sein. Der 7219 war in DIL erhältlich, aber der 6950 ist nur in einem TSOP-Raster von 0,635 mm erhältlich.
Du sagst, du willst keinen Kristall (warum nicht?). Für eine Uhr würden Sie normalerweise einen Kristall verwenden, um die erforderliche Genauigkeit zu erhalten. Sie können aber auch mit der Netzfrequenz arbeiten, die über längere Zeiträume wie Monate noch genauer ist.
edit
Leon weist zu Recht auf den hohen Preis für den MAX6950 hin. Der MAX7219 ist günstiger, aber wie gesagt, es ist ein 5-V-Gerät. Da Sie nur 3 Leitungen benötigen, um es zu fahren, können Sie problemlos ein paar Level-Shifter hinzufügen. Ein Transistor reicht aus, zumindest wenn es Ihnen nichts ausmacht, den SPI zu schlagen (weil er das Signal invertiert). Wenn Sie den On-Chip-SPI verwenden möchten, benötigen Sie einen nicht invertierenden Level-Shifter wie den FXL4T245 (allerdings schwieriges Paket).
Alternativ kaufen Sie einfach einen MSP430 mit mehr I/O-Pins :-)
Ich würde 2 x 74HC 595 Schieberegister verwenden. Ich habe das Codebeispiel und den Schaltplan hier http://www.43oh.com/forum/viewtopic.php?f=9&t=255 ausprobiert und es funktioniert ohne Probleme - würde ich vorschlagen Ersetzen des uln2003 durch ein paar 2n2222 oder 2n3909 npn-Transistoren
#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;
}
Eine andere Option wäre die Verwendung von 4 x 74HC595 und die Verwendung von jeweils einem. Für jedes 7-Segment, das Sie haben, wird das Multiplexing unterbrochen, und Sie können einfach eine serielle Zeichenfolge über die SPI-Schnittstelle senden oder sie bitbangen. sehr ähnlich wie oben. verwendet aber weniger Stifte. Nur eine Idee
Ich denke, es stehen tatsächlich 8 E / A-Pins (keine Ports, es hat einen Port) zur Verfügung, wenn Sie einen Kristall verwenden, was für vier gemultiplexte Sieben-Segment-Anzeigen ausreicht, wenn Sie einen geeigneten Port-Expander verwenden. Es kann jedoch sinnvoll sein, ein Gerät mit mehr I/Os zu verwenden.
Ein geeigneter Port-Expander ist der PCF8575, der über I2C mit dem MSP430G2231 verbunden werden kann. Es gibt Ihnen 16 I/Os. Es kostet weniger als $2.
Sie können den USI(SPI)-Ausgang an ein 74HC164-Schieberegister anschließen, das eine 7-Segment-Anzeige ansteuern kann. Das letzte Bit vom ersten 74HC164 kann im Kaskadenmodus mit einem weiteren 74HC164 und dann mit einem weiteren 74HC164 verbunden werden ... Wenn Sie also 4 Stück 74HC164 in Reihe schalten, übertragen Sie einfach 4 Bytes von der USI, um 4 Ziffern anzuzeigen.
Siehe http://singamicro-30-msp430g2231.blogspot.com/ auf der USI.
jsolarski
stevenvh
jsolarski