Forum: Mikrocontroller und Digitale Elektronik Anfängerfrage


von Hans (Gast)


Lesenswert?

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

: Bearbeitet durch User
von Karl H. (kbuchegg)


Lesenswert?

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.

: Bearbeitet durch User
von Georg G. (df2au)


Lesenswert?

Dann spendierst du im Speicher 2 Bytes für jeden Eintrag. Und du 
brauchst einen zweiten Port, auf dem du die über 8 hinausgehenden Bits 
ausgibst.

von Achim K. (aks)


Lesenswert?

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.

von Ottmar K. (wil1)


Lesenswert?

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

von San L. (zwillingsfreunde)


Lesenswert?

Mehr Bytes, mehr Ports.

Falls es dir spezifisch um 7-Segment Anzeigen geht, eine gängige Lösung 
wäre hierfür noch ein BCD Decoder.

https://www.google.ch/search?q=bcd+decoder&ie=utf-8&oe=utf-8&aq=t&rls=org.mozilla:de:official&client=firefox-a&channel=sb&gfe_rd=cr&ei=pW85U9CRKsOA8QeLo4CYDA#channel=sb&q=bcd+decoder&rls=org.mozilla:de:official

Falls du dich sonst noch dafür Interessierst, wie man solche Dinge 
macht, vor allem wenn man beispielsweise mehr Digitale Signale Schalten 
will als Pins vorhanden sind, hier einige Stichworte nach denen gu 
Googeln kannst:

- Multiplexer
- Schieberegister
- Mikrocontroller Porterweiterung

Hoffe konnte helfen
Gruss

von oldmax (Gast)


Lesenswert?

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

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.