Forum: Mikrocontroller und Digitale Elektronik 7 Segmentanzeige Multiplexen


von chris M. (christian19)


Lesenswert?

Grüß euch!

Heute habe ich 2x 7-Segmentanzeigen bekommen (Type Kingbright 
SA08-11GWA)

Ich versuche schon die ganze Zeit diese zwei mit meinem Atmega 32 
anzusteuern via der Multiplexmethode.
Mein Zielprojekt zurzeit ist ein einfacher Zähler der bis 99 geht und 
wieder automatisch bei 0 beginnt.

Leider verstehe ich nicht ganz wie das ganze abläuft!

Die Segmente A-G + DP liegen auf PD0-PD7 und die zwei Basen von den 
Transistoren auf A0 und A1.

So ich weiß,dass ich mir leichter tue indem ich die Zahlen 0-9 einmal 
festlege dies geschieht mit :
1
 
2
const int8_t numbers [10] = {01000000, 01111001, 00100100, 00110000, 00011001, 000010010, 00000010, 01111000, 00000000, 00010000};



Folgende Punkte sind unklar:

*Wie sieht es mit der Steuerung von den Transistoren aus?
Da ja die Einerstelle einen braucht aber auch die Zehnerstelle,
stimmt somit meine Überlegung:
1
 if (Variable<10)
2
{ 
3
Transistor von Einerstelle durchschalten;
4
}
5
6
if (Variable ==10)
7
{
8
Beide Transistoren durchschalten;
9
}
?


*Wie werden Zahlen wie z.B. 34 angezeigt bzw.  wie lässt es sich leicht 
realisieren,  von z.b. 39 auf 40 zu kommen, da sich ja hier die 
Zehnerstelle und die Einerstelle ändert!


*Die Zahlen werden mit numbers[10] festgelegt, bedeutet dies, wenn ich 
schreibe(Transistoren sind durchgeschaltet) PORT=numbers[1](=die Zahl 
0), dass diese dann auch angezeigt wird?



Danke im Vorraus

von axelr. (HTC mobil) (Gast)


Lesenswert?

>So ich weiß,dass ich mir leichter tue indem ich ...

In Berlin hört man machmal: "Dit iss mir schön!" Aber "Das ich mir 
leichter tue" iss man auch nich schlecht :))

Die Transistoren werden IMMER im Wechsel ein- und ausgeschaltet. Egal 
wie die Variable gerda steht.

Ausgabe( zahl )

Stelle1= zahl / 10
Stelle2 = zahl mod 10

So hast Du die Zehner und Einer.

dann machst Du dir ne Timerroutine, wo DU die beiden Stellen immer 
nacheinander ausgibts.

Timer1(ISR)

numbers[Stelle1]
Transistor1 an
bissl warten
Transistor1 aus
numbers[Stelle1]
Transistor2 an
bissl warten
Transistor2 aus

Ende Timer1(ISR)

in der timerroutine zu warten ist blöd, ich weis. Aber so ansatzweise

Axelr.

von Rainer (Gast)


Lesenswert?

Abwechselnd im Timer Stelle 1 und Stelle 2 ansteuern.

Wenn Stelle 1 = 0 dann kann auch gar nichts da stehen.
D.h. man muss für diesen Fall dann alle Segmente ausschalten, aber nicht 
in der Form, dass man die Stelle nicht mehr schaltet, sondern, dass da 
dann eben alle Segmente aus sind.

von N. Müller (Gast)


Lesenswert?

Aber bitte nicht in der ISR warten!

Lieber Timer ISR mit sagen wir mal 200 Hz un dann immer abwechselnd 
zehner und beim naechsten Aufruf die einer ausgeben.

Wer gerade dran ist kannst du mit einer volatile variable festlegen 
(z.b. Bit 1 fuer 1er Stelle...usw.)

Grüsse

von chris M. (christian19)


Lesenswert?

Grüß euch!

Danke für eure Tipps, die Anzeige läuft!

Mit freundlichen Grüßen,

Christian

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.