PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : 7 Segmentanzeige multiplexen



Maverick83
16.08.2006, 18:22
Hallo Zusammen

Ich habe hier einen ATmega32 vor mir. Mit dem möchte 2 7Segment LED Anzeigen ansteuern. Es soll eine Anzeige für einen Kickerkasten werden.

Jedes dieser 7Segmentanzeigen ist 2-Stellig (geht also bis 99).
Damit ich nicht zuviele Ports brauche möchte ich einen Port pro 2-Stellige Anzeige multiplexen.

Also z.b. die Zahl 12 soll angezeigt werden.
Zuerst soll am PortA die Zahl "1" ausgegeben werden und mit dem PortB0 soll die 2.Anzeige aktiviert werden.

Beim nächsten Tackt wird die Zahl "2" am PortA ausgegeben aber diesmal wird PortB1 aktiviert und bringt so die 1.Anzeige zum leuchten.

Weil dies mit 1MHz geht, kann das menschliche Auge nicht erkennen dass die LED der Anzeige aus- bzw. angehen und es erscheint die Zahl 12 auf der Anzeige.

Nun hat jemand schon Code für so etwas?
Ich hoffe ihr seit bei meiner Beschreibung draus gekommen.

tristate
16.08.2006, 19:00
code kenn ich keinen fertigen sollt aber auch nicht das Problem sein.
Bei zu hohem Takt kommen aber die leds nicht hinterher
mfg

izaseba
16.08.2006, 20:03
Hallo,
sowas läßt sich ziemlich einfach programmieren, z.B. so:

zuerst ein Array, wo die Zahlen 0-9 gespeichert sind bei mir so:


const uint8_t zeichen[] ={
0x3F, /*0*/
0x18, /*1*/
0x6D, /*2*/
0x7C, /*3*/
0x5A, /*4*/
0x76, /*5*/
0x77, /*6*/
0x1C, /*7*/
0x7F, /*8*/
0x7E /*9*/
};

Dann brauchst Du zwei Variablen, die Deine zwei Zahlen darstellen:


volatile uint8_t erste = 1;
volatile uint8_t zweite = 2;


Jetzt schmeißt Du einen Timer an und in seinem Overflowinterrupt kommt folgendes rein :


static uint8_t zahl = 0;/*Spechert Welche Zahl dran ist*/

if (zahl){
PORTB &=~(1<<ENABLE2);
PORTB |=(1<<ENABLE1);
PORTD = ~(zeichen[erste]);
zahl=0;
} else {
PORTB &=~(1<<ENABLE1);
PORTB |=(1<<ENABLE2);
PORTD = ~(zeichen[zweite]);
zahl=1;
}

So, am PortD kamen bei mir die Anoden, und am PortB die Beiden Kathoden die mit ENABLE1 u. ENABLE2 definiert sind.

Du brauchst auch kein Timer von 1 MHz, ich glaube ich habe irgendwas um 200 Hz oder so, muß mal probieren, was nicht mehr flackert.

Ich hoffe, ich konnte Dir damit etwas helfen.

Gruß Sebastian

Maverick83
17.08.2006, 09:29
Ja Danke, ihr habt mir schon weitergeholfen.
Ich hätte jetzt nicht daran gedacht, dass die LED's mit 1MHz nicht mehr nachkommen würden.
Also werde ich es wohl mit einem Timer machen müssen.
In meinem ersten Codeentwurf habe ich eine Funktion geschrieben, die eine Zahl in Zehner und Einer aufspaltet und dann mittels "switch" die richtigen Ausgänge ansteuert.
Aber ein Array ist viel eleganter!!

Noch eine Frage zum eine Zahl in Zehner und Einer zerlegen:
Für die Einer würde ich z.b in Java die Modulo "mod(zahl/10)" Methode nehmen. Ich hab aber im "math.h" Includefile keine solche Funktion gesehen.
Habt ihr mir auch für das einen guten Tipp?

Vielen Dank

Maverick83
17.08.2006, 15:57
Ach ja, ich Depp! ](*,)

habs gerade gemerkt...
Modulo in C = "%"

Morpheus2001
17.08.2006, 17:48
in java is modulo auch %...

izaseba
17.08.2006, 18:40
Noch eine Frage zum eine Zahl in Zehner und Einer zerlegen


Frage, wozu zerlegen ????

Du willst das für einen Kickerkasten machen, also direkt BCD rechnen, auf ein Ereignis, Tastendruck, oder was auch immer:


zweite++;
if ( zweite > 9) {
zweite = 0;
erste ++;
}
if ( erste > 9) erste = 0;


Dann brauchst Du nichts mehr umzurechnen...

Gruß Sebastian

Maverick83
17.08.2006, 18:57
Du hast recht, das hab ich mir auch schon überlegt.

Ich habe aber eine Klasse decToBcd geschrieben. Damit ich später diese Klasse wieder einmal verwenden kann.

Ich möchte daher der Funktion nur einen Integer Wert mitgeben.

Danke für die Hilfe.

izaseba
17.08.2006, 19:23
Ja gut, es war nur ein Tip :-)

So eine dec2Bcd Routine ist auch was feines, vor allem, wenn man ADC Messungen darstellen will.

Gruß Sebastian

abendrise
01.06.2011, 14:19
Die Ausgabe von Zahlenwerten auf ein Text-LCD ist sicherlich das Nonplusultra, aber manchmal liegen die Dinge sehr viel einfacher. Um beispielsweise eine Temperatur anzuzeigen ist ein LCD etwas Overkill. In solchen Fällen kann die Ausgabe auf ein paar 7-Segmentanzeigen gemacht werden. Ausserdem haben 7-Segmentanzeigen einen ganz besonderen Charme