Forum: Mikrocontroller und Digitale Elektronik Multiplexen - 2 Sieben Segment Anzeigen


von Marduk (Gast)


Angehängte Dateien:

Lesenswert?

Servus,

Ich habe bereits den Assemblercode für eine Sieben Segment Anzeige 
erstellen können:

L1:

MOV A,P2 ; Es wird irgendein Hexadezimalwert eingelesen
ANL A,#0Fh
MOV R7,A
SUBB A,#10d
INC L1
MOV A,R7
MOV DPTR,#Tab_Seg ; entsprechende Konvertierung in Tab_Seg beigefügt
MOVC A,@A+DPTR
MOV P0,A
LMP L1

Tab_Seg:
DB 3Fh ;0
DB 06h ;1
DB 5Bh ;2
.
.
.
DB 71h ;F
END


Nun möchte ich zwei Sieben Segment Anzeigen darstellen.
Im Anhang ist eine schematische Darstellung, wie ich das multiplexen 
kann.
Jedoch weiss ich nicht, wie ich den Code schreiben soll.
Ich würde davon davon ausgehen, dass man mit Rotationsbefehlen arbeiten 
könnte, aber bin mir da nicht sicher.
Ich würde mich um Hilfe freuen.

lg

Marduk

von Uwe B. (uwe_beis)


Lesenswert?

Du schreibst nicht, was die zweite Anzeige darstellen soll, aber 
wahrscheinlich sollen es die MSBits von P2 sein.

Was ist dein Problem? Ein Multiplex-Algorithmus oder die zweite Ziffer 
bzw. die MSBits vom Port zu "extrahieren"?

Um die MSBits zu verarbeiten nimmst du den selben Algorithmus, nur kommt 
nach MOV A,P2 ein SWAP A hinzu.

Um zu Multiplexen schaltest du vor der Ausgabe einer Ziffer beide 
Kathoden aus, dann gibst du die Werte der Ziffer aus, dann wird die 
zugehörige Kathode eingeschaltet. Ist doch eigentlich so simpel !?!

von Marduk (Gast)


Lesenswert?

Vielen Dank erst einmal,

Ja ich benötige einen Multiplex Algorithmus.Da das Thema für mich recht 
neu ist, bin ich da noch etwas grün hinter den Ohren :)

von Georg (Gast)


Lesenswert?

Marduk schrieb:
> Ja ich benötige einen Multiplex Algorithmus

Nicht nur, das ist das geringere Problem, bzw. den gibt es eigentlich 
nicht, s.u. Zuallererst brauchst du einen Timer mit einer entsprechenden 
Interruptroutine, denn du must ja dauernd und schnell genug und in 
gleichen Zeitabständen zwischen den Anzeigen umschalten, z.B. alle 5 ms.

Am besten trennst du die Aufgabe in 2 Teile: deine bisherige 
Ausgaberoutine schreibt das 7-Segment-Muster in 2 
Speicherplätze/Register. Die Timerroutine holt sich dort das aktuelle 
Muster und gibt es aus.

Georg

von Marduk (Gast)


Lesenswert?

Hier mein Ansatz:

L1:

MOV A,P2
MOV R1,P1
MOV R7,A
MOV R6,R1
MOV R5,#01000000b ; R5=Register,das die Kathoden steuert
ANL A,#0Fh
ANL R1,#0Fh
SUBB A,#10d
SUBB R1,#10d
JNC L1
MOV A,R7
MOV R1,R6
MOV DPTR,Tab_Seg
MOVC A,@A+DPTR
MOV P0,A
MOV A,R5
RL A
MOV R5,A
MOV DPTR,Tab_Seg
MOV R1,@R1+DPTR
MOV P0,R1
RR A
MOV R5,A
JMP L1



lg Marduk

von Peter D. (peda)


Lesenswert?

Du brauchst zuerst mal einen Schaltplan.
Wo sind die Segmente und die Digittreiber angeschlossen?
Sind sie low oder high aktiv?
Wo kommen die 2 Ziffern her und in welchem Format?

Und kommentiere gefälligst Deine Programme, was Du denkst, was sie 
machen sollten.
Ich würde für jedes Programm ohne Kommentare (Funktionsbeschreibung) ne 
glatte 6 geben.

von Uwe B. (uwe_beis)


Lesenswert?

Ich muss dem Peter mit seiner harten Kritik und seinen Forderungen Recht 
geben und noch eins drauf setzen. Gleichzeitig will ich dir aber 
Welpenschutz zubilligen, also: Kopf hoch und durch.

Während dein erstes Programm sinnvoll und lauffähig erscheint, steht in 
dem zweiten Programm haarsträubender Blödsinn. Wie konntest du das erste 
überhaupt soweit hin bekommen und beim zweiten so einen Bockmist 
verzapfen? Programmaufbau, Registerverwendung, nicht existente Befehle, 
Syntaxfehler...

Bevor du einen neuen Code postest, solltest du ihn wenigstens erst 
einmal durch einen Assembler schicken und die schon dort erkannten 
Fehler beseitigen.

Dann solltest du entweder eine Hardware oder zumindest einen Simulator 
in Betrieb nehmen, und kontrollieren, ob das, was du dir vorstellst, 
überhaupt passiert.

Hast du so was???

Es kann dir geholfen werden.

von Thomas (kosmos)


Lesenswert?

Wenn es sich nur um wenige 7 Segment Anzeigen handelt wurde ich da 2 
Latches einsetzen. So verballert man nicht einen ganzen Port sondern 
kann ihn auch für andere Dinge weiterverwenden, benötigt keinen Timer, 
erzeugt weniger Störungen...

Ein Schieberegister wäre auch noch eine Lösung man muss aber zum Ändern 
einer Ziffer alle Daten neu Beinschienen, beim Latch nur den 
entsprechenden.

Und noch ne kleine Erklärung zum Latch. Das Bauteil hat 8 Ein- und 
Ausgänge. Man verbindet die Eingänge mit einem Port. Die Eingänge des 
2ten Latches werden mit dem gleichen Port verbunden. Nun gibt man seine 
Daten an dem Port aus. Klingelt auf einer Steuerleitung den 
entsprechenden Latch an der die Daten über nehmen soll, nun gibt man die 
Daten für Latch2 am Port aus, klingelt diesen wieder an. Die beiden 
Latches haben also unterschiedliche Daten abgespeichert und gegen Sie 
dauerhaft an Ihren Ausgängen zu den 7Segment anzeigen aus. Den Port kann 
man dann anderweitig einsetzen. Man muss nur ein paar Steuerleitungen 
opfern mit denen man dem Latch die Befehle mitteilt.

von Georg (Gast)


Lesenswert?

Uwe B. schrieb:
> Ich muss dem Peter mit seiner harten Kritik und seinen Forderungen Recht
> geben und noch eins drauf setzen.

Dem schliesse ich mich an. Was ich über Timer geschrieben habe, hast du 
(Marduk) auch nicht ansatzweise begriffen oder gleich ignoriert, da kann 
man nur raten: Finger weg vom Multiplexing!

Georg

von michael_ (Gast)


Lesenswert?

Beim AVR gibt es die Applikation AVR242 und das Assemblerprogramm dazu.
Man muß ja nicht alles neu erfinden.
Eine Tastaturansteuerung ist da auch gleich noch dabei.

von Reinhard #. (gruebler)


Lesenswert?

michael_ schrieb:
> Man muß ja nicht alles neu erfinden.

Warum steigen Menschen auf Berge,
auf denen andere schon gewesen sind?

Weil die Berge da sind!

von Peter R. (pnu)


Angehängte Dateien:

Lesenswert?

Schau Dir dieses Programm vielleicht erst mal an. Es ist aus der Tonne 
geholt, weil es eine allererste Programmstufe auf der Hardware war, sind 
vielleicht auch Haken drin (z.B. das mit dem set)

Es wird bei jeder Stelle zuerst die zu zeigende Ziffer isoliert. 
Mithilfe der Ziffer (Ziffer a holt aus dem Platz a der Tabelle die 
entsprechenden Bit)
werden dann die notwendigen Segmente eingeschaltet.

Dabei muss man mit Einsen und AND so tricksen, dass die nicht für das 
Display verwendeten bits unverändert bleiben.

von Uwe B. (uwe_beis)


Lesenswert?

Reinhard #. schrieb:
> michael_ schrieb:
>> Man muß ja nicht alles neu erfinden.

Warum wollen Menschen etwas lernen, wir haben doch alles bzw. können es 
kaufen?

von MaWin (Gast)


Lesenswert?

Marduk schrieb:
> Nun möchte ich zwei Sieben Segment Anzeigen darstellen.

Multiplexen heisst:
1. Du schaltest die Katode von Ziffer 1 aktiv (auf Masse) und gibst das 
Segmentmuster für die erste Stelle aus.
Du wartest einige Zeit.
Du schaltest das Segmentmuster aus.
Du schaltest die Kathode von Ziffer 1 inaktiv und die von Ziffer 2 aktiv 
und gibst das Segmentmuster von Ziffer 2 aktiv.
Du wartest einige Zeit.
Du schaltest das Segmentmuster aus.
Zurück zu 1.

Und weil mir Assembler zu viel Tipparbeit ist:
loop()
{
  P1=0x02; // digit an bit 0 und 1
  P0=tab_seg[P2&0x0F];
  _delay_ms(10);
  P0=0;
  P1=0x01;
  P0=tab_seg[P2>>4];
  _delay_ms(10);
  P0=0;
}

von MaWin (Gast)


Lesenswert?

Reinhard #. schrieb:
> Weil die Berge da sind!

Nö, ich geh lieber an den Strand.

Uwe B. schrieb:
> Warum wollen Menschen etwas lernen

Genügend Menschen wollen nicht lernen.

von michael_ (Gast)


Lesenswert?

Reinhard #. schrieb:
> michael_ schrieb:
>> Man muß ja nicht alles neu erfinden.
>
> Warum steigen Menschen auf Berge,
> auf denen andere schon gewesen sind?
>
> Weil die Berge da sind!

Man sollte aber aufpassen, das nicht die Puste ausgeht oder man 
abstürzt.
Die Puste ist dem TE ja schon ausgegangen, ohne fremde Hilfe kommt er 
nicht weiter.
Also immer sehen und vergleichen, wie es andere machen.
Und dann lernen und seinen eigenen Weg finden.
Er hat sowieso genug zu tun die Applikation abzuspecken und an seinen 
Prozessor anzupassen.

von was fürn Ar..! (Gast)


Lesenswert?

Peter D. schrieb:
> Du brauchst zuerst mal einen Schaltplan.
> Wo sind die Segmente und die Digittreiber angeschlossen?
> Sind sie low oder high aktiv?
> Wo kommen die 2 Ziffern her und in welchem Format?
>
> Und kommentiere gefälligst Deine Programme, was Du denkst, was sie
> machen sollten.
> Ich würde für jedes Programm ohne Kommentare (Funktionsbeschreibung) ne
> glatte 6 geben.

Bisschen höflicher bitte, wenn Verstand im Kopf hast! Wäre sinnvoll! 
Anderenfalls unterlass solche Bemerkungen hier! Sowas kannste in deinem 
Bekanntenkreis äußern, nicht hier, verstanden?!!! Nun schleich Dich!

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.