-
        

Ergebnis 1 bis 5 von 5

Thema: 7-Segment Multiplexer

  1. #1
    Benutzer Stammmitglied
    Registriert seit
    07.01.2006
    Beiträge
    31

    7-Segment Multiplexer

    Anzeige

    Hallo,

    ich versuche mich auch gerade in das Bascom einzuarbeiten.

    Nun wollte ich an den Ports für eine 7 Segment LED Anzeige den CODE direkt schreiben da ich mir die Decodier IC-s "BCD zu 7 Segment" sparen wollte.

    Ich habe da auch irgendwo einen Code gefunden, doch leider funktioniert bei mir die Portausgabe nicht.

    Habt Ihr eine Ahnung woran das liegen könnte?
    Wo ist da der Fehler???

    Warscheindlich übergebe ich das nicht richtig an die Ports.
    Da wo ich es an die RS232 übergebe, da funktioniert es noch... Hab ich auch so übernommen, doch meine Ausgabe funktioniert nicht.

    Code:
    Portd = Segment(1)
    Portc = Segment(2)
    
    
     $regfile = "m32def.dat"
     $framesize = 32
     $swstack = 32
     $hwstack = 32
     $crystal = 16000000
     $baud = 9600
    
    
    ' Bascom
    ' 7-Segment Multiplexer
    
    
    Const Dekaden = 2                                           ' Anzahl der Anzeigen (dekaden)
    Const Pulsdauer = 10000                                     ' Dauer eines Impulses
    
    
    Declare Function Segmentdecoder(byval C As String) As Byte
    Declare Sub Selector(byval Wert As Integer)
    
    
    Dim Segment(dekaden) As Byte                                ' Array für die Fertig berecheten Segmente
    Dim Demo As Byte
    
    Config Portc = Output                                       'Port C wird als Output configuriert
    Config Portd = Output
    
    
    ' Hauptprogramm
    ' -----------------------------------------------------------------------------
    
    Call Selector(22)                                           ' Berechnet die Segmente der einzelnen Dekaden
                                                                 ' und legt diese im Array Segment() ab.
    
    
    ' Die folgenden Zeilen Zeigen Dir was rauskommt und können gelöscht werden.
    
    For Demo = 1 To Dekaden
    Print Bin(segment(demo))
    Next Demo
    
    
    ' Ein bisschen darfst Du auch naoch was tun...  Schaffe ich auch nicht.... 
    ' Jetzt muß noch die Ausgabe erfolgen.
    ' Frage das Array ab, weise dem Port den Wert Zu
    ' z.B. Portb = segment(1)
    '      pulseout portd, 1 pulsdauer
    '      Portb = segment(2)
    '      pulseout portd, 2 pulsdauer
    ' usw.
    
    
    
    Portd = Segment(1)
    Portc = Segment(2)
    
    
    
    
    
    
    End                                                         'end program
    
    ' -----------------------------------------------------------------------------
    ' -----------------------------------------------------------------------------
    
    
    
    
    Sub Selector(byval Wert As Integer)
       Dim S As String * Dekaden                                ' Stringvariable Länge = Anzeige
       Dim L As Byte                                            ' Variable für Länge des Strings
       Dim X As Byte                                            ' Zählervariable
       Dim Pos As Byte                                          ' Variable für MID Funktion
       Dim Z As String * 1
       Dim Segcode As Byte
    
    
    
        S = Str(wert)                                           ' Wandle Wert in String
        L = Len(s)                                              ' ermittle Länge des Strings
        If L > Dekaden Then L = Dekaden                         ' Verhindern dass mehr Anzeigen berechent werden
                                                                ' als definiert und vorhanden sind.
    
    
        For X = 1 To L
          Pos = L - X
          Pos = Pos + 1                                            ' Beginne mit den Einer Stellen (rechts)
          Z = Mid(s , Pos , 1)                                     ' Picke eine einzelnes Zeichen heraus
    
          Segcode = Segmentdecoder(z)                              ' Ermittle den Portcode für die Segmente
          Segment(x) = Segmentdecoder(z)
        Next X
    
    End Sub
    
    ' -----------------------------------------------------------------------------
    
    Function Segmentdecoder(byval C As String) As Byte
       Select Case C
          Case "0" : Segmentdecoder = &B00111111                ' Bit 0 = Segment A
          Case "1" : Segmentdecoder = &B00000110                ' Bit 1 = Segment B
          Case "2" : Segmentdecoder = &B01011011                ' Bit 2 = Segment C
          Case "3" : Segmentdecoder = &B01001111                ' Bit 3 = Segment D
          Case "4" : Segmentdecoder = &B01100110                ' Bit 4 = Segment E
          Case "5" : Segmentdecoder = &B01101101                ' Bit 5 = Segment F
          Case "6" : Segmentdecoder = &B01111101                ' Bit 6 = Segment G
          Case "7" : Segmentdecoder = &B00000111                ' Bit 7 = Segment dp
          Case "8" : Segmentdecoder = &B01111111
          Case "9" : Segmentdecoder = &B01101111
          Case "." : Segmentdecoder = &B10000000
          Case Else : Segmentdecoder = &B000000000              ' unerwartes Zeichen keine Ausgabe
       End Select
    
                                                 'Bit   Segmente
    
                                                 '   || G | F | E | D | C | B | A |
                                                 ' --||---+---+---+---+---+---+---|
                                                 ' 0 || 0 | 1 | 1 | 1 | 1 | 1 | 1 |
                                                 ' 1 || 0 | 0 | 0 | 0 | 1 | 1 | 0 |
                                                 ' 2 || 1 | 0 | 1 | 1 | 0 | 1 | 1 |
                                                 ' 3 || 1 | 0 | 0 | 1 | 1 | 1 | 1 |
                                                 ' 4 || 1 | 1 | 0 | 0 | 1 | 1 | 0 |
                                                 ' 5 || 1 | 1 | 0 | 1 | 1 | 0 | 1 |
                                                 ' 6 || 1 | 1 | 1 | 1 | 1 | 0 | 1 |
                                                 ' 7 || 0 | 0 | 0 | 0 | 1 | 1 | 1 |
                                                 ' 8 || 0 | 1 | 1 | 1 | 1 | 1 | 1 |
                                                 ' 9 || 1 | 1 | 0 | 1 | 1 | 1 | 1 |
    End Function
    ' -----------------------------------------------------------------------------

    End

  2. #2
    Neuer Benutzer Öfters hier
    Registriert seit
    01.11.2004
    Alter
    33
    Beiträge
    29
    Ich habe dein Programm nicht genauer angeschaut aber vielleicht kannst du etwas mit dieser Lösung von Claus Kühnel anfangen:

    Code:
    $regfile = "m8def.dat"                                      ' ATmega8
    $crystal = 3690000                                          ' für STK500
    $baud = 19200
    
    Config Portb = Output
    Portb = 255
    
    Dim I As Byte
    
    Dim X(16) As Byte
    
    Restore Value_table
    
    For I = 1 To 16                                             ' Lade Tabelle in Bytearray
       Read X(i)
    Next
    
    Do                                                          ' Ausgabe von 0 bis F über PortB
    
       For I = 1 To 16
          Portb = X(i)
    
       Waitms 500
       Print Hex(portb)
       Next
    
    
    Loop
    
    End
    
    Value_table:
    '      0       1     2       3     4      5      6       7
    Data &H40 , &H79 , &H24 , &H30 , &H19 , &H12 , &H02 , &H78
    '       8      9     A       B     C      D      E       F
    Data &H00 , &H10 , &H08 , &H03 , &H46 , &H21 , &H06 , &H0E
    Mfg Nico

  3. #3
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    12.02.2006
    Beiträge
    164
    hmmm also ich bin auch gerade am anfangen...

    wie sieht deine schaltung aus?
    hast du transistoren an der gemeinsamen kathode der segmente oder sowas?

    hast mal die 7segment anzeige getestet ohne das multiplexen ???

    ich hab bei mir mal drei taster an port d und ein segment an port c gehangen und etwas rumexperimentiert, hier mal mein aktueller code ...

    funktion: er zeigt ne null wenn ich den einen taster aus hab, beim betätigen verschwindet die null.
    drück ich den taster an d.2 (interrupt) wird die schleife unterbrochen und er zählt von 6 bis 0 runter ...



    Code:
     'testsoftware v 0.1
    
        config porta = output
        Config Portc = Output
        Config Pind.0 = Input                                   ' kann man auch  kürzer schreiben - egal
        Config Pind.1 = Input                                   'konfiguriert die ports d 0,1,2 als input
        Config Pind.2 = Input
    
        Portd.0 = 1                                             'pullup-widerstände ein
        Portd.3 = 1
        Portd.2 = 1
    
        Dim Nix As Byte , Eins As Byte
        Dim Zwei As Byte , Drei As Byte , Vier As Byte , Fuenf As Byte , Sechs As Byte
        Dim Sieben As Byte , Acht As Byte , Neun As Byte
    
        Nix = &B1111011
        Eins = &B0101000
        Zwei = &B1110110
        Drei = &B1111100
        Vier = &B0101101
        Fuenf = &B1011101
        Sechs = &B1011111
        Sieben = &B1101000
        Acht = &B1111111
        Neun = &B1111101
    
        On Int0 Int0serv                                        'bei interrupt int0 gehe zu int0serv
        Config Int0 = Rising                                    'und zwar bei steigender flanke
        Enable Int0                                             'muss auch rein
        Enable Interrupts                                       'und das muss wohl auch rein ...
    
        Porta.0 = 1                                             'led mal ausschalten
    
    
        Do                                                      'Beginn der Endlosschleife
    
    
         If Pind.0 = 1 Then
           'nix also die 0 anzeigen
            Portc = Nix
    
    
         Else
            'alle LEDs aus
            Portc = 0
         End If
       Loop                                                     'Ende der Endlosschleife
    
    
    
       Int0serv:                                                'bei interrupt von sechs runterzählen
       Portc = Sechs
       Waitms 500
       Portc = Fuenf
       Waitms 500
       Portc = Vier
       Waitms 500
       Portc = Drei
       Waitms 500
       Portc = Zwei
       Waitms 500
       Portc = Eins
       Waitms 500
       Portc = Nix
    
    
    
        Return
    Code-Tags. Männer ! (PicNick)

  4. #4
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    12.02.2006
    Beiträge
    164
    achso und hier hätt ich ne frage .... mein code im interrupt wird immer zwei mal durchlaufen, kann das daran liegen das der taster nicht entprellt ist ???

  5. #5
    Benutzer Stammmitglied
    Registriert seit
    07.01.2006
    Beiträge
    31
    Hi,

    ich versuche erst mal alles an der Simulation.

    Die Schaltung mache ich erst danach.

    Aber der Code von Claus Kühnel schein ganz OK zu sein. Ich werde den mal anpassen.

    Viele Grüße aus Nürnberg

    Richard


    quote="veit"]hmmm also ich bin auch gerade am anfangen...

    wie sieht deine schaltung aus?
    hast du transistoren an der gemeinsamen kathode der segmente oder sowas?

    hast mal die 7segment anzeige getestet ohne das multiplexen ???

    i

Berechtigungen

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