-         

Seite 1 von 7 123 ... LetzteLetzte
Ergebnis 1 bis 10 von 67

Thema: Eine LED-Matrix 5x7 ansteuern

  1. #1
    Benutzer Stammmitglied
    Registriert seit
    16.09.2008
    Ort
    Hamburg
    Beiträge
    49

    Eine LED-Matrix 5x7 ansteuern

    Anzeige

    Hi, als erstes möchte ich nochmal für die Hilfe bei meinem Problem mit Frequenzzähler bedanken.
    Nun ist leider ein neues Problem aufgetaucht.
    Ich möchte gerne eine LED Matrix 5x7 direkt mit einem Atmega16 ansteuern.
    Als erstes habe ich versucht schritt für schritt jeden Port an und aus zu schalten, funktioniert auch, jedoch ist der Code sehr lang....
    Code:
    Do
    
    '---------------------------------
    '"1" Anzeigen
    '---------------------------------
          Portb = &B11111101
          Portd = &B00000010
          Waitus Zeit
          Portb = &B11111110
          Portd = &B00000100
          Waitus Zeit
          Portb = &B11111101
          Portd = &B00000100
          Waitus Zeit
          Portb = &B11111011
          Portd = &B00000100
          Waitus Zeit
          Portb = &B11110111
          Portd = &B00000100
          Waitus Zeit
          Portb = &B11101111
          Portd = &B00000100
          Waitus Zeit
          Portb = &B11011111
          Portd = &B00000100
          Waitus Zeit
          Portb = &B10111111
          Portd = &B00000100
          Waitus Zeit
          Portb = &B10111111
          Portd = &B00000010
          Waitus Zeit
          Portb = &B10111111
          Portd = &B00001000
          Waitus Zeit
          Portb = &B11111111
          Portd = &B00000000
    
    Loop
    Kennt ihr vielleicht eine Möglichkeit das Programm effektiver zu schreiben?

    Vielen Dank für eure Hilfe

    mfg Tryan

  2. #2
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    08.07.2004
    Ort
    Südhessen
    Beiträge
    1.312
    Also mir fallen auf Anhieb 2-3 Möglichkeiten ein, das in C oder Assembler zu machen (vorzugsweise C), aber für Bascom musst Du wohl auf die Bascom-Profis warten...

  3. #3
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    16.02.2006
    Beiträge
    1.112
    Hallo Tryan,
    unabhängig von der Programmiersprache würde ich zunächst mal in Frage stellen, jeden Punkt einzeln anzusteuern. Dass würde erstens zu viele Befehle benötigen (wie du bei dir siehst) und zweitens bestimmt zu ziemlichem Flimmern führen.
    Wenn dein Portd immer eine Spalte freigibt, dann kannst du die 7 Punkte in einem Befehl schalten. Dazu würde ich für jedes Zeichen die fünf Spalten nacheinander durchgehen und die 5 Werte z.B. aus dem EEProm holen, wo du sie vorher für jede Zahl abgespeichert hast.
    In Bascom würde das dann etwa so aussehen:
    Code:
    Dim Offset As Word
    Dim Zeichen As String * 1
    Dim Spalte As Byte
    Dim Werte As Byte
    Declare Sub Out_zeichen(byval Z As String)
    Do
       Zeichen = "1"
       Call Out_zeichen(zeichen)
    Loop
    
    Sub Out_zeichen(byval Z As String)
       Offset = Asc(zeichen) - 49                               'sucht Werte für Zeichen "1" ab EEProm Adresse 1
       Offset = Offset * 5                                      'immer 5 Werte pro Zeichen
       Spalte = 1
       Portb = &B11111111
       Do
          Portd = 0                                             'zum Verhindern von Geisterbildern
          Incr Offset                                           'geht die 5 Werte durch
          Readeeprom Werte, Offset
          Portb = Werte                                         'lädt die Werte
          Portd = Spalte                                        'Gibt die Spalte frei
          Print Bin(werte)                                      'zum Testen
          Shift Spalte , Left                                   'erhöht auf die nächste Spalte
       Loop Until Spalte = 32                                   'stoppt nach der 5. Spalte
    End Sub
    
    
    $eeprom
    Data &B00000000                                             'Zelle 0 im EEProm nicht benutzen!!!
    Data &B11111111 , &B10111101 , &B10000000 , &B10111111 , &B11111111       '1
    Data &B10111101 , &B10011110 , &B10101110 , &B10110110 , &B10111001       '2
    Gruß

    Rolf

  4. #4
    Benutzer Stammmitglied
    Registriert seit
    16.09.2008
    Ort
    Hamburg
    Beiträge
    49
    Hi for_ro
    danke für deine Hilfe.
    Ich habe dein Programm getestet leider zeigt die Anzeige nix an.
    Um ein Fehler aus meiner Seite auszuschießen könntest du mir dein Programm ein wenig näher erklären.

    Ich verstehe es soweit das die Spalten mit PortD nach und nach geschaltet werden.
    1Spalte=>2Splate=>3Spalte=>4Spalte=>5Spalte=>1Spal te usw...

    Wenn die erste 1 Spalte "ausgewählt" ist, wird der erste Wert von dem EEPROM an PortB ausgeben

    Wenn die erste 2 Spalte "ausgewählt" ist, wird der zweite Wert von dem EEPROM an PortB ausgeben
    usw..

    Stimmt das soweit?

    Aber warum bauche ich nur 5 Werte um 7 Zeilen mit ProtB anzusteuern? Es müsten doch sieben sein oder?

    Mfg Tryan

  5. #5
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    16.02.2006
    Beiträge
    1.112
    Hast du jetzt nur meinen Teil genommen, oder gehört von dir da auch noch was drumherum?
    Ich habe z.B. keinen µC ausgewählt, die Ports nicht konfiguriert usw, sondern nur den Teil beschrieben, der deinem Programmstück entspricht.

    Du kannst doch die "Pixel" der 5*7 Matrix nur ein und ausschalten, also 1 für aus und 0 für ein. Da sie alle hintereinander auf Port B liegen wird der Port komplett auf den Wert aus dem EEProm gesetzt.
    Ich habe die Werte binär ins EEProm geschrieben, damit du die 7 bits gleich sehen kannst. Das 8. bit ist immer aus, also immer 1.
    Du musst die Daten ins EEProm übrigens separat übertragen, zumindest muss ich das mit meinem Programmer. Das geht nach dem Kompilieren über den EEProm Tab des Programmers.

    Gruß

    Rolf

  6. #6
    Benutzer Stammmitglied
    Registriert seit
    16.09.2008
    Ort
    Hamburg
    Beiträge
    49
    Hi, also ich hab dein teil genommen und hab einfach meinen µC ausgewählt und die Ports konfiguriert.

    Code:
    $regfile = "m16DEF.DAT"
    $crystal = 16000000
    Config Porta = Input
    Config Portb = Output
    Config Portc = Output
    Config Portd = Output
    
    
    Dim Offset As Word
    Dim Zeichen As String * 1
    Dim Spalte As Byte
    Dim Werte As Byte
    Declare Sub Out_zeichen(byval Z As String)
    
    
    Do
       Zeichen = "1"
       Call Out_zeichen(zeichen)
    
    Loop
    
    Sub Out_zeichen(byval Z As String)
       Offset = Asc(zeichen) - 49                     'sucht Werte für Zeichen "1" ab EEProm Adresse 1
       Offset = Offset * 5                            'immer 5 Werte pro Zeichen
       Spalte = 1
       Portb = &B11111111
       Do
          Portd = 0                                   'zum Verhindern von Geisterbildern
          Incr Offset                                 'geht die 5 Werte durch
          Readeeprom Werte , Offset
          Portb = Werte                               'lädt die Werte
          Portd = Spalte                              'Gibt die Spalte frei
          Print Bin(werte)                            'zum Testen
          Shift Spalte , Left                         'erhöht auf die nächste Spalte
       Loop Until Spalte = 32                         'stoppt nach der 5. Spalte
    End Sub
    
    
    $eeprom
    Data &B00000000                                   'Zelle 0 im EEProm nicht benutzen!!!
    Data &B11111111 , &B10111101 , &B10000000 , &B10111111 , &B11111111       '1
    Data &B10111101 , &B10011110 , &B10101110 , &B10110110 , &B10111001       '2
    Hab ich irgendwas vergessen?

    Mfg Tryan

  7. #7
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    16.02.2006
    Beiträge
    1.112
    Hi,
    ich hab noch mal editiert weil ich deine letzte Frage übersehen hatte.

    Und in der Funktion musst du noch die globale Variable 'Zeichen' durch den Parameter Z ersetzen. Sorry.
    Wenn es dir am Ende auf Geschwindigkeit ankommt, solltest du keine Sub mit Parameter aufrufen, dass braucht zu viel Zeit.

    Gruß

    Rolf

  8. #8
    Benutzer Stammmitglied
    Registriert seit
    16.09.2008
    Ort
    Hamburg
    Beiträge
    49
    Hi for_ro

    Ich habe das Zeichen durch das Z verändern, jedoch gab es keine Änderung. Anzeige bleibt leer

    In der Simulation scheint das Programm auch richtig zu laufen, aber nur wenn ich F8 drücke...
    Ich programmiere den ATmega16 mit Ponyprog2000 und da kann ich auch den EEPROM separat mit der Bascom erstellten *.eep Datei beschreiben. Jedoch wenn ich den EEPROM vom ATmega16 auslese ist der immer leer. Muss man die "DATA" unbedingt ins EEPROM schreiben?

    Code:
    
    $regfile = "m16DEF.DAT"
    $crystal = 16000000
    Config Porta = Output
    Config Portb = Output
    Config Portc = Output                             'Zeilen
    Config Portd = Output                             'Spalten
    
    
    Dim Offset As Word
    Dim Zeichen As String * 1
    Dim Spalte As Byte
    Dim Werte As Byte
    Declare Sub Out_zeichen(byval Z As String)
    
    Porta = &B11111111
    
    
    Do
       Zeichen = "3"
       Call Out_zeichen(zeichen)
    
    
    Loop
    
    Sub Out_zeichen(byval Z As String)
       Offset = Asc(z) - 49                           'sucht Werte für Zeichen "1" ab EEProm Adresse 1
       Offset = Offset * 5                            'immer 5 Werte pro Zeichen
       Spalte = 1
       Portc = &B11111111
       Do
          Portd = 0                                   'zum Verhindern von Geisterbildern
          Incr Offset                                 'geht die 5 Werte durch
          Readeeprom Werte , Offset
          Portc = Werte                               'lädt die Werte
          Portd = Spalte                              'Gibt die Spalte frei
          Print Bin(werte)                            'zum Testen
    
          Shift Spalte , Left                         'erhöht auf die nächste Spalte
       Loop Until Spalte = 32                         'stoppt nach der 5. Spalte
    
    End Sub
    
    
    $eeprom
    Data &B00000000                                   'Zelle 0 im EEProm nicht benutzen!!!
    Data &B11111111 , &B10111101 , &B10000000 , &B10111111 , &B11111111       '1
    Data &B10111101 , &B10011110 , &B10101110 , &B10110110 , &B10111001       '2
    Data &B11111111 , &B00000000 , &B11111111 , &B00000000 , &B11111111       '3 TEST

  9. #9
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    16.02.2006
    Beiträge
    1.112
    Brauchst du nur so abändern, dann sind die Zeichen im Flash.

    Code:
    $regfile = "m16DEF.DAT"
    $crystal = 16000000
    Config Porta = Output
    Config Portb = Output
    Config Portc = Output                             'Zeilen
    Config Portd = Output                             'Spalten
    
    Dim Offset As Word
    Dim Zeichen As String * 1
    Dim Spalte As Byte
    Dim Werte As Byte
    Declare Sub Out_zeichen(byval Z As String)
    
    Porta = &B11111111
    
    Do
       Zeichen = "3"
       Call Out_zeichen(zeichen)
    Loop
    
    End
    
    Sub Out_zeichen(byval Z As String)
       Offset = Asc(z) - 49                           'sucht Werte für Zeichen "1" ab EEProm Adresse 1
       Offset = Offset * 5                            'immer 5 Werte pro Zeichen
       Spalte = 1
       Portc = &B11111111
       Do
          Portd = 0                                   'zum Verhindern von Geisterbildern
          Incr Offset                                 'geht die 5 Werte durch
          Werte=Lookup(Offset,Zeichen_data)
          'Readeeprom Werte , Offset
          Portc = Werte                               'lädt die Werte
          Portd = Spalte                              'Gibt die Spalte frei
          Print Bin(werte)                            'zum Testen
    
          Shift Spalte , Left                         'erhöht auf die nächste Spalte
       Loop Until Spalte = 32                         'stoppt nach der 5. Spalte
    
    End Sub
    
    
    '$eeprom
    Zeichen_data:
    Data &B00000000                                   'Zelle 0 im EEProm nicht benutzen!!!
    Data &B11111111 , &B10111101 , &B10000000 , &B10111111 , &B11111111       '1
    Data &B10111101 , &B10011110 , &B10101110 , &B10110110 , &B10111001       '2
    Data &B11111111 , &B00000000 , &B11111111 , &B00000000 , &B11111111       '3 TEST

  10. #10
    Benutzer Stammmitglied
    Registriert seit
    16.09.2008
    Ort
    Hamburg
    Beiträge
    49
    Hi for_ro

    Von der Grundfunktion, funktionier das Programm nun
    Code:
    $regfile = "m16DEF.DAT"
    $crystal = 16000000
    Config Porta = Output
    Config Portb = Output
    Config Portc = Output                             'Zeilen
    Config Portd = Input                              'Spalten
    
    Dim Offset As Word
    Dim Zeichen As String * 1
    Dim Spalte As Byte
    Dim Werte As Byte
    Declare Sub Out_zeichen(byval Z As String)
    
    
    
    Do
    
       Zeichen = "1"
       Call Out_zeichen(zeichen)
    
    
    
    Loop
    
    End
    
    Sub Out_zeichen(byval Z As String)
       Offset = Asc(z) - 49                           'sucht Werte für Zeichen "1"
       Offset = Offset * 5                            'immer 5 Werte pro Zeichen
       Spalte = 1
       Portc = &B11111111
       Do
          Porta = 0                                   'zum Verhindern von Geisterbildern
          Incr Offset                                 'geht die 5 Werte durch
          Werte = Lookup(offset , Zeichen_data)
    
          Portc = Werte                               'lädt die Werte
          Porta = Spalte                              'Gibt die Spalte frei
          Waitms 5
    
          Shift Spalte , Left                         'erhöht auf die nächste Spalte
       Loop Until Spalte = 32                         'stoppt nach der 5. Spalte
    
    End Sub
    
    
    
    Zeichen_data:
    Data &B00000000                                   'Zelle 0 im EEProm nicht benutzen!!!
    Data &B11111111 , &B10111101 , &B10000000 , &B10111111 , &B11111111       '1
    Data &B10111101 , &B10011110 , &B10101110 , &B10110110 , &B10111001       '2
    Data &B00000000 , &B00000000 , &B00000000 , &B00000000 , &B00000000       '3 TEST
    Leider ist die gleichmäßige Ausleuchtung sehr schlecht...
    Wäre es nicht eigentlich besser die Zeilen immer frei zu geben und den spalten ein Bitmuster zu geben?
    Oder müsste man das Programm mit Absicht verlangsamen, sodass die LEDs länger angesprochen werden? Waitus XX ?

    Ich habe noch ein weiteres Programm gefunden, das eine Matrix ansteuern kann
    Code:
    $regfile = "m16DEF.DAT"
    $crystal = 16000000
    $baud = 19200
    
    
    Dim A(7) As Byte
    
    Dim Leds As Byte
    Dim I As Byte
    Dim J As Byte
    
    Config Porta = Output
    Porta = 0
    
    Config Portc = Output
    Portc = &HFF
    
    Restore Dotmatrix
    
    For I = 1 To 8
        Read A(i)
    Next
    
    Do
    
    
    For I = 0 To 6
     Portc = &HFF
     Reset Portc.i
     J = I + 1
     Waitus 750
     Porta = A(j)
     Next
    Loop
    End
    
    Dotmatrix:
    Data &B11100110 , &B11100100 , &B11100100 , &B11100100 , &B11100100 , &B11101110 , &B11100100
    Data &B11110001 , &B11100000 , &B11100000 , &B11100000 , &B11100000 , &B11101110 , &B11101110
    Nur habe ich es da leider noch nicht geschafft in die zweite "Datenzeile" zu springen, wie es mit dem deinem Programm so einfach war.



    Mfg Tryan[code]

Seite 1 von 7 123 ... LetzteLetzte

Berechtigungen

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