PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Sieben-Segment Anzeige wie ansteuern?



Soeni
19.03.2009, 21:25
Nun möchte ich eine Sieben-Segment Anzeige (beliebig [max. 20Stück] erweiterbar) realisieren. Würde am liebsten vor jedem Segment eine art Speicher legen, dieser wird dann passend Beschrieben und mein RN-Control (ATMega16) wechselt dann den Speicher usw.

So nun zwei Fragen: Ist sowas überhaupt sinnvoll und wenn ja was für ein Speicher verwenden? Oder soll doch eher ein BUS (z.B. SPI) verwendet werden? -->sehe das Problem bei einem Bus das es Software technisch schwere zu Handhaben ist, ergo ich habe erst vor zwei Wochen angefangen und möchte nicht gleich alles zu schwer machen beim Programmieren [Bascom].

Zweite Frage: Was ist wenn gerade eine neue Ausgabe auf die Speicher geladen wird und der Controller aber aus irgendeinem Grund (z.B. Interrupt) unterbrochen wird und die Interrupt Routine etwas länger dauert dann wird ja völliger mist angezeigt, wie verhindert man sowas? Oder ist das einer der größten/ausschlaggebenden gründe nicht auf diese weise die Segmente anzusteuern?

Wäre dankbar wenn ihr mir etwas bei diesem Problem hälfen könnte...

Nochetwas ich möchte alle Pins des Controllers nur so gering wie möglich mit Strom belasten.

021aet04
19.03.2009, 23:03
Für bis zu 20 SSG würde ich einen Bus (I2C, SPI,...) verwenden.
Du wirst weitere Ein- und Ausgänge für eine Steuerung brauchen.
Wenn du noch nicht mit einem Bus arbeiten willst, verwende am Anfang LEDs

JeyBee
20.03.2009, 11:55
Ich empfehle, sofehrn du ein Steckbrett besitzt, erst einmal eine bis zwei Segment Anzeige darauf zu testen. Somit hast du es später auch beim verdrahten leichter haben.

Wenn du z.B. die Zahlen von 0-9 anzeigen willst, kannst du im Programm eine Art Tabelle erstellen, bei der jede Ziffer vorgegeben ist. Somit musst du im Programm nur noch schreiben "1", dann wird auch einfach eien 1 anzgezeit. Somit erspartst du dir ne Menge Schreibarbeit.


Mfg JeyBee

thewulf00
20.03.2009, 12:01
Am Anfang habe ich es so gemacht und es hat auch sehr schnell funktioniert:

Du nimmst als Speicher ein Schieberegister. Diese Register haben den Sinn, dass Du die Daten hineinschiebst (nacheinander, also seriell), und sie geben dann auf Befehl die Daten parallel aus (d.h. alle gleichzeitig).
Das einfach daran ist, Du kannst die Schieberegister nacheinander schalten, und dadurch hast Du zwar ne Art Bus, aber kaum Softwareaufwand.

Und mach Dir in diesem Fall keine Sorgen ums Unterbrechen, wenn Du einen Interrupt zwischenrein kriegst, ändert das nichts, aus zwei Gründen:
- Der Interrupt ist sehr kurz
- Das Schieberegister schiebt nur auf Deinen Befehl, also schiebt es bei einem Interrupt eben mal 2ms lang nichts.

Ich hab zwar keine 7-Segment-Anzeigen verwendet, aber LEDs, das kommt von der Anzahl aufs selbe raus, ich hatte dann eine Matrix von insg. 60 LEDs, und konnte ein Bild (d.h. 60 mal schieben) innerhalb weniger ms aufbauen, so dass ich sogar "Filme" abspielen lassen konnte, ohne dass man Flackern, o.ä. gesehen hätte.
Für genauere Infos und Hilfen einfach hier schreiben oder an mich wenden.

Soeni
20.03.2009, 13:46
Danke für die schnelle Info. Also die eigentliche Verdrahtung (Vorwiderstände, Spannungsversorgung/regelung) stellt nicht so das große Problem da...mein Vater ist Elektroniker von Beruf der kann mir notfalls helfen. Diverse Sockel, verschiedene Platinen und Kleinteile sind auch alle vorhanden...

Mein eigentliches Problem ist wie schon genannt die genau Ansteuerung (I2C, SPI...) und die Umsetzung in der Bascom (Bascom-AVR).

Momentan läuft es darauf hinaus dass die Ansteuerung per Schieberegister realisiert wird.

Meine Fragen:
- Ist der SPI der richtige Port?
- Ist eine Tabelle und die Ansteuerung des SPI Port für einen Anfänger zu schwer?
- Was für ein IC muss ich verwenden? z.B. der 74HCT595 kann laut Datenblatt nur 70mAh insgesamt schalten. Würde aber gerne mind. pro Ausgang 20mAh (insgesamt 160mAh). Gibt es passende ICs die höhere Ströme vertragen? Oder muss ein Transistor hintergeschaltet werden?

thewulf00
20.03.2009, 14:05
Also ich empfehle ein normales Schieberegister, das hat dann keinen Bus, sondern nur die drei Eingänge: Data, Clock und Output_Enable. Hinten dran dann ein Treiber-IC (ULN2803), und daran dann die LEDs/Segment-Anzeigen.
Fertig.

Soeni
22.03.2009, 22:09
Also ich habe nun mal ein Schaltplan entworfen. Dazu habe ich noch einige Fragen.

1. Gehört der Eingang SER vom 74HC595 an MOSI des Controllers?
2. Darf ich RCK an jeden beliebigen Pin hängen und dieser Pin wird dann einfach kurz von Low auf High geschaltet? (Hier wurde er auf PB0 gelegt)
3. Ist es gut wenn ich ein 100nF Kondensator zwischen G und SCL lege als Stabilisierung?
4. Pin 9 vom IC8 (QH*) kann frei bleiben oder?
5. Wenn ich noch ein Eingang auch per Registerverschiebung anschließen möchte wie wird der dann angeschlossen?
6. Kann ich die Schaltung noch vereinfachen, vorallem wegen den Widerständen?

Im Anhang ist der Schaltplan. Dies würde ich einfach auf einer Lochrrasterplatine machen. Wie gesagt kommen evt. noch weitere vier Module drauf und ein weiterer Eingang zur Tastenabfrage und evt. noch ein Ausgangsport um ext. Lampen anzusteuern (per PWM). Da wäre es halt geschickt Bauteile und verbindungen einzusparen...

Danke für die Hilfe

Soeni
23.03.2009, 21:30
Hat keiner eine Antwort?

Vitis
23.03.2009, 22:36
hmmm ... also,
die Schieberegister kannst Du an MOSI und SCK anschließen
und die SPI benutzen, musst Du aber nicht.
Du kannst auch 2 Beliebige Pins nehmen und einfach
den Wert synchron ausshiften.
Beides ist möglich.
Nen Kondensator an RCK halt ich für keine gute Idee ...
Signalleitungen würd ich nicht puffern, das versaut Dir nur die Flanken.
Dein µC sollte den Haltestrom schon bringen.
IC8 QH bleibt offen, es sein denn Du willst n weiteres Schieberegister
anhängen.
Die Schieberegister haben Ausgänge, ich würd sie nicht mit Eingängen mischen.
Wenn Du noch andere Verbraucher schalten willst kannste das
klaro über weitere Register machen ... entsprechende Treiber natürlich
mit dazu.
Vereinfachen ... hmmmm ... mal abgesehen die Geschichte einfach
per Multiplex zu betreiben fällt mir keine Vereinfachung ein. Dann
brauchste halt die Vorwiderstände nur einmal für den Bus.

Soeni
24.03.2009, 11:44
die Schieberegister kannst Du an MOSI und SCK anschließen
und die SPI benutzen, musst Du aber nicht.
Du kannst auch 2 Beliebige Pins nehmen und einfach
den Wert synchron ausshiften.
Beides ist möglich.

Also ich will es schon per Hardware SPI realisieren, damit ich das ansteuern verschiedener Busarten lerne. Also sollte es richtig sein das SER an MOSI kommt und SCK an SCK.


Nen Kondensator an RCK halt ich für keine gute Idee ...

die Kondensatoren an den ICs sind zwischen GND und SCL [+5V] gelegt und nicht auf RCK. Ist vllt. etwas schlecht von mir gezeichnet gebe ich zu. Ist aber mein erster erstellter Schaltplan. Habe ich jetzt eigendlich grundlegende Fehler gemacht wie der Schaltplan strukturiert ist?


IC8 QH bleibt offen, es sein denn Du willst n weiteres Schieberegister
anhängen.

Danke, das wollte ich genau hören.


Die Schieberegister haben Ausgänge, ich würd sie nicht mit Eingängen mischen.

Mhmm wie schließe ich dann meine Taster an?

Bin dir sehr dankbar für deine Antwort.

Vitis
24.03.2009, 12:54
nun, wenn du schon Busse Kennenlernen willst kannste
die Taster z.B. über PC8574 an TWI / I²C hängen.
Oder halt direkt an den µC ...

Besserwessi
24.03.2009, 16:27
Zur Not kann man die 70 mA Grenze des 74HCT595 noch etwas anheben, indem man die hälfte der LEDs mit gemeinsamer anode und kathode nutzt. Allerdings wird dann die Programmierung unübersichtlich und es besteht die Gefahr das man keine ganz einheitliche Helligkeit hinkriegt.

Wenn man mehr Helligkeit braucht würde ich bei der Wahl der Anzeigen aufpassen und ggf. eine Filterscheibe nutzen. Dann sollte man auch mit 5-10 mA noch auskommen.
Es gibt sonst auch Schieberegister mit Leistungsausgang.

hardware.bas
24.03.2009, 17:01
Warum nutzt Du nicht die klassische Multiplexansteuerung für 7-Segment-
anzeigen, dazu brauchst Du 7 Ports für die Segmente und X Ports für
die Ziffernstellen. Die Segmenttreiber müssen den Strom von X Segmenten
abkönnen und die Stellentreiber den Strom von 7 Segmenten. Je nachdem,
ob man Anzeigen mit gemeinsamer Anode oder Kathode nutzt, kann man
die PNP- und NPN-Treiber in die entsprechenden Zweige schalten.
VG Micha

Soeni
24.03.2009, 18:15
Zur Not kann man die 70 mA Grenze des 74HCT595 noch etwas anheben

Schau mal das von mir Gepostete Schaltbild an, dort ist hinter dem 74HC595 ein ULN 2803 geschaltet der sollte die 20mA pro Ausgang verkraften...


Es gibt sonst auch Schieberegister mit Leistungsausgang

Hast du ein Link/Bezeichnung?


Warum nutzt Du nicht die klassische Multiplexansteuerung für 7-Segment-
anzeigen

mMn ist es so wie es jetzt aufgebaut ist leichter Softwaremässig zu betreiben weil nur alle 32Bits durchgezogen werden und danach dann kurz eine Steigende Flanke ausgegeben wird und fertig. Beim Multiplexverfahren muss der Ausgang angelegt werden dann der Passende x Port dann wieder abschalten dann nächstes Modul usw. Dabei sehe ich als großer nachteil das der Controller ständig damit beschäftigt ist die Module anzusteuern und kann aber keine anderen Aufgaben übernehmen. Der µC ist ja für alles zuständig nicht nur für die Module. Und ich habe gelesen das dadurch die LEDs nicht mit voller hellichkeit leuchten sondern sie sind ja nur ~1/4 der zeit an...und wenn ich noch mehr anschließe noch weniger. :-s

lasse mich von dir aber gerne eines Besseren belehren.

Soeni
31.03.2009, 21:02
Also die Schaltung ist jetzt aufgebaut. Ich habe folgendes Beispielprogramm reingeladen:


$regfile = "m16def.dat"
$crystal = 16000000

Config Spi = Hard , Data Order = Msb , Master = Yes , Polarity = High , Phase = 0 , Clockrate = 4 , Noss = 0

Dim X As Byte
Dim Y As Byte

Do
X = &B00000000

Spiinit

Y = Spimove(x)

Wait 1

X = &B11111111

Spiinit

Y = Spimove(x)

Wait 1

Loop
End

aber es geht nicht. Hardware funktioniert aber, da ich dann selbst einen Takt erzeugt habe per Controller. Kann mir jemand noch mal erklären wie man das per SPI lösen kann? Stichwort: Befehl Spiout und shiftout?