-         

Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 16

Thema: Denke zu kompliziert > 7-Segment Multiplexanzeige

  1. #1
    Erfahrener Benutzer Robotik Einstein Avatar von Andree-HB
    Registriert seit
    10.12.2004
    Ort
    Bremen
    Alter
    47
    Beiträge
    2.565

    Denke zu kompliziert > 7-Segment Multiplexanzeige

    Anzeige

    SMARTPHONES & TABLETS-bis zu 77% RABATT-Kostenlose Lieferung-Aktuell | Cool | Unentbehrlich
    Ich spiele gerade mit einer gemultiplexten 7-Segmentanzeige herum. Ich möchte im Endeffekt eine 4stellige Variable auf die Anzeige bekommen.




    (PortD setzt die Segmente, PortB.0-3 die gemeinsamen Kathoden)


    ...aber der Code ist gruselig

    Die Einer-Stelle wird (vorerst fest) gesetzt, springt in eine Sub, die Kathode für die erste Stelle wird dort gesetzt, nach Zahlvergleich wieder Sprung in eine andere Sub, wo die entsprechenden Segmente gesetzt werden, danach wird die Kathode wieder ausgeschaltet

    Zehner-Stelle wird gesetzt......usw.


    Das Prinzip ist mir klar und funktioniert auch...aber laut eigener Betrachtung viel zu umständlich. Hat Jemand `nen Tipp für mich für Vereinfachung ?

    Code:
    $regfile = "m8def.dat"
    $crystal = 8000000
    
    
    Config Portd = Output
    Config Portb = Output
    
    
    Dim E As Byte                                               'einer
    Dim Z As Byte                                               'zehner
    Dim H As Byte                                               'hunderter
    Dim T As Byte                                               'tausender
    Dim X As Byte                                               'Zeit (ms), wielange Kathoden ein
    X = 1
    
    
    Do                                                                
    E = 6                                                          'Beispielzahl Einer
    Gosub E:
    Z = 5                                                          'Beispielzahl Zehner
    Gosub Z:
    H = 4                                                          'Beispielzahl Hunderter  
    Gosub H
    T = 7                                                           'Beispielzahl Tausender
    Gosub T
    Loop
    End
    
    
    E:
    Portb.0 = 1                                                 'Kathode Einer ein
    If E = 0 Then Gosub 0
    If E = 1 Then Gosub 1
    If E = 2 Then Gosub 2
    If E = 3 Then Gosub 3
    If E = 4 Then Gosub 4
    If E = 5 Then Gosub 5
    If E = 6 Then Gosub 6
    If E = 7 Then Gosub 7
    If E = 8 Then Gosub 8
    If E = 9 Then Gosub 9
    Waitms X
    Portb.0 = 0                                                 'Kathode Einer aus
    Return
    
    Z:
    Portb.1 = 1                                                 'Kathode Zehner ein
    If Z = 0 Then Gosub 0
    If Z = 1 Then Gosub 1
    If Z = 2 Then Gosub 2
    If Z = 3 Then Gosub 3
    If Z = 4 Then Gosub 4
    If Z = 5 Then Gosub 5
    If Z = 6 Then Gosub 6
    If Z = 7 Then Gosub 7
    If Z = 8 Then Gosub 8
    If Z = 9 Then Gosub 9
    Waitms X
    Portb.1 = 0                                                 'Kathode Zehner aus
    Return
    
    H:
    Portb.2 = 1                                                 'Kathode Hunderter ein
    If H = 0 Then Gosub 0
    If H = 1 Then Gosub 1
    If H = 2 Then Gosub 2
    If H = 3 Then Gosub 3
    If H = 4 Then Gosub 4
    If H = 5 Then Gosub 5
    If H = 6 Then Gosub 6
    If H = 7 Then Gosub 7
    If H = 8 Then Gosub 8
    If H = 9 Then Gosub 9
    Waitms X
    Portb.2 = 0
    Return                                                      'Kathode Hunderter aus
    
    
    T:
    Portb.3 = 1                                                 'Kathode Tausender ein
    If T = 0 Then Gosub 0
    If T = 1 Then Gosub 1
    If T = 2 Then Gosub 2
    If T = 3 Then Gosub 3
    If T = 4 Then Gosub 4
    If T = 5 Then Gosub 5
    If T = 6 Then Gosub 6
    If T = 7 Then Gosub 7
    If T = 8 Then Gosub 8
    If T = 9 Then Gosub 9
    Waitms X
    Portb.3 = 0                                                 'Kathode Tausender aus
    Return
    
    
    
    
    
    0:
    Portd = &B00111111                                          '0
    Return
    1:
    Portd = &B00000110                                          '1
    Return
    2:
    Portd = &B01011011                                          '2
    Return
    3:
    Portd = &B01001111                                          '3
    Return
    4:
    Portd = &B01100110                                          '4
    Return
    5:
    Portd = &B01101101                                          '5
    Return
    6:
    Portd = &B01111101                                          '6
    Return
    7:
    Portd = &B00000111                                          '7
    Return
    8:
    Portd = &B01111111                                          '8
    Return
    9:
    Portd = &B01101111                                          '9
    Return

  2. #2
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    22.05.2005
    Ort
    12°29´ O, 48°38´ N
    Alter
    48
    Beiträge
    2.731
    Hallo,

    und das ganze ohne Widerstände, wird da nix warm ?

    Es lässt sich zumindest mal so zusammenfassen:

    Code:
    $regfile = "m8def.dat"
    $crystal = 8000000
    
    
    Config Portd = Output
    Config Portb = Output
    
    
    Dim E As Byte                                               ' Zahl
    Dim X As Byte                                               'Zeit (ms), wielange Kathoden ein
    X = 1
    
    
    Do
        E = 6                                                   'Beispielzahl Einer
        Gosub E
        E = 5                                                   'Beispielzahl Zehner
        Gosub Z
        E = 4                                                   'Beispielzahl Hunderter
        Gosub H
        E = 7                                                   'Beispielzahl Tausender
        Gosub T
    Loop
    End
    
    
    E:
    Portb.0 = 1                                                 'Kathode Einer ein
    Gosub Wertsuche
    Portb.0 = 0                                                 'Kathode Einer aus
    Return
    
    Z:
    Portb.1 = 1                                                 'Kathode Zehner ein
    Gosub Wertsuche
    Portb.1 = 0                                                 'Kathode Zehner aus
    Return
    
    H:
    Portb.2 = 1                                                 'Kathode Hunderter ein
    Gosub Wertsuche
    Portb.2 = 0
    Return                                                      'Kathode Hunderter aus
    
    
    T:
    Portb.3 = 1                                                 'Kathode Tausender ein
    Gosub Wertsuche
    Portb.3 = 0                                                 'Kathode Tausender aus
    Return
    
    
    Wertsuche:
    If E = 0 Then Gosub 0
    If E = 1 Then Gosub 1
    If E = 2 Then Gosub 2
    If E = 3 Then Gosub 3
    If E = 4 Then Gosub 4
    If E = 5 Then Gosub 5
    If E = 6 Then Gosub 6
    If E = 7 Then Gosub 7
    If E = 8 Then Gosub 8
    If E = 9 Then Gosub 9
    Waitms X
    Return
    
    
    
    0:
    Portd = &B00111111                                          '0
    Return
    1:
    Portd = &B00000110                                          '1
    Return
    2:
    Portd = &B01011011                                          '2
    Return
    3:
    Portd = &B01001111                                          '3
    Return
    4:
    Portd = &B01100110                                          '4
    Return
    5:
    Portd = &B01101101                                          '5
    Return
    6:
    Portd = &B01111101                                          '6
    Return
    7:
    Portd = &B00000111                                          '7
    Return
    8:
    Portd = &B01111111                                          '8
    Return
    9:
    Portd = &B01101111                                          '9
    Return
    evtl. eine Sub bauen, an die man den Wert und die Stelle übergibt.

    Edit:
    Jetzt hab ich zu schnell auf Absenden gedrückt,
    ich wollte noch ja noch den Timer vorschlagen, um zB. 30mal/s die Anzeige zu aktualisieren.

  3. #3
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    08.05.2005
    Ort
    Issum
    Alter
    46
    Beiträge
    2.236
    Hallo,
    Leider habe ich keine Ahnung von Bascom,
    aber ich packe die Wertigkeiten von den Zahlen in ein Array, bei Bascom gibt es doch Arrays, oder?
    Danach kannst Du schön über den Index darauf zugreifen.

    Gruß Sebastian

  4. #4
    Erfahrener Benutzer Roboter Genie Avatar von darwin.nuernberg
    Registriert seit
    08.08.2004
    Ort
    A, A
    Alter
    53
    Beiträge
    1.305
    Blog-Einträge
    1
    Hey Geil,
    ich habe auch 'ne Handvoll ähnlicher Displays,
    aber immer gescheut diese einzusetzen,
    da ich befürchtete diese nich nachkaufen zu können.

    Hast du die Bezeichnung, eine Bezugsquelle und ein Datenblatt von deinem Baustein?

    Dann könnte ich falls beide (annähernd) kompatibel sind auch mal ein Projekt mit diesen Baustein realisieren und veröffentlichen.
    Gruss
    Darwin (meine Projekte sind auf meiner Pinnwand zu finden)

  5. #5
    Erfahrener Benutzer Robotik Einstein Avatar von Andree-HB
    Registriert seit
    10.12.2004
    Ort
    Bremen
    Alter
    47
    Beiträge
    2.565
    Info zum Display -> Die Anzeige hat die Bezeichnung 14315C (http://www.pollin.de/shop/downloads/D120289D.PDF) und kostet nur 75 Cent, Segmente sind alle parallel geschaltet, Kathoden und Punkte seperat. dadurch ist die Verdrahtung sehr minimiert (7+4 Pins)

    Die Anzeige wird ohne Widerstand betrieben, da die Einschaltdauer jeder Ziffer sehr klein ist. Daher wird da auch nix warm. Mit Widerstand (getestet) wird die Anzeige viel zu dunkel. Die Kathoden werden nach Minus über einen BC547C geschaltet, der an der Basis über 1K-Widerstand von den Ausgängen angesteuert wird.

    An "linux_80" :
    So ähnlich habe ich mir das auch gedacht, nur weiss ich nicht, wie ich die einzelnen Werte der Stellen an die gemeinsame Sub übergeben könnte. Dass man den Wertevergleich ja nicht für jede Ziffer einzeln machen muss, geht ja definitiv einfacher.

    Meine Vorstellung :
    Teile Wertevariable (4 Ziffern) auf und springe für jede Ziffer nacheinander in den Vergleich und schalte gleichzeitig Segmente und entsprechende Kathode).

  6. #6
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    22.05.2005
    Ort
    12°29´ O, 48°38´ N
    Alter
    48
    Beiträge
    2.731
    Mach es so wie izaseba gemeint hat,
    am Anfang ein Array anlegen von 0-9, dann muss man nur das Array mit der gewünschten Zahl auslesen, und schon hat man das gewünschte Bitmuster, also ohne die ganzen IF ...GOSUBs.

  7. #7
    Neuer Benutzer Öfters hier
    Registriert seit
    16.06.2005
    Ort
    Leipzig
    Beiträge
    18
    Hallo ,
    ich benutze eine etwas modifizierte Routine von Wolfgang Schwarz
    ( http://www.black-strom.de.vu ), der sowas für seine Uhr verwendet hat, schaut's euch mal an:

    [Ich hab nur die relevanten Zeilen rauskopiert]

    Code:
    Dim Stelle_1 As Byte
    Dim Stelle_2 As Byte
    Dim Stelle_3 As Byte
    Dim Stelle_4 As Byte
    
    'Ausgänge:
    Segment_a Alias Portb.0
    Segment_b Alias Portb.1
    Segment_c Alias Portb.2
    Segment_d Alias Portb.3
    Segment_e Alias Portb.4
    Segment_f Alias Portb.5
    Segment_g Alias Portc.0
    Ziffer_1 Alias Portc.1
    Ziffer_2 Alias Portc.2
    Ziffer_3 Alias Portc.3
    Ziffer_4 Alias Portc.4
    
    Config Timer0 = Timer , Prescale = 1024
    On Timer0 7segment
    Const Timervorgabe = 200
    
    
    Do
                                                          'Anfang Hauptschleife
     Stelle_1 = 4
     Stelle_2 = 3                   'was angezeigt werden soll ...
     Stelle_3 = 2
     Stelle_4 = 1
    Loop                                                        'Ende Hauptschleife
    
    
    
    
    '+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
    ' Interrupt-Routine für Ziffer ausgabe im 7 Segmentcode
    '+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
    ' Bei jedem Aufruf wir nur eine Ziffer ausgegeben, d.h nur eine Anzeige wird
    ' angesteuert. Die anderen bleiben dunkel. Bei jedem Aufruf wird eine Anzeige
    ' weitergeschaltet.
    '
    ' Anzeigen anordnung
    '
    ' 1111  2222   3333  4444
    ' 1  1  2  2   3  3  4  4
    ' 1111  2222   3333  4444
    ' 1  1  2  2   3  3  4  4
    ' 1111o 2222o  3333o 4444o
    '
    '                        ^-- Dezimalpunkt
    '                      ^---- 4. Ziffer | Minute Low Wert  | Variable Zl_minute
    '                ^---------- 3. Ziffer | Minute High Wert | Variable Zh_minute
    '         ^----------------- 2. Ziffer | Stunde Low Wert  | Variable Zl_stunde
    '   ^----------------------- 1. Ziffer | Stunde High Wert | Variable Zh_stunde
    
    7segment:
      Timer0 = Timervorgabe
      If Temp_ziffer = 4 Then Temp_ziffer = 0                   'bestimmt die auszugebende Ziffer (1 bis 4)
      Incr Temp_ziffer                                          'bei jedem aufruf des Lable wir eine andere Ziffer ausgegeben
    
    
     Select Case Temp_ziffer                                    'welche Ziffer soll angesteuert werden
       Case 1 : Ziffer_1 = 0                                    '1. Ziffer
                Ziffer_2 = 1
                Ziffer_3 = 1
                Ziffer_4 = 1
                Bcd_aus = Stelle_1
       Case 2 : Ziffer_1 = 1                                    '2. Ziffer
                Ziffer_2 = 0
                Ziffer_3 = 1
                Ziffer_4 = 1
                Bcd_aus = Stelle_2
       Case 3 : Ziffer_1 = 1                                    '3. Ziffer
                Ziffer_2 = 1
                Ziffer_3 = 0
                Ziffer_4 = 1
               Bcd_aus = Stelle_3
       Case 4 : Ziffer_1 = 1                                    '4. Ziffer
               Ziffer_2 = 1
               Ziffer_3 = 1
                Ziffer_4 = 0
                Bcd_aus = Stelle_4
     End Select
    
     'Ermittelt aus der Segmentfolge-Tabelle den 7 Segmentcode für die auszugebende Zahl
     Select Case Bcd_aus
        Case 1 : Ausgang = Lookup(1 , Segmentfolge)
        Case 2 : Ausgang = Lookup(2 , Segmentfolge)
        Case 3 : Ausgang = Lookup(3 , Segmentfolge)
        Case 4 : Ausgang = Lookup(4 , Segmentfolge)
        Case 5 : Ausgang = Lookup(5 , Segmentfolge)
        Case 6 : Ausgang = Lookup(6 , Segmentfolge)
        Case 7 : Ausgang = Lookup(7 , Segmentfolge)
        Case 8 : Ausgang = Lookup(8 , Segmentfolge)
        Case 9 : Ausgang = Lookup(9 , Segmentfolge)
        Case 0 And Temp_ziffer = 1 : Ausgang = Lookup(10 , Segmentfolge)       'Nullstellenunterdrückung  bei der ersten Ziffer
        Case 0 And Temp_ziffer > 1 : Ausgang = Lookup(0 , Segmentfolge)       'wenn nicht erste Ziffer Null anzeigen
     End Select
    
    'Ausgabe des 7 Segmentcodes (Invertierend [Not] bei Anz. mit gem. Anode)
      Segment_a = Ausgang.0                                     'Segment A
      Segment_b = Ausgang.1                                     'Segment B
      Segment_c = Ausgang.2                                     'Segment C
      Segment_d = Ausgang.3                                     'Segment D
      Segment_e = Ausgang.4                                     'Segment E
      Segment_f = Ausgang.5                                     'Segment F
      Segment_g = Ausgang.6                                     'Segment G
    Return
    
    
    End                                                         'Programm Ende
    
    
    
    '+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
    ' 7 Segmentcode - Tabelle
    '+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
    '
    ' --A--
    ' |   |
    ' F   B
    ' |   |
    ' --G--
    ' |   |
    ' E   C
    ' |   |
    ' --D--
    Segmentfolge:                                               'GFEDCBA / "1" Segment AN
    Data &B0111111                                              '0
    Data &B0000110                                              '1
    Data &B1011011                                              '2
    Data &B1001111                                              '3
    Data &B1100110                                              '4
    Data &B1101101                                              '5
    Data &B1111101                                              '6
    Data &B0000111                                              '7
    Data &B1111111                                              '8
    Data &B1101111                                              '9
    Data &B0000000                                              'leeres Feld (zur Nullstellenunterdrückung)

  8. #8
    Super-Moderator Robotik Visionär Avatar von PicNick
    Registriert seit
    23.11.2004
    Ort
    Wien
    Beiträge
    6.836
    Erster Gegenvorschlag
    Wertsuche:
    on E Gosub 0, 1, 2, ..................9
    Zweiter
    Wertsuche:
    Portd = lookup(e, patt_tab)
    ...
    patt_tab:
    DATA &B00111111, &B00000110, &B01011011, ......
    mfg robert
    Wer glaubt zu wissen, muß wissen, er glaubt.

  9. #9
    Erfahrener Benutzer Roboter Genie Avatar von darwin.nuernberg
    Registriert seit
    08.08.2004
    Ort
    A, A
    Alter
    53
    Beiträge
    1.305
    Blog-Einträge
    1
    Danke für das Datenblatt, werde die Anschlüsse gelich mal vergleichen.

    Willst Du nur die Segmente ohne Punkt ansteuern ein Tipp von mir:

    Du kannst das ganze auf nur einem Port realisieren, wenn Du eine 7-Segment Decoder verwendest. Dann brauchst Du nur 4-Bit zur Darstellung der Zahl und hast die anderen 4-Bit für die Dezimalstellen frei.

    Dann solltest Du für den Übergang der einzelnen Stellen ein gewisses Timing einhalten, um zu verhindern, dass die Segmente (kurzzeitig) noch aktiv sind, wenn die Stelle gewechselt wird. Schau mal in die Zeichnung im Anhang.
    Miniaturansichten angehängter Grafiken Miniaturansichten angehängter Grafiken mux-display-prinzip.gif  
    Gruss
    Darwin (meine Projekte sind auf meiner Pinnwand zu finden)

  10. #10
    Erfahrener Benutzer Roboter Genie Avatar von darwin.nuernberg
    Registriert seit
    08.08.2004
    Ort
    A, A
    Alter
    53
    Beiträge
    1.305
    Blog-Einträge
    1
    Leider sind unsere Displays doch nicht gleich belegt.

    Falls Du später mal mit Eagle was aufbauen willst,
    ich habe unsere Anzeigen mal in einer LIB aufgebaut...
    Angehängte Dateien Angehängte Dateien
    Gruss
    Darwin (meine Projekte sind auf meiner Pinnwand zu finden)

Seite 1 von 2 12 LetzteLetzte

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •