-
Dein Code funktioniert grundsätzlich, aber ich sehe da zwei Probleme:
Blink_an = 0 in der ISR, direkt vor dem Port schalten.
Das sorgt dafür, dass der Vergleich nur ein einziges Mal zutrifft, danach ist das Display wieder aus.
Du musst das Hochzählen dieser Variable durchlaufen lassen. Das Verhältnis von Max_blink_an und 255 (weil Byte) gibt dir das Blink Verhältnis. Und das ist das zweite Problem: Meistens will man ein 50/50 Verhältnis, weil das besser aussieht. Dein Code würde mehr ein PWM erzeugen, also feste Frequenz aber veränderbares Verhältnis. Bei Display_off ist das so, weil du da ja dimmen willst. Beim Blinken über den Sectic ist das Verhältnis automatisch 50/50, die gesamte Dauer 2 Sekunden. Das könnte etwas langsam sein, geht mit Sekundentakt aber nicht schneller. Wenn du es schneller haben willst dann so wie du angefangen hast.
Du müsstest dann erst einmal überlegen, in welchem Verhältnis an und aus sein sollen und dann auch die absolute Zeit für eine Periode.
Deine Timer ISR wird jetzt etwa 1000 mal pro Sekunde aufgerufen. Wenn die gesamte Periode also z.B. 1 Sekunde sein soll, dann zählst du eine Variable bis 1000 hoch. Der Wechsel käme dann bei 500, wenn du 50/50 haben willst. Für langsamers Blinken zählst du höher, für kürzeres entsprechend niedriger. Solange du nicht wesentlich niedriger gehst, kommt dir das mit den anderen Umschaltungen nicht in die Quere.
Ich habe es dir mal in deinen Code eingebaut:
Code:
$regfile = "m16DEF.DAT"
$crystal = 16000000
Config Porta = Input
Config Portb = Output
Config Portc = Output
Config Portd = Output
Dim Offset As Word 'kann auch byte sein, wenn du nicht mehr als 50 Zeichen brauchst
Dim Zeichen As Byte
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
Do
Zeichen = Asc( "2")
If Pina.7 = 1 Then Max_display_off = 4
If Pina.7 = 0 Then Max_display_off = 0
If Pina.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
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 &B11111111 , &B10111101 , &B10000000 , &B10111111 , &B11111111 '1
Data &B10111101 , &B10011110 , &B10101110 , &B10110110 , &B10111001 '2
Gruß
Rolf
-
Hey for_ro
Also wenn ich dein Programm so teste, sagt bascom das er nicht Max_blink_aus "versteht". hast du dich da Verschrieben? Sollte es Max_blink_an sein? Oder hast du die DIM für Max_blink_aus vergessen?
Ich hab beide Möglichkeiten gestest jedoch blink die anzeige nicht...es passiert nichts ;)
mfg Tryan
-
Hallo Tryan,
da waren gleich mehrere Fehler drin.
Ich kann hier leider nichts kontrollieren, da ich hier kein Bascom habe.
Probier es noch einmal mit dem Code in meiner letzten Mail.
Gruß
Rolf
-
Hi for_ro
ich weiß gar nicht wie ich dir für alles danken kann.
Ohne dich hätte ich wahrscheinlich schon aufgeben!
Jetzt läuft alles so wie es mir vorgestellt habe.
Und mit 21% ist die Bascom Demo schon so gut wie ausgereizt. ;)
Also nochmal vielen vielen Dank!!!!
Mfg Tryan
-
Hi for_ro, hallo forum,
Ich wollte gerne noch mehr Zeichen und Buchstaben in meinem Programm anzeigen lassen. Jedoch kann ich leider nur max 8 Zeichen anzeigen lassen.
Ab dem neunten Zeichen, zeigt mir die Anzeige nur noch wildes durcheinander.
Ich glaube das einfach Offset und Zeichen mit einem Byte schon voll belegt sind. Aber wenn ich Offset und Zeichen als Word dimmensioniere. Zeigt die Anzeige das gleiche durcheinander an.
Wo liegt mein Fehler?
Danke für eure Hilfe
Mfg Tryan
-
Hallo Tryan,
stell doch mal dein aktuelles Programm ein.
Dann ist das bestimmt kein Problem.
Gruß
Rolf
-
Hallo for_ro
also es hat sich nicht viel verändert.
Code:
$regfile = "m16DEF.DAT"
$crystal = 16000000
Config Porta = Input
Config Portb = Output
Config Portc = Input
Config Portd = Output
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
If Pina.0 = 0 And Pina.1 = 0 And Pina.2 = 0 And Pina.3 = 0 And Pina.4 = 0 And Pina.5 = 0 And Pina.6 = 0 And Pina.7 = 0 Then
Zeichen = Asc( "1" )
End If
If Pina.0 = 1 Then Zeichen = Asc( "2")
If Pina.1 = 1 Then Zeichen = Asc( "3")
If Pina.2 = 1 Then Zeichen = Asc( "4")
If Pina.3 = 1 Then Zeichen = Asc( "5")
If Pina.4 = 1 Then Zeichen = Asc( "6")
If Pina.5 = 1 Then Zeichen = Asc( "7")
If Pina.6 = 1 Then Zeichen = Asc( "8")
'If Pina.7 = 1 Then Zeichen = Asc( "9") 'deaktiviert um mehr als 9 zeichen mit PortA zu realisieren
If Pina.7 = 1 Then Zeichen = Asc( "10")
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
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
Ich muss mich korriegen es ist möglich 9 Zeichen darzustellen.
Aber beim 10ten Zeichen wird dieses nicht angezeigt.
Gruß
Tryan
-
Hallo tryan,
du scheinst die Funktion von PortA geändert zu haben. Was soll der genau machen?
Wenn ich mich richtig erinnere, kannst du irgendwie zwischen den 5 Anzeigen hin und hergehen und die aktuelle Zahl soll blinken. Dann kannst du sie über externe Taster rauf und runterzählen. Und die gesamte Anzeige war dimmbar.
Erkläre doch noch einmal, wie das ablaufen soll.
Gruß
Rolf
-
Hallo for_ro ,
Also bei PortA passiert nicht anderes als z.b. Taster1 High dann eine 1 in der 5x7 LED-Matrix anzeigen. Wenn Taster2 High dann eine 2 in der Matrix anzeigen usw... Wenn kein Taster High ist wird eine 0 angezeigt
Es gibt nicht die Möglichkeit die Zahlen hoch zählen zu lassen.
Aber du hast recht es gibt die Möglichkeit die Anzeige blinken und zu dimmen. Das passier hier:
Code:
'Dimmen
If Pinc.7 = 1 Then Max_display_off = 4
If Pinc.7 = 0 Then Max_display_off = 0
'Blinken
If Pinc.6 = 1 Then
Max_blink_an = 800
Blink_an = 400
Else
Max_blink_an = 0
Blink_an = 0
End If
Ich hoffe ich konnte dir die Grundfunktion soweit erklären.
Gruß Tryan
-
Hallo tryan,
wäre es nicht besser, du würdest nur eine Rauf- und eine Runter-Taste benutzen, um die Werte in der Anzeige zu ändern? Sonst musst du doch jede Menge Eingänge ver(sch)wenden, um ein Zeichen vorzugeben.
Dies ist sicherlich keine große Sache zu programmieren. Dann kannst du im Prinzip beliebig viele Zeichen darstellen. Wenn man es ganz cool machen will, würde bei kurz drücken nur ein Zeichen weitergeschaltet, bei längerem Drücken gleich mehrere.
Aber das solltest du jetzt entscheiden, ansonsten musst den ganzen Code nachher wieder ändern, wenn du noch mehr Zeichen sehen willst.
Gruß
Rolf
-
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
-
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
-
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
-
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
-
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
-
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
-
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 abschnitt:(PINA1=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
-
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
-
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
-
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
-
Hallo for_ro
Wenn ich den Prescaler auf 1024 hochsetzte wird die 0 fast wieder richitg angezeigt und die 1, 2 und 3 komplett richtig
Nimm ich die LCD abfrage für die 0 raus wird, werden mir alle Zahlen wieder richitg angezeigt.
Jedoch funktioniert dann die LCD anzeige nicht mehr ganz richitg.
Wenn kein Taster gedrückt wird springt sie Automatisch von Taster 1 auf Taster 2 auf Taster 3 und wieder von vorne.
Wenn ich Taster 1 drücke bleibt die LCD Anzeige auf Taster1 stehen usw.
Ist der Timer0 für das Ansprechen wür die LCD zuständig?
Wenn ja, könnte man dann auf Timer1 ausweichen?
Gruß Tryan
-
Hallo Tryan,
zeig doch mal, wie du das jetzt geändert hast.
Brauchst du den niedrigen Prescaler, um Flackern zu verhindern?
ich denke das Problem mit der 0 ist, das die immer erfüllt ist, wenn kein Taster gedrückt ist. Daher würde ich da eher eine Abfrage rein machen, ob vorher auch schon 0 war, dann macht er nichts, ansonsten wird die 0 dargestellt.
Etwa so:
Select Case Taster
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 Taster=0 And Offset > 0 Then
Offset=0
Locate 1 , 1
Lcd "Kein Taster"
End If
Gruß
Rolf
-
Hallo for_ro
Also hier ist das Programm:
Code:
$regfile = "m16DEF.DAT"
$crystal = 16000000
$hwstack = 32 ' default use 32 for the hardware stack
$swstack = 8 'default use 10 for the SW stack
$framesize = 40
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 = 1024 '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 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 Taster=0 And Offset > 0 Then
Offset=0
Locate 1 , 1
Lcd "Kein Taster"
End If
'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 Offset = 3 Then
Locate 1 , 1
Lcd "Taster 3 "
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
Ja ich brauch ein niedrigen Prescaler um das flackern auf der 5x7 Matrix zu verhindern.
Wie das Programm jetzt ist, flackert die 5x7 Matrix und beim LCD springt die anzeige von "Kein Taster" zu "Taster 1" zu "Taster 2" zu "Taster 3" und wieder zu "Kein Taster", obwohl kein Taster gedrückt wird.
Wenn ich nun z.b. "Taster 2" drücke zeigt mir die 5x7 Matrix eine flackerne 2 an und das LCD "Taster 2".
Wo meinst du kommen die Daten von der 5x7 Matrix und von dem LCD drucheinander?
gruß Tryan
-
Hallo Tryan,
setz mal den prescaler wieder auf 64, dann hast du wieder 1ms Überlaufzeit für den Timer.
Ich denke, dass die lange Ausgabezeit für das LCD (jedenfalls mehr als 1ms) den Timer beeinflusst.
Ich habe deine Do...Loop mal so abgeändert, dass die Ausgabe aufs Display immer nur einmal stattfindet. Danach ist PINA=Taster und er macht nichts. Erst bei einem anderen Taster wird wieder der zugehörige Text gezeigt.
Mach die Do..Loop so
Code:
Do
If Pina <> Taster
Taster = Pina
Select Case Taster
Case 0 :
Offset = 0
Locate 1 , 1
Lcd "Kein Taster"
Case 1 : Offset = 1
Locate 1 , 1
Lcd "Taster 1 "
Case 2 : Offset = 2
Locate 1 , 1
Lcd "Taster 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
End If
Loop
Gruß
Rolf
-
Hallo for_ro
Ich hab mal deine Do Loop schleife eingesetzt jedoch ohne erfolg.
Die LCD zeigt alles richitg an, aber die 5x7 Martix zeigt bei jeder Zahl nur drucheinander an.
Dank für deine mühe. Es ist echt Super das du mir bei meinen Problemen Hilfst!
Gruß Tryan
-
Hallo Tryan,
ich hatte übersehen, dass Offset nicht mehr jedesmal neu gesetzt ist und daher in der ISR immer nur weiter verändert wird: Offset = Offset * 5.
Nimm mal diese Do..Loop und erste Zeile von Timer0_isr
Code:
Do
If Pina <> Taster Then
Taster = Pina
Select Case Taster
Case 0 :
Zeichen = 0
Locate 1 , 1
Lcd "Kein Taster"
Case 1 : Zeichen = 1
Locate 1 , 1
Lcd "Taster 1 "
Case 2 : Zeichen = 2
Locate 1 , 1
Lcd "Taster 2 "
Case 4 : Zeichen = 3
Case 8 : Zeichen = 4
Case 16 : Zeichen = 5
Case 32 : Zeichen = 6
Case 64 : Zeichen = 7
Case 128 : Zeichen = 8
End Select
End If
Loop
Timer0_isr:
Offset = Zeichen * 5 'immer 5 Werte pro Zeichen
Gruß
Rolf
-
Hallo for_ro,
Du hast es mal wieder geschafft! Das Programm läuft jetzt 1A.
Vielen Dank nochmal für deine Hilfe!
Mal schauen ob mir noch mehr Blödsinn für das Programm einfällt ;)
Lg Tryab