mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik 7-Segment Multiplex Library


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
Autor: D. M. (elektricar)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hallo zusammen,

ich wollte mir eine Konstantstromquelle mit 4 7-Segment-Anzeigen bauen.
Probleme habe ich noch bei der Ansteuerung der 7-Segment-Anzeigen und 
meinem Atmega8.
Gibt es eine Library in der man einfach die Portpins angeben kann, an 
denen die einzelnen Segmente angeschlossen sind?

Im Anhang ist der Schaltplan mit den Anzeigen.

Noch eine andere Frage:
Müssen die Ansteuerleitungen alle an einen Port angeschlossen sein?
Ist wahrscheinlich einfacher zum Programmieren, ich frage jedoch weil 
bei mir das dummerweise nicht so ist...

Ich hoffe ihr könnt mir helfen.

Vielen Dank im Voraus!

Gruß
DM

Autor: Karol B. (johnpatcher)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
D. M. schrieb:
> Müssen die Ansteuerleitungen alle an einen Port angeschlossen sein?

Das kommt doch ganz darauf an wie du das Ganze programmierst. I.d.R. 
kann man unter der Voraussetzung, dass sich alles am selben Port 
abspielt "effizienteren" Code produzieren, in der Praxis spielt das wohl 
kaum eine Rolle.

Passende Libraries sind mir keine bekannt, aber das Konzept wird hier 
[1] beschrieben und sollte sich problemlos umsetzen lassen. Wie man 
7-Segment anzeigen umsetzt, steht dann wiederum hier [2] - zwar in 
Assembler, das Konzept bleibt aber gleich.

Genug Beispielcode schwirrt hier im Forum (bzw. im Internet) auch herum.

D. M. schrieb:
> Probleme habe ich noch bei der Ansteuerung der 7-Segment-Anzeigen und
> meinem Atmega8.

Hast du denn konkrete Probleme? Wie sieht dein bisheriger Code denn aus? 
Was funktioniert nicht? Wie äußert sich das?

Mit freundlichen Grüßen,
Karol Babioch

[1]: https://www.mikrocontroller.net/articles/LED-Matrix
[2]: 
https://www.mikrocontroller.net/articles/AVR-Tutorial:_7-Segment-Anzeige

Autor: m.n. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Deine Verdrahtung ist leider ungeschickt; nimm für die 
Segementansteuerung den kompletten PortD. Ferner brauchen heutige 
7-Segementanzeigen (10-14mm) keine sonderlich hohen Ströme 
(2-5mA/Segment), sodass nur zusätzliche Digittreiber notwendig sind.
Mein Vorschlag inkl. Software: 
http://www.mino-elektronik.de/7-Segment-Variationen/LCD.htm#led4

Autor: MaWin (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
D. M. schrieb:
> Gibt es eine Library in der man einfach die Portpins angeben kann, an
> denen die einzelnen Segmente angeschlossen sind?

Gerade so eine fertige Bibliothek wäre doch extrem blöd, weil sehr 
codeaufwändig (vergleichbar mit sprintf in einem uC-programm, mit der 
Gefahr, daß der rumgetragene Ballast nicht erlaubt, daß das 
Gesamtprogramm noch in den Speicher passt).

D. M. schrieb:
> Müssen die Ansteuerleitungen alle an einen Port angeschlossen sein?
> Ist wahrscheinlich einfacher zum Programmieren,

und wird schneller ausgeführt

> ich frage jedoch weil bei mir das dummerweise nicht so ist...
uint8_t digit=0;
uint8_t segment[10]={0b11000000,0b11111001,0b10100100,0b10110000,0b10011001,0b10010010,0b10000010,0b11111000,0b10000000,0b10010000 };
int zahl;

uint8_t ziffer(int zahl,int stelle)
{
    while(stelle-->0) zahl/=10;
    return zahl%10;
}

so einfach ist der Code wenn die Ports passen
loop() // Hauptschleife oder timergesteuert
{
    PORTB~=1<<digit;
    digit=(digit+1)&3; // angenommen 4 Stellen
    PORTD=segment[ziffer(zahl,digit)];
    PORTB|=1<<digit;
    :
    restliches Hauptschleifenprogramm
    :
    _delay_ms(10); // falls nicht timergesteuert
}

So aufwändig wenn sie nicht passen:
struct
{
   int port;
   int bit;
}
definition[]=
{
   {PORTB,0}, // womöglich noch Polarität
   {PORTB,1},
   {PORTB,2},
   {PORTB,3},
   {PORTB,4},
   {PORTB,5},
   {PORTB,6},
   {PORTB,7},
   {PORTD,0},
   {PORTD,1},
   {PORTD,2},
   {PORTD,3}
};

void setpin(uint8_t pin,uint8_t value)
{
    if(value)
    {
        *(definition[pin].port)|=1<<definition[pin].bit;
    }
    else
    {
        *(definition[pin].port)&=~(1<<definition[pin].bit);
    }
}

loop() // Hauptschleife oder timergesteuert
{
    uint8_t i;

    setpin(8+digit,0);
    digit=(digit+1)&3; // angenommen 4 Stellen
    for(i=0;i<8;i++) setpin(i,segment[ziffer(zahl,digit)]&(1<<i);
    setpin(8+digit,1);
    :
    restliches Hauptschleifenprogramm
    :
    _delay_ms(10); // falls nicht timergesteuert
}

http://www.mikrocontroller.net/articles/AVR-Tutorial:_7-Segment-Anzeige

Autor: Peter D. (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
D. M. schrieb:
> Müssen die Ansteuerleitungen alle an einen Port angeschlossen sein?

Alle Segmente an einem Port: OUT Byte = 1 Befehl

Segmente wild verteilt: 8 * Clear Pin, Test Bit, Set Pin = 24 Befehle

Autor: Mw E. (Firma: fritzler-avr.de) (fritzler)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Kannst ja mal nen Blieck hierrauf werfen:
http://www.fritzler-avr.de/HP/tipps/multi.php

Autor: Thomas E. (Firma: Thomas Eckmann Informationst.) (thomase)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Peter Dannegger schrieb:
> Segmente wild verteilt: 8 * Clear Pin, Test Bit, Set Pin = 24 Befehle

Wenn es nicht anders geht, muss man da durch.

Atmega328: Quarz, UART, ADC und ein bisschen PWM...

mfg.

: Bearbeitet durch User
Autor: Marc V. (Firma: Vescomp) (logarithmus)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Peter Dannegger schrieb:
> Alle Segmente an einem Port: OUT Byte = 1 Befehl
>
> Segmente wild verteilt: 8 * Clear Pin, Test Bit, Set Pin = 24 Befehle

 Muss ja nicht sein.
 Mit einer etwas geänderter Tabelle fur Werte 0-9 geht das
 auch schneller
  ldi  zl, low(Table<<1)
  ldi  zh, high(Table<<1)
  clr  r15
  add  r16, r16          ; r16 ist die anzuzeigende Zahl
  add  zl, r16
  adc  zh, r15
  lpm    r16, Z+        ; Wert 1 aus Tabelle laden
  in     r24, PIND
  andi   r24, 0xC0
  or     r24, r16
  out    PORTD, r24
  lpm    r16, Z+        ; Wert 2 aus Tabelle laden
  in     r24, PINC
  andi   r24, 0x30
  or     r24, r16
  out    PORTC, r24

 DP mußt du in beiden Fällen gesondert rechnen, bzw. setzen, Byte
 mußt du auch in jedem Fall aus einer Tabelle laden, so...
 Und die paar Bytes und Cycles mehr machen kaum einen Unterschied.
 Besser als neue Platine zu machen...

: Bearbeitet durch User
Autor: D. M. (elektricar)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo zusammen,

danke für die vielen Antworten!

Martin Wende schrieb:
> Kannst ja mal nen Blieck hierrauf werfen:
> http://www.fritzler-avr.de/HP/tipps/multi.php

Mit dem Code habe ich schon rumhantiert, bislang leider erfolglos, da 
bei mir die Zeilen und Spalten nicht jeweils an einem Port hängen.

Mein Code ist eigentlich nur Kopiertes und Umhergeworfenes von dieser 
Seite...

Marc Vesely schrieb:
> Peter Dannegger schrieb:
>> Alle Segmente an einem Port: OUT Byte = 1 Befehl
>>
>> Segmente wild verteilt: 8 * Clear Pin, Test Bit, Set Pin = 24 Befehle
>
>  Muss ja nicht sein.
>  Mit einer etwas geänderter Tabelle fur Werte 0-9 geht das
>  auch schneller
>   ldi  zl, low(Table<<1)
>   ldi  zh, high(Table<<1)
>   clr  r15
>   add  r16, r16          ; r16 ist die anzuzeigende Zahl
>   add  zl, r16
>   adc  zh, r15
>   lpm    r16, Z+        ; Wert 1 aus Tabelle laden
>   in     r24, PIND
>   andi   r24, 0xC0
>   or     r24, r16
>   out    PORTD, r24
>   lpm    r16, Z+        ; Wert 2 aus Tabelle laden
>   in     r24, PINC
>   andi   r24, 0x30
>   or     r24, r16
>   out    PORTC, r24
>
>  DP mußt du in beiden Fällen gesondert rechnen, bzw. setzen, Byte
>  mußt du auch in jedem Fall aus einer Tabelle laden, so...
>  Und die paar Bytes und Cycles mehr machen kaum einen Unterschied.
>  Besser als neue Platine zu machen...

Eine neue Platine würde ich ungern machen, sieht aber ganz danach aus, 
da ich nur C lerne und es erstmal zum Laufen bekommen möchte.
Um mir die funktionierenden Codes für meinen Anwendungsfall 
umzuschreiben, fehlt mir aktuell noch die Erfahrung.
Deswegen die Frage nach den Libraries :)

Trotzdem vielen Dank an alle!
I'll be back! :D

Gruß DM

Beitrag #5691718 wurde von einem Moderator gelöscht.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.