Hallo zusammen.
Wir benutzen gerade im Praktikum ein 8051-Board von Silicon.
Die Aufgabe ist: die 4 x 7-Segment-Anzeige mit Hilfe von
Zeitmultiplex-Verfahren zu steuern, also vonn 0000 bis 9999 hochzählen.
Der Quellcode soll in C geschrieben und sowohl auf Interrupt als auch
auf die delay-Funktion verzichtet werden.
Ich habe bißchen zu dem Thema Zeitmultiplex in Foren was durchgelesen.
Ich weiß nur, dass das menschliche optische Versagen dafür vrantwortlich
ist, aber verstanden, hab ich das Verfahren nicht.
Ich weiß, dass ich aufjeden Fall einen Zähler brauche, der von 0000 -
9999 hochzählen soll:
1
unsignedintcnt=0;
1
if(cnt>9999)cnt=0;
1
if(cnt<0)cnt=9999;
Dann habe ich einen Look up table für die jeweiligen Zahlen angelegt:
Als Hinweis steht, dass wir uns darübr Gedanken machen sollen, wie man
von einer 16-bit Zahl in dualer Darstellung einzelne Dezimalstellen
isolieren kann.
Da habe ich folgenden Ansatz:
tausender = Zahl / 1000;
hunderter = (Zahl % 1000)/100;
zehner = ((Zahl % 1000)%100)/10;
einser = (((Zahl % 1000)%100)%10);
Aber ich weiß nicht, wozu man es braucht?
Vielen Dank für Eure Antworten.
Max Lenz schrieb:> sowohl auf Interrupt als auch> auf die delay-Funktion verzichtet werden.
Ohne Delay ist klar, das ist Murks.
Aber ohne Timerinterrupt, wie soll das denn gehen?
Max Lenz schrieb:> Da habe ich folgenden Ansatz:>> tausender = Zahl / 1000;> hunderter = (Zahl % 1000)/100;> zehner = ((Zahl % 1000)%100)/10;> einser = (((Zahl % 1000)%100)%10);>> Aber ich weiß nicht, wozu man es braucht?
Also ein kleines bischen Mathe solltest Du schon können.
Man kann dafür auch sprintf() nehmen.
Peter
>Ohne Delay ist klar, das ist Murks.>Aber ohne Timerinterrupt, wie soll das denn gehen?
indem du einfach den Takt als Timer nimmst.
--> ein Zyklus Segment 1 anzeigen,
--> nächsten Zyklus Segment 2. usw
du kannst auch ein Vielfaches des Takts nehmen, falls der die Frequenz
zu ist.
Wenn der Controller nur dieses Programm abarbeitet gibts auch kaum
Helligkeitsunterschiede.
Max Lenz schrieb:> Aber ich weiß nicht, wozu man es braucht?
Die darzustellende Zahl wird doch sehr wahrscheinlich in einer 16Bit
Variablen hochgezählt. Wie sieht denn die prozessorinterne Darstellung
aus?
Um die Elemente in LUT zu adressieren brauchst du die gerade
darzustellende Wertigkeit der Dezimalstelle.
Ob die Berechnung richtig ist? Kein Simulator laufen?
Die Berechnung stimmt aber ich weiß nicht was si mit multiplexing zu tun
hat. Ich weiß nicht mal wie multiplexing funktionieren soll??
was meinst du mit gerade?
soll ich di Werte mal 2 nehmen?
Max Lenz schrieb:> Die Aufgabe ist: die 4 x 7-Segment-Anzeige mit Hilfe von> Zeitmultiplex-Verfahren zu steuern, also vonn 0000 bis 9999 hochzählen.
Das verstehe ich noch nicht ganz. Ist damit wirklich ein Hochzählen
gemeint?
"Multiplex" und "Anzeige" lässt mich eher vermuten, dass die Anzeige
matrixförmig angeschlossen ist und entsprechend angesteuert werden muss:
zyklisch über Zeilen und Spalten. Das müsste man dann bei der HW sehen
bzw. bei der Angabe, wie die Anzeige angeschlossen ist (Portbelegung).
Hast Du einen Schaltplan von dem Board oder eine genaue
Typenbezeichnung?
Gruß Dietrich
Max Lenz schrieb:> Es soll einfach von 0 bis 9999 hochgezählt werden.
Wenn das Deine Schaltung ist, dann ist das ja genau so, wie ich sagte.
Du brauchst dazu 2 Programmteile:
- Ansteuern der Anzeige per Multiplex: die einzelnen Anzeigen SEG1 bis
SEG4 werden nacheinander einzeln angesteuert, und zwar so schnell, dass
das Auge die Pausen nicht sieht (eine einzelne Anzeige kann ja nur 25%
der Zeit eingeschaltet sein). Das Ganze passiert dann zyklisch: SEG1 -
SEG2 -SEG3 - SEG4 - SEG1 - SEG2 ... usw. und läuft unabhängig vom Rest
des Programms dauernd.
- Ein Zähler wird hochgezählt; der Wert muss dann noch im Format
gewandelt werden von der binären Darstellung des Zählers in die dezimale
Darstellung der Anzeige (aber die Umrechnung hattest Du ja schon - ich
habe sie allerdings nicht geprüft).
Gruß Dietrich