- 3D-Druck Einstieg und Tipps         
Seite 6 von 7 ErsteErste ... 4567 LetzteLetzte
Ergebnis 51 bis 60 von 67

Thema: Eine LED-Matrix 5x7 ansteuern

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

    Praxistest und DIY Projekte
    Hallo for_ro,
    Du hast recht das ich viele Eingänge ver(sch)wende, aber ich habe z.Z. 8 Taster und möchte die nun erweitern vielleicht 16 oder so.
    Ich brauch aber wirklich nur die Funktion Taster1 High dann 1 in der Anzeige anzeigen usw. Sorry wenn ich so engstirnig bin


    Gruß Tryan

  2. #52
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    16.02.2006
    Beiträge
    1.113
    Hallo tryan,
    ich habe dir mal ein paar Zeilen hinzugefügt.
    Da mit der 0 abfragen wird doch so nicht gehen. Dass würde bedeuten, wenn du keinen Taster drückst, dann soll auch ein Zeichen kommen. Das würde dann aber immer kommen, wenn keiner gedrückt ist.
    Ist es das was du möchtest?

    Code:
    $regfile = "m16DEF.DAT"
    $crystal = 16000000
    Config Porta = Input
    Config Portb = Output
    Config Portc = Input
    Config Portd = Output
    Dim Taster As Byte
    Dim Offset As Word                                          'kann auch byte sein, wenn du nicht mehr als 50 Zeichen brauchst
    Dim Zeichen As Word
    Dim Spalte As Byte
    Dim Werte As Byte
    Dim Display_off As Byte , Max_display_off As Byte ,
    Dim Blink_an As Word , Blink_count As Word , Max_blink_an As Word   'damit auch höhere Zahlen als 255 gehen
    
    Config Dcf77 = Pind.7 , Check = 2 , Timer = 1 , Timer1sec = 1 , Debug = 1 , Sectic = 1
    
    Config Timer0 = Timer , Prescale = 64             'timer läuft alle 16.000.000/256/256=250.stel Sekunde über, also etwa alle 4ms
    On Timer0 Timer0_isr
    Enable Timer0
    Enable Interrupts
    Spalte = 0
    
    Portc = &B00000000
    
    Do
       Taster = Pina
       If Taster > 0 Then
          Select Case Taster
             Case 1 : Zeichen = Asc( "1" )
             Case 2 : Zeichen = Asc( "2" )
             Case 4 : Zeichen = Asc( "3" )
             Case 8 : Zeichen = Asc( "4" )
             Case 16 : Zeichen = Asc( "5" )
             Case 32 : Zeichen = Asc( "6" )
             Case 64 : Zeichen = Asc( "7" )
             Case 128 : Zeichen = Asc( "8" )
          End Select
       Else
          Taster = Pinc
          Select Case Taster
             Case 1 : Zeichen = Asc( "9" )
             Case 2 : Zeichen = Asc( "0" )
             Case 4 : Zeichen = Asc( ":" )
             Case 8 : Zeichen = Asc( ";" )
             Case 16 : Zeichen = Asc( "<" )
             Case 32 : Zeichen = Asc( "=" )
          End Select
       End If
    
       If Pinc.7 = 1 Then Max_display_off = 4
       If Pinc.7 = 0 Then Max_display_off = 0
    
       If Pinc.6 = 1 Then
          Max_blink_an = 800
          Blink_an = 400                                        'hier das Verhältnis (400/800), heisst nach der Hälfte der Zeit geht es an, kleiner Wert heisst länger an
       Else
          Max_blink_an = 0
          Blink_an = 0
       End If
    Loop
    
    Timer0_isr:
       Offset = Zeichen - 49                                    'die 49 musst du evtl. noch anpassen, wenn andere Zeichen dazukommen
       Offset = Offset * 5                            'immer 5 Werte pro Zeichen
       If Spalte = 5 Then
          Spalte = 0
       End If
       Offset = Offset + Spalte
       Werte = Lookup(offset , Zeichen_data)
       Incr Display_off
       Incr Blink_count
       if Blink_count>Max_blink_an Then Blink_count=0
       Portd = 0                                      'zum Verhindern von Geisterbildern
       If Display_off > Max_display_off Then          'damit bleibt das Zeichen immer für eine bestimmte Zeit aus
          Display_off = 0
          If Blink_count >= Blink_an Then
             Portb = Werte                                      'lädt die Werte
             Portd.spalte = 1                            'Gibt die Spalte frei
             Incr Spalte
          End If
       End If
    Return
    
    Zeichen_data:
    Data &B11000001 , &B10101110 , &B10110110 , &B10111010 , &B11000001       '0
    Data &B11111111 , &B10111101 , &B10000000 , &B10111111 , &B11111111       '1
    Data &B10111101 , &B10011110 , &B10101110 , &B10110110 , &B10111001       '2
    Data &B11011110 , &B10111110 , &B10110110 , &B10110010 , &B11001100       '3
    Data &B11100111 , &B11101011 , &B11101101 , &B10000000 , &B11101111       '4
    Data &B11010000 , &B10110110 , &B10110110 , &B10110110 , &B11000110       '5
    Data &B10000000 , &B11110110 , &B11100110 , &B11010110 , &B10111001       'R
    Data &B11111011 , &B11111101 , &B10000000 , &B11111101 , &B11111011       'Pfeil 0ben
    Data &B11101111 , &B11011111 , &B10000000 , &B11011111 , &B11101111       'Pfeil unten
    Data &B10000000 , &B10000000 , &B10000000 , &B10000000 , &B10000000       'Voll an
    Gruß

    Rolf

  3. #53
    Benutzer Stammmitglied
    Registriert seit
    16.09.2008
    Ort
    Hamburg
    Beiträge
    49
    Hallo for_ro,
    danke für deine mühe

    Ja stimmt wenn kein Taster gedrückt wird, solll die 0 angezeigt werden.

    Leider kann ich bei deinem Programm nicht auf PORTC zugreifen, also das Programm reagiert nicht auf HIGH signale auf PORTC.

    Eine frage stellt sich mir grade, was genau bedeutet eigentlich:
    Offset = Zeichen - 49?

    Und kann es vielleicht sein das "Zeichen_data" nur max. 9 Zeichen reinpassen?

    Gruß
    Tryan

  4. #54
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    16.02.2006
    Beiträge
    1.113
    Hallo Tryan,
    ich habe dir mal hier eine etwas vereinfachte Version geschickt. Ich gestern abend wohl doch nicht mehr ganz dabei.
    In Zeichen_dta passt im Prinzip soviel rein, wie dein Flash nach dem Programm noch frei hat.
    Allerdings kannst du mit Lookup() max. 65536 davon ansprechen.
    Hier sind jetzt erst mal wieder nur 9 Zeichen. Wohin willst du den 9. Taster usw. legen?
    Deine Taster schalten nach VCC. Haben die einen Pulldown nach GND dran?

    Gruß

    Rolf

    Code:
    $regfile = "m16DEF.DAT"
    $crystal = 16000000
    Config Porta = Input
    Config Portb = Output
    Config Portc = Input
    Config Portd = Output
    Dim Taster As Byte
    Dim Offset As Word                                          'kann auch byte sein, wenn du nicht mehr als 50 Zeichen brauchst
    Dim Zeichen As Word
    Dim Spalte As Byte
    Dim Werte As Byte
    Dim Display_off As Byte , Max_display_off As Byte ,
    Dim Blink_an As Word , Blink_count As Word , Max_blink_an As Word       'damit auch höhere Zahlen als 255 gehen
    
    Config Dcf77 = Pind.7 , Check = 2 , Timer = 1 , Timer1sec = 1 , Debug = 1 , Sectic = 1
    
    Config Timer0 = Timer , Prescale = 64                       'timer läuft alle 16.000.000/256/256=250.stel Sekunde über, also etwa alle 4ms
    On Timer0 Timer0_isr
    Enable Timer0
    Enable Interrupts
    Spalte = 0
    
    Portc = &B00000000
    
    Do
       Taster = Pina
       Select Case Taster
          Case 0 : Offset = 0
          Case 1 : Offset = 1
          Case 2 : Offset = 2
          Case 4 : Offset = 3
          Case 8 : Offset = 4
          Case 16 : Offset = 5
          Case 32 : Offset = 6
          Case 64 : Offset = 7
          Case 128 : Offset = 8
       End Select
    
       If Pinc.7 = 1 Then Max_display_off = 4
       If Pinc.7 = 0 Then Max_display_off = 0
    
       If Pinc.6 = 1 Then
          Max_blink_an = 800
          Blink_an = 400                                        'hier das Verhältnis (400/800), heisst nach der Hälfte der Zeit geht es an, kleiner Wert heisst länger an
       Else
          Max_blink_an = 0
          Blink_an = 0
       End If
    Loop
    
    Timer0_isr:
       Offset = Offset * 5                                      'immer 5 Werte pro Zeichen
       If Spalte = 5 Then
          Spalte = 0
       End If
       Offset = Offset + Spalte
       Werte = Lookup(offset , Zeichen_data)
       Incr Display_off
       Incr Blink_count
       If Blink_count > Max_blink_an Then Blink_count = 0
       Portd = 0                                                'zum Verhindern von Geisterbildern
       If Display_off > Max_display_off Then                    'damit bleibt das Zeichen immer für eine bestimmte Zeit aus
          Display_off = 0
          If Blink_count >= Blink_an Then
             Portb = Werte                                      'lädt die Werte
             Portd.spalte = 1                                   'Gibt die Spalte frei
             Incr Spalte
          End If
       End If
    Return
    
    Zeichen_data:
    Data &B11000001 , &B10101110 , &B10110110 , &B10111010 , &B11000001       '0
    Data &B11111111 , &B10111101 , &B10000000 , &B10111111 , &B11111111       '1
    Data &B10111101 , &B10011110 , &B10101110 , &B10110110 , &B10111001       '2
    Data &B11011110 , &B10111110 , &B10110110 , &B10110010 , &B11001100       '3
    Data &B11100111 , &B11101011 , &B11101101 , &B10000000 , &B11101111       '4
    Data &B11010000 , &B10110110 , &B10110110 , &B10110110 , &B11000110       '5
    Data &B10000000 , &B11110110 , &B11100110 , &B11010110 , &B10111001       'R
    Data &B11111011 , &B11111101 , &B10000000 , &B11111101 , &B11111011       'Pfeil 0ben
    Data &B11101111 , &B11011111 , &B10000000 , &B11011111 , &B11101111       'Pfeil unten
    Data &B10000000 , &B10000000 , &B10000000 , &B10000000 , &B10000000       'Voll an

  5. #55
    Benutzer Stammmitglied
    Registriert seit
    16.09.2008
    Ort
    Hamburg
    Beiträge
    49
    Hallo for_ro,
    vielen dank jetzt kann ich mehr Zeichen darstellen.
    Ich habe noch ein wenig rumgespielt und ein LCD angeschlossen und jetzt zeigt die 5x7 Matrix bei 0 und bei 1 nur noch durcheinander....

    Code:
    $regfile = "m16DEF.DAT"
    $crystal = 16000000
    Config Porta = Input
    Config Portb = Output
    Config Portc = Input
    Config Portd = Output
    
    Dim Taster As Byte
    Dim Offset As Word                                          'kann auch byte sein, wenn du nicht mehr als 50 Zeichen brauchst
    Dim Zeichen As Word
    Dim Spalte As Byte
    Dim Werte As Byte
    Dim Display_off As Byte , Max_display_off As Byte ,
    Dim Blink_an As Word , Blink_count As Word , Max_blink_an As Word       'damit auch höhere Zahlen als 255 gehen
    
    Config Dcf77 = Pind.7 , Check = 2 , Timer = 1 , Timer1sec = 1 , Debug = 1 , Sectic = 1
    
    Config Timer0 = Timer , Prescale = 64                       'timer läuft alle 16.000.000/256/256=250.stel Sekunde über, also etwa alle 4ms
    On Timer0 Timer0_isr
    Enable Timer0
    Enable Interrupts
    Spalte = 0
    
    Portc = &B00000000
    '---------------------------------
    'LCD einstellung
    '---------------------------------
       Config Lcdpin = PinC , Db4 = Portc.4 , Db5 = Portc.5 , Db6 = Portc.6 , Db7 = Portc.7 , E = Portc.3 , Rs = Portc.2
       Config Lcd = 20 * 4
       Initlcd
       Cursor Off
    Do
    
       Taster = Pina
       Select Case Taster
          Case 0 : Offset = 0
          Case 1 : Offset = 1
          Case 2 : Offset = 2
          Case 4 : Offset = 3
          Case 8 : Offset = 4
          Case 16 : Offset = 5
          Case 32 : Offset = 6
          Case 64 : Offset = 7
          Case 128 : Offset = 8
       End Select
    
       If Offset = 0 Then
       Locate 1 , 1
       Lcd "Kein Taster"
       End If
    
       If Offset = 1 Then
       Locate 1 , 1
       Lcd "Taster 1    "
       End If
    
       If Offset = 2 Then
       Locate 1 , 1
       Lcd "Taster 2    "
       End If
    
    
       'If Pinc.7 = 1 Then Max_display_off = 4
       'If Pinc.7 = 0 Then Max_display_off = 0
    
       'If Pinc.6 = 1 Then
          'Max_blink_an = 800
          'Blink_an = 400                                        'hier das Verhältnis (400/800), heisst nach der Hälfte der Zeit geht es an, kleiner Wert heisst länger an
       'Else
          'Max_blink_an = 0
          'Blink_an = 0
       'End If
    Loop
    
    Timer0_isr:
       Offset = Offset * 5                                      'immer 5 Werte pro Zeichen
       If Spalte = 5 Then
          Spalte = 0
       End If
       Offset = Offset + Spalte
       Werte = Lookup(offset , Zeichen_data)
       Incr Display_off
       Incr Blink_count
       If Blink_count > Max_blink_an Then Blink_count = 0
       Portd = 0                                                'zum Verhindern von Geisterbildern
       If Display_off > Max_display_off Then                    'damit bleibt das Zeichen immer für eine bestimmte Zeit aus
          Display_off = 0
          If Blink_count >= Blink_an Then
             Portb = Werte                                      'lädt die Werte
             Portd.spalte = 1                                   'Gibt die Spalte frei
             Incr Spalte
          End If
       End If
    Return
    
    Zeichen_data:
    Data &B11000001 , &B10101110 , &B10110110 , &B10111010 , &B11000001       '0
    Data &B11111111 , &B10111101 , &B10000000 , &B10111111 , &B11111111       '1
    Data &B10111101 , &B10011110 , &B10101110 , &B10110110 , &B10111001       '2
    Data &B11011110 , &B10111110 , &B10110110 , &B10110010 , &B11001100       '3
    Data &B11100111 , &B11101011 , &B11101101 , &B10000000 , &B11101111       '4
    Data &B11010000 , &B10110110 , &B10110110 , &B10110110 , &B11000110       '5
    Data &B10000000 , &B11110110 , &B11100110 , &B11010110 , &B10111001       'R
    Data &B11111011 , &B11111101 , &B10000000 , &B11111101 , &B11111011       'Pfeil 0ben
    Data &B11101111 , &B11011111 , &B10000000 , &B11011111 , &B11101111       'Pfeil unten
    Data &B11111111 , &B10000000 , &B10000000 , &B10000000 , &B10000000       'A
    Data &B10000000 , &B11111111 , &B10000000 , &B10000000 , &B10000000       'B
    Data &B10000000 , &B10000000 , &B11111111 , &B10000000 , &B10000000       'C
    Data &B10000000 , &B10000000 , &B10000000 , &B11111111 , &B10000000       'D
    Data &B10000000 , &B10000000 , &B10000000 , &B10000000 , &B10000000       'E
    Kommen da ein Paar Daten in die quere?
    Das LCD zeigt alles richitg an, muss ich dafür sorgen das die "5x7.Matrix Daten" irgendwo anders im Speicher sich befinden?

    Gruß Tryan

  6. #56
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    16.02.2006
    Beiträge
    1.113
    Hallo Tryan,
    lass doch mal den Case 0 weg, der erscheint mir immer noch etwas seltsam.
    Funktioniert das LCD oder kommt da auch teilweise Durcheinander raus?
    Wann kommt das Durcheinander genau, welche Tasten hast du gedrückt?
    Dann kann man das mal im Simulator ausprobieren.

    Gruß

    Rolf

  7. #57
    Benutzer Stammmitglied
    Registriert seit
    16.09.2008
    Ort
    Hamburg
    Beiträge
    49
    Hallo for_ro
    Also die LCD Anzeige zeigt alles richitg an.

    Ich denke das der abschnitt: (keine Taste gedrückt)
    If Offset = 0 Then
    Locate 1 , 1
    Lcd "Kein Taster"
    End If

    die 0 in der 5x7 Matrix anzeige stört.

    Weiter stört der abschnitt: (PINA0=1)
    If Offset = 1 Then
    Locate 1 , 1
    Lcd "Taster 1 "
    End If

    die 1 in der 5x7 Matrix anzeige.

    Weiter stört der abschnittPINA1=1)
    If Offset = 2 Then
    Locate 1 , 1
    Lcd "Taster 2 "
    End If

    die 2 in der 5x7 Matrix anzeige.

    Wenn ich die Taste 3 (PINA3=1)drücke wird mir ganz normal die 3 in der 5x7 Matrix angezeigt.

    Erweitere ich den Code mit folgenden Zeilen:

    If Offset = 3 Then
    Locate 1 , 1
    Lcd "Taster 3 "
    End If

    Wird auch die 3 gestört.


    Es ist egal ob CASE 0 im Programmcode inhalten ist oder nicht. Das Problem besteht weiterhin.
    Ich hoffe ich konnte das soweit erklären was der Fehler ist.

    Gruß Tryan

  8. #58
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    16.02.2006
    Beiträge
    1.113
    Wie stehen eigentlich deine Stack- und Framewerte?
    Ich würde die immer ins Programm mit reinschreiben. Du findest die Werte unter Options -> Compiler -> Chip.
    Die LCD Ausgabe wird etwas Platz auf dem Frame benötigen. Erhöhe den Wert mal auf 40.
    Da dies immer nur dann kommt, wenn du Ausgaben machst, könnte das das Problem beheben.

    Gruß

    Rolf

  9. #59
    Benutzer Stammmitglied
    Registriert seit
    16.09.2008
    Ort
    Hamburg
    Beiträge
    49
    Hallo for_ro,

    also ich habe die Zeilen:
    $hwstack = 32 '
    $swstack = 8
    $framesize = 40

    zu dem Programm hinzugefügt jedoch leider ohne veränderung...
    Irgendwas kommt da immer noch durcheinander.

    Gruß Tryan

  10. #60
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    16.02.2006
    Beiträge
    1.113
    Hallo Tryan,
    wenn ich das richtig sehe, hast du alle Verwendungen vom PortC auskommentiert und nur noch für das Display verwendet. Checke das sicherheitshalber noch einmal.
    Wo ich jetzt gerade dran denke ist, ob durch die Ausführungszeit der LCD Ausgabe nicht evtl. das Timing gestört wird. Du hast die Überlaufzeit des Timers ja auf 1ms runtergesetzt. In der Zeit schafft das Display definitiv nicht seine Ausgabe.
    Zum testen könntest du mal zwei Sachen machen:
    1. Setze den Prescaler hoch auf möglichst großen Wert, also 1024. Dadurch flackert deine Anzeige zwar, aber du kannst sehen, ob die 0 dann richtig kommt.
    2. Kommentier nur mal den LCD-Befehl bei der 0-Taste aus. Mal sehen ob es da dann wieder geht.

    Gruß

    Rolf

Seite 6 von 7 ErsteErste ... 4567 LetzteLetzte

Berechtigungen

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

Labornetzteil AliExpress