Archiv verlassen und diese Seite im Standarddesign anzeigen : Frage wegen 7 Segment
Hallo,
ich habe eine 7 segment anzeige mit 4 segmenten aus einem receiver ausgebaut und würde die gerne mal ansteuern bloß wie mache ich dass die hat so viele kennzeichnungen dass ichs gar net verstehe wo ich was am controller anschließen soll. vielleicht weiß ja einer von euch weiter hier die kennzeichnungen beziehungsweiße die anschlüsse welche auf der platine stehen.
D1, D2, D3, D4
A, B, C, D, E, F, G
gnd
5V
D1-D4 Dürfte die Ansteuerung für den interen Multiplexer sein
zb. 1000 erste Anzeige wird angesteuert 0100 zweite usw.
A-G sind sie einzelnen Segment.
http://www.4manufactur.de/Module/Fachrechnen_GE/7-Segmentanzeige1/7-Segmentanzeige.gif
5V an 5V
GND an GND
MfG Matthias
Andree-HB
21.04.2007, 18:03
...an die Vorwiderstände denken !
muss ich ja dann an d1-d4 einen transistor davor hängen und an die basis einen widerstand von 10k is das so richtig?
Da dein Display sowohl GND als auch +5V hat könnte es auch sein das die Treiber schon intern verbaut sind.(am besten testen)
MfG Matthias
darwin.nuernberg
21.04.2007, 19:24
Probiers doch mal mit einem 7-Segment decoder, welcher gleich die einzelnen Segmente treiben kann.
z.B. den 4055 (MOS-IC) (http://www.reichelt.de/?SID=25ZF@3b38AAAIAAD4Vf6Mcc02d2b5be4adbd465105834 137c3ae0;ACTION=7;LA=6;OPEN=1;INDEX=0;FILENAME=A24 0%252FMOS4054_MOS4055_MOS4056_SMD4056%2523STM.pdf)
Vielleicht hilft Dir auch der Source-Code aus dem Beitrag 148650 (https://www.roboternetz.de/phpBB2/zeigebeitrag.php?p=148650#148650) (Multiplex-Display)
Hier noch eine Beispiel - Schaltbild: Bild 5359 (https://www.roboternetz.de/phpBB2/download.php?id=5359)
und wie teste ich dass? was muss ich anschließen?
darwin.nuernberg
22.04.2007, 10:26
Ist doch alles beschrieben...
7-Segment-Anzeige mit gemeinsamere Katode (4 Dekaden)
K sind die Katoden der 4-Katoden (-)
A sind die Anonden der 7-Segmente (+)
von + geht es über einen Vorwiderstand zum einzelnen Segment und zum Segment-Decoder (open Collector) über die LED (des einzelnen Segmentes) und dann über den Transistor der entspr. Dekade (1er, 10er, 100er oder 1000er) nach Masse.
ja toll aber ich weiß ja quasi nix was ich im bascom jetzt schreiben soll. ich bin wieder voll bei 0 sprich blutiger anfänger.
darwin.nuernberg
22.04.2007, 11:04
Tja ein bisschen Kreativität ist von Dir auch gefordert.
Dürfte aber nich all zu schwer sein, da ja auch Beispiele (Listungs) dabei sind.
(Abweichend zum vorher genannten Decoder Baustein habe ich hier einen 74LS48 verwendet (glaube den gibts aber nicht mehr) Du kannst auch den anderen verwenden dann halt ein bisschen das Schaltbild verändern Du musst halt im Ddatenblatt des entspr. Bauteils nachsehen)
Aber speziell für Dich nochmal das Prinzip.
Die einzelnen Dekaden werden eine nach der andere geschaltet (im Beispiel bei gem. Katode auf Masse (GND).
Somit können nur die Segmente dieser dekade leuchten, wenn sie angesprochen werden.
dann schaltet man um auf die nächste decade und steuert die segmente dementsprechend an.
Wenn das ganze schnell genug abläuft, bekommt das Auge (Hirn) das garnicht mehr mit und glaubt, dass alle segmente gleichzeitig leuchten.
Und hier noch mal ein Ersatzschaltbild:
https://www.roboternetz.de/phpBB2/album_pic.php?pic_id=1414
https://www.roboternetz.de/phpBB2/album_pic.php?pic_id=1414
https://www.roboternetz.de/phpBB2/files/mux-display_14315c_photo.gif
' 4-Digit Multipexed Display an Port C
' PortC.4 = 1er
' PortC.5 = 10er
' PortC.6 = 100er
' PortC.7 = 1000er
' Portc.0 bis Portc.3 = BCD Code der Zahl &H00 bis &HFF
' Hierzu einen 7-Segmentdecoder (74LS48) zwischen PortC(0..3) und den Segmenten schalten
' Nicht vergessen die Treibersegmentausgänge mit 470R PullUp zu schalten.
' Der Baustein 74LS48 kann nur Zahlen (0-9) darstellen keine Hex Codes (ABCDEF)
' Falsche Werte (>9) (>&H09) (>&B00001001) führen zu Anzeigefehlern.
$regfile = "m32def.dat" ' AT Mega 32
$crystal = 16000000 ' 16 MHz
$baud = 19200 ' Serielle Schittstelle einrichten
Anzeigeport Alias Portc ' Hier einstellen an welchem Port
' das Display angeshclossen wird
Config Anzeigeport = Output ' Direction einstellen
Declare Function Anzeige(byval B_speed As Byte) As Integer
Dim X As Integer ' Variable für For Scheife
Dim Y As Integer ' Variable für For Scheife
Dim B_ar_zahl(4) As Byte
Portc = 0 ' Port C initialisieren
' Die Anzeige soll "4321" darstellen
B_ar_zahl(1) = 1 ' Hier die 1er Zahlen der Anzeige
B_ar_zahl(2) = 2 ' Hier die 10er Zahlen der Anzeige
B_ar_zahl(3) = 3 ' Hier die 100er Zahlen der Anzeige
B_ar_zahl(4) = 4 ' Hier die 1000er Zahlen der Anzeige
Do
For Y = 0 To 9
X = Anzeige(5)
Next Y
Loop
End 'end program
' ************************************************** ****************************
Function Anzeige(byval B_speed As Byte) As Integer
Dim B_x As Byte ' Schleifen Variable
Dim B_decade As Byte ' Aktivierung der Decade
Dim B_select As Byte
For B_x = 4 To 7 ' Schleife für Decaden
' Bit 4 bis 7 sind Decaden
B_decade = 2 ^ B_x ' Bitmuster für Decade berechnen
B_select = B_x - 3 ' Feld des Array's bestimmen
Anzeigeport = B_decade ' Nur Decade aktivieren
Anzeigeport = Anzeigeport Or B_ar_zahl(b_select)
' Decade + Anzeigewert aktivieren
' Hiermit wird auch das Anzeigetiming
' realisiert
Waitms B_speed ' Anzeigedauer der einzelnen Decade
Next B_x
Anzeige = 0 ' Rükgabewert 0 = ok
End Function
' ************************************************** ****************************
End 'end program
ja dass mit dem anschließen is mir schon klar. worums mir geht wie ich es in bascom hinbekomme dass er einstellbar is und im sekundentakt eückwärts zählt
darwin.nuernberg
22.04.2007, 11:19
Reicht dir das nicht was ich da jetzt alles hingeschrieben habe?
Dann bastle besser Papierflieger!
ja aber für was brauch ich denn einen decoder des kann ich doch auch alles mit dem controller machen oder?
darwin.nuernberg
22.04.2007, 11:38
Ja schon, aber dann braucht Du ja zwei Ports...
Einen für die 7 Segmente und den anderen für die 4 Dekaden.
Der Treiber decodiert zum einen einen 4-Bit Binär-Wert in die richtige Segmentierung und zum anderen schützt er die Ports des AVR.
Wenn Du ohne Decoder auskommen willst dann muss Du die Segmente selbst decodieren:
Welches Segment soll bei wecler Zahl (wert) leuchten:
Wert a b c d e f g
1 * *
2 * * * * *
usw. Das ganze dann noch vereinfachen (in die Disjunktive Normalform bringen) um's kleiner und schneller zu Machen (fall gewünscht/nötig).
Also der Decoder ist meiner Meinung nach besser... und koste auch nur ein paar cent.
Ich schau mal ob ich auf die schnelle eine Softwarelösung zum decodieren der Segmente auf die Reihe bringe.
darwin.nuernberg
22.04.2007, 12:23
So ich hab Dir jetzt noch einen Segmentdecoder geschrieben,
den musst Du nur noch entsprechend in das andere Listing einbauen.
Erwarte blos nicht, das ich Dir das auch noch mache.
Erst mal wird eine Eingabe erwartet (0-9)
dann wird der Wert in der Funktion decodiert, (könnte noch erweitert werden a,b,c,d,e,f)
und schließlich in den Port geschrieben.
Segment a = auf Bit 0
Segment b = auf Bit 1
Segment c = auf Bit 2
Segment d = auf Bit 3
Segment e = auf Bit 4
Segment f = auf Bit 5
Segment g = auf Bit 6
Bit 7 (nicht genutzt) könnte der Dezimalpunkt (dp) werden.
https://www.roboternetz.de/phpBB2/album_pic.php?pic_id=1415
' ****************************************
' * *
' * 7-Segmentdecoder by darwin.nuernberg *
' * *
' ****************************************
$regfile = "m32def.dat" ' specify the used micro
$crystal = 8000000 ' used crystal frequency
$baud = 9600 ' use baud rate
$hwstack = 64 ' default use 32 for the hardware stack
$swstack = 20 ' default use 10 for the SW stack
$framesize = 80 ' default use 40 for the frame space
Dim Segmente As Byte ' Variable für die Segmente
Dim Zahl As Byte
Dim Pause As Integer
Segmente = 0 ' Muss dann nur noch an den Port gesendet werden
Pause = 100
' Die einzelnen Segmente werden an einem Port angeschlossen:
Config Portc = Output ' Port definieren
Portc = 0
Declare Function Decode_segmente(byval Wert As Byte) As Byte
' ================================================== =============
Beginn:
Do
Input "Wert (0-9) eingeben : " , Zahl ' Zahl abfragen
Segmente = Decode_segmente(zahl) ' Segmente decodieren
Portc = Segmente ' die decodierten Segmente ausgeben
Waitms Pause ' Wartezeit
Loop
End 'end program
' ================================================== =============
Function Decode_segmente(byval Wert As Byte) As Byte ' Segmente-Decodieren
Select Case Wert
Case 0 : Decode_segmente = &B00111111
Case 1 : Decode_segmente = &B00000110
Case 2 : Decode_segmente = &B01011011
Case 3 : Decode_segmente = &B01001111
Case 4 : Decode_segmente = &B01100110
Case 5 : Decode_segmente = &B01101101
Case 6 : Decode_segmente = &B01111101
Case 7 : Decode_segmente = &B00000111
Case 8 : Decode_segmente = &B01111111
Case 9 : Decode_segmente = &B01101111
Case Else : Decode_segmente = 0
End Select
End Function
' ================================================== =============
End
PS: es könnte sein dass ich bei den segmenten einen Wurm Drin hab (keine hardwaremässige kontrolle) dann bruchst Du ja nur das Bitmuster in der Function korrigieren.
ENDE OVER und OUT
darwin.nuernberg
22.04.2007, 18:23
Ich hab nochmal rumgekramt, und einen Schaltplan gefunden,
welcher mit einem anderern 7-Segment-Decoder arbeitet und einzelne 7-Segmentanzeigen benutzt,
so könnte man auch größere Anzeigen (Wand-Uhr) realisieren.
https://www.roboternetz.de/phpBB2/album_thumbnail.php?pic_id=1416
der Schaltplan in voller größe: hier klicken (https://www.roboternetz.de/phpBB2/album_pic.php?pic_id=1416)
Ich hoffe man kann alles erkennen.
Ich habs allerdings NIE aufgebaut, obwohl das Layout auch schon fertig ist (Zeit/Prio zu gering).
Powered by vBulletin® Version 4.2.5 Copyright ©2024 Adduco Digital e.K. und vBulletin Solutions, Inc. Alle Rechte vorbehalten.