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