Hallo zusammen,
ich hab da mal eine Anfängerfrage.
Bei einer 7-Segmentanzeige werden ja 7 Segmente gesteuert wie
im Tutorialcode (7-Segment Anzeige) sehr gut beschrieben ist.
1
Codes: ; Die Codetabelle für die Ziffern 0 bis 9
2
; sie regelt, welche Segmente für eine bestimmte
3
; Ziffer eingeschaltet werden müssen
4
;
5
.db 0b11000000 ; 0: a, b, c, d, e, f
6
.db 0b11111001 ; 1: b, c
7
.db 0b10100100 ; 2: a, b, d, e, g
8
.db 0b10110000 ; 3: a, b, c, d, g
9
.db 0b10011001 ; 4: b, c, f, g
10
.db 0b10010010 ; 5: a, c, d, f, g
11
.db 0b10000010 ; 6: a, c, d, e, f, g
12
.db 0b11111000 ; 7: a, b, c
13
.db 0b10000000 ; 8: a, b, c, d, e, f, g
14
.db 0b10010000 ; 9: a, b, c, d, f, g
Es passt ja hier gut, dass im PORTD 8 Ausgänge geschaltet werden können.
Was macht man wenn man statt 7 sagen wir mal 9 oder 10 Segmente steuern
muss?
Zum einen reicht PORTD allein nicht aus und zum anderen müssen die Codes
ja auch mehr als 8 Bit enthalten.
Kann mir jemand erklären wie man so etwas umsetzt?
Gruß Hans
Hans schrieb:> Es passt ja hier gut, dass im PORTD 8 Ausgänge geschaltet werden können.> Was macht man wenn man statt 7 sagen wir mal 9 oder 10 Segmente steuern> muss?> Zum einen reicht PORTD allein nicht aus und zum anderen müssen die Codes> ja auch mehr als 8 Bit enthalten.> Kann mir jemand erklären wie man so etwas umsetzt?
Dann hat man pro auszugebendem Zeichen eben 2 Bytes, die an die Ports
gegeben werden müssen. Auch wird dann die Ausgabe nicht mehr so banal
ablaufen können, dass man einfach das Byte als Ganzes auf den Port legt,
sondern man wird da etwas aufwändiger zur Sache gehen müssen, damit
nicht andere Portbits unabsichtlich mit verändert werden.
Im Tutorial ist der einfachst mögliche Fall gezeigt. Es sind aber
beliebige Verkomplizierungen je nach davon abweichender konkreter
Situation möglich. Wer die grundlegenden Prinzipien der
Einzelbitbehandlung aber beherrscht, mit UND und ODER Operationen
umgehen kann, für den sollte es kein Problem sein, sich den für seinen
Fall konkret notwendigen 'Schlachtplan' für die Ausgabe aus dem
Simpel-Schema herzuleiten bzw. die notwendigen Erweiterungen und
Änderungen zu machen.
Naja, man nimmt entsprechend mehr PORTS und Bytes :-) .
Man kann ja eine Tabelle für PORTD und eine Tabelle für PORTB machen.
Es gibt dann ein (sehr) kurzen Zeitraum, wo beim einem PORT noch die
alten und beim anderen schon die neuen Werte zu sehen sind, dass ist
aber meistens sehr kurz.
Es gibt aber natürlich auch andere Möglichkeiten.
Hallo Hans,
Es gibt aber auch die Möglichkeit die Datenausgabe auf nur 2 bzw. 3
Portpins zu reduzieren. Dann muss man aber weitere Bausteine, sog.
Schieberegister verwenden. Allerdings benötigt diese serielle
Datenübertragung mehr Arbeitstakte als die parallele Datenübertragung.
Der µC muss nur eine Taktleitung und eine Datenleitung (evtl. 3. Leitung
"Output Enable") bereitsstellen. Die Schieberegister haben i.d.R. einen
8Bit-Port. Diese ICs lassen sich kaskadieren, also
hintereinanderschalten. Somit hat man die Möglichkeit Ports mit (fast)
beliebiger Bitbreite zu realisieren.
Näheres erfährst Du u.a. hier:
[http://www.mikrocontroller.net/articles/AVR-Tutorial:_Schieberegister]
mfG Ottmar
Hi
Vermutlich willst du eine 15-Segmentanzeige ansteuern. Da kommst du auf
ein zweites Byte in der Tabelle nicht herum. Um die Tabelle zu
adressieren, kannst du die LowBytes, ich nenn sie mal so, hintereinander
ablegen, dann die Highbytes dahinter. Willst du nun daraus ein Muster
adressieren, nimmst du die Basisadresse des Lowbyte und addierst den
Offset der Musternummer. So bekommst du das erste Byte aus der Tabelle.
Das Zweite wird einfach mit einem festen Offsetaus der Distanz
Basisadresse Lowbyte und Basisadresse Highbyte adressiert. Etwa so
Low_Muster_0
Low_Muster_1
Low_Muster_2
Low_Muster_3
...
Low_Muster_38
High_Muster_0
High_Muster_1
High_Muster_2
High_Muster_3
...
High_Muster_38
Muster 7: Adresse Byte 1 = Basisadresse Low_Muster_0 +7
Byte 2 = Adresse Byte 1 + 38
Gruß oldmax