Ist es möglich, mit MSP430G2231 4 Sieben-Segment-Anzeigen anzusteuern?

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?

msp430 14-polige DIPS haben 10 Ports P1.0 bis P1.7 und P2.6 und p2.7
@jsolarski - Er bräuchte mindestens 11:7 für die Segmente und 4 für die Ziffern. (Und vielleicht ein paar Knöpfe)
@stevenh gute Zeit, den neuen 20-poligen msp430g2x52 oder msp430g2x12 zu verwenden? 16 Pins für GPIO +8K Programmierraum und 256b RAM

Antworten (4)

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.

Geben Sie hier die Bildbeschreibung ein

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 :-)

Der MAX6950 kostet bei Digi-Key 13,84 $!
So? Es ist nicht so, dass er nach billig gefragt hat – er hat nach möglich gefragt.
@Leon - Ja, das ist nicht billig. Ich wundere mich warum. Es ist ein ziemlich einfacher Chip, 17000 Transistoren. IIRC Ich habe die 7219 für 2,50 Euro gekauft.
@Leon - Ich habe mich nach anderen Anzeigetreibern von Maxim umgesehen und festgestellt, dass der MAX6955 (den Sie hier empfohlen haben ) sogar doppelt so viel kostet! ($28)
Es sieht so aus, als hätte Maxim Bemerkungen von Kunden erhalten, die den max7219 zu groß fanden, also wechselten sie von einem 24-Pin-Skinny-DIP zu einem 16-Pin-QSOP (5 mm lang vs. 30!). Das sind zu wenig Pins für das übliche Multiplexing, wie es der max7219 verwendet, also verwendet der max6950 Charlieplexing.

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

Geben Sie hier die Bildbeschreibung ein

    #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.

Ich möchte keinen externen Kristall verwenden. Kann ich die Pins XIN, XOUT für meine I/O-Zwecke verwenden?
Wenn Sie irgendeine Art von Genauigkeit wollen, ist ein Kristall unerlässlich! Selbst wenn Sie darauf verzichten, haben Sie nicht genügend Ausgänge (Sie benötigen 11).
Ja, Sie können xin und xout verwenden, sie sind mit P2.6 und P2.7 gekennzeichnet
@Leon - Der PCF8575 ist als LED-Treiber nicht sehr gut geeignet. Der maximal zulässige Gerätestrom beträgt 100 mA. Wenn Sie also 16 LEDs gleichzeitig ansteuern möchten (2 Ziffern in der Uhr von @frbry), können Sie nur 6 mA pro LED haben
Es würde einige Treibertransistoren benötigen.
@Leon - "einige Treibertransistoren". Ja, 16 davon. Plus 16 zusätzliche Widerstände. Hm. Wäre so etwas wie TPIC6C595 nicht besser geeignet? Tut kein I2C, ist aber leicht genug, um Bit-Bang zu machen. Und Sie würden zwei davon für 16 I/Os (sie sind kaskadierbar), aber zumindest brauchen Sie nicht all das Hühnerfutter.

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.

Ein Schaltplan wäre hilfreich. Außerdem werden Blogs und externe Links entfernt, also fügen Sie bitte den Hauptteil des Textes in Ihre Antwort ein und verlinken Sie auf den Blog als Referenz. Dadurch bleibt Ihre Antwort relevant, auch wenn der Inhalt verschwindet.