PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Eine LED-Matrix 5x7 ansteuern



Tryan
10.10.2008, 17:44
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....


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

thewulf00
11.10.2008, 15:01
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...

for_ro
11.10.2008, 16:11
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:


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

Tryan
13.10.2008, 16:37
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=>1Spalte 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

for_ro
13.10.2008, 18:47
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

Tryan
13.10.2008, 18:54
Hi, also ich hab dein teil genommen und hab einfach meinen µC ausgewählt und die Ports konfiguriert.



$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

for_ro
13.10.2008, 18:56
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

Tryan
14.10.2008, 12:53
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?





$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

for_ro
14.10.2008, 18:42
Brauchst du nur so abändern, dann sind die Zeichen im Flash.



$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

Tryan
15.10.2008, 12:45
Hi for_ro

Von der Grundfunktion, funktionier das Programm nun



$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



$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]

stefan_Z
15.10.2008, 17:52
Die Helligkeit der LEDs ändert sich halt mit der Anzeigedauer und der gewünschten Refresh-Rate.
Die LEDs ohne Pause durchrattern zu lassen gibt die meisten FPS, aber wenn der µC vor jeder Zeile ein paar Zyklen rumkramen muss, dann wird das Bild schnell dunkel, weil er länger nachdenkt als das Bild zu zeigen.

Ein paar Waitms vor der nächsten Zeile kehren das Verhältnis dann um, die FPS werden aber weniger.

Am saubersten wirds mit einem Timer-Interrupt, der dem µC Raum für eventulle Berechnungen läßt und für eine feste Framrate sorgt.

Ganz wichtig ist auf jeden Fall das schwarz-schalten der Reihe vor dem einlesen des neuen Bitmusters in die Spalte. Ansonsten bekommt man Geisterbilder.
Auch kann die letzte/erste Zeile unterschiedlich hell sein, wenn der µC nach jedem Volldurchgang noch was anderes macht...

for_ro
15.10.2008, 19:36
Nur habe ich es da leider noch nicht geschafft in die zweite "Datenzeile" zu springen, wie es mit dem deinem Programm so einfach war.


In diesem Programm werden die Data Zeilen mit dem Read Befehl in ein Array geschrieben. Mit Read kannst du nur sequentiell ab dem Restore Label einlesen. Du musst also entweder alles in ein genügend großes Array einlesen (z.B. AR(100)), oder du fügst vor jedem Zeichen ein neues Label ein. Dann muss aber dein Restore immer auf verschiedene Label gehen.
Auch in diesem Programm kannst du die Lookup-Funktion benutzen, um von einer beliebigen Stelle einzulesen.

Für die gleichmäßige Ausleuchtung müsstest du mal mehr von dem Gesamtsystem erzählen. Gibt es z.B. mehrere dieser 5x7 Anzeigen und hast du vielleicht zeitaufwändige Berechnungen vor dem Anzeigen zu machen und so weiter.
Ansonsten gilt das was Stefan sagte. Lass einen Timer laufen, der bei jedem Überlauf eine Spalte weiterspringt und dann die Werte anzeigt. Dann sind alle immer gleichlang. Und mit der Zeit zwischen zwei Überläufen kannst du die Helligkeit steuern.

Gruß

Rolf

Tryan
16.10.2008, 09:06
Danke für eure Hilfe soweit.
Wenn das Programm irgendwann mal fertig ist soll es zwei Aufgaben erfüllen.

1. Frequenz-messen und auf ein LCD anzeigen.
Das ist schon soweit fertig. Habe dafür Timer1 und den ICP genutzt.

2. Taste 1 => zeigt eine 1 bei der Matrix an
Taste 2 => zeigt eine 2 bei der Matrix an
usw.....

Da ich leider mit Arrays noch nicht gearbeitet habe, stehe ich da ganz schön auf dem schlauch ;)
Mit dem Timer ist es eine gut Idee.
Aber wenn nur eine LED in einer Spalte anzeigt wird, wird diese doch heller sein, als z.b. 7 oder?

Wenn dies der Fall ist, wäre es doch besser den Spalten ein Bitmuster zu geben und die Zeilen nach und nach freizuschalten....

Mfg Tryan

P.S. sorry für die ganzen fragen ;)

stefan_Z
16.10.2008, 11:11
Nein, die LEDs einer Spalte sind alle einzeln geschaltet - leuchten also immer gleich hell.

for_ro
16.10.2008, 11:41
2. Taste 1 => zeigt eine 1 bei der Matrix an
Taste 2 => zeigt eine 2 bei der Matrix an
usw.....

Wenn du nur die zwei Zustände anzeigen willst, wäre es dann nicht besser, nur eine LED pro Zustand oder maximal eine 7-Segment Anzeige für beide Ziffern zusammen zu verwenden? Oder hat die Matrix noch eine andere Anzeigefunktion?

Gruß

Rolf

Tryan
16.10.2008, 14:03
Es kommen noch mehr Tasten hinzu und es müssen auch Buchstaben angezeigt werden wie z.b. ein "R" und darum hab ich mit für die 5x7 Matrix entschieden.

Mfg Tryan

Tryan
17.10.2008, 18:33
Hi for_ro,

leider komm ich mit dem Timer Interrupt bei deinem Programm nicht weiter..
Wo genau muss ich dein Programm unterrechen, sodass ich die LEDs gleich hell leuchten?

Mfg Tryan

for_ro
18.10.2008, 01:22
ich denke mir das ungefähr so:

$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

Config Timer0 = Timer , Prescale = 64 'timer läuft alle 16.000.000/64/256=1000.stel Sekunde über, also etwa jede ms
On Timer0 Timer0_isr
Enable Timer0
Enable Interrupts
Spalte = 0
Do
Zeichen = Asc( "2")
Loop

Timer0_isr:
Offset = Zeichen - 49 'sucht Werte für Zeichen "1" ab EEProm Adresse 1
Offset = Offset * 5 'immer 5 Werte pro Zeichen
Incr Spalte
If Spalte = 6 Then
Spalte = 1
End If
Offset = Offset + Spalte
Portd = 0 'zum Verhindern von Geisterbildern
'werte=lookup(offset,zeichen_data)
Readeeprom Werte , Offset
'Print Spalte ; ":" ; Bin(werte) 'nur zum Testen, ACHTUNG!!! langsam
Portc = Werte 'lädt die Werte
Portd.spalte = 1 'Gibt die Spalte frei
Return

'zeichen_data:
$eeprom
Data &B00000000 'Zelle 0 im EEProm nicht benutzen!!!
Data &B11111111 , &B10111101 , &B10000000 , &B10111111 , &B11111111 '1
Data &B10111101 , &B10011110 , &B10101110 , &B10110110 , &B10111001 '2

Musst du mal auf deiner Hardware ausprobieren, im Simulator geht es.

Tryan
18.10.2008, 11:28
Hi for_ro
erstmal danke für deine ganze mühe!
Die Ausleuchtung ist schon deutlich besser geworden, jedoch immer noch nicht gleichmäßig.
Leider erkennt man das auf einem Foto nicht so gut darum habe ich mal Paint an geschmissen um es zu verdeutlichen. (siehe Anhang).

Aber es macht irgendwo auch sinn das das die LEDS in der mitte dunkler sind als die Außen. Der Strom verteilt sich auf die 7 LEDs und links und recht der "1" nur auf eine bzw. auf zwei Leds. Darum leuchten sie ungleichmäßig...

Ist diese Problem überhaupt Software technisch zu lösen? Oder muss das per Hardware gelöst werden ( z.b. über Transistoren?)?

Mfg Tryan

for_ro
18.10.2008, 13:06
Wie hast du die ganze Sache denn angeschlossen?
Schau mal das Jpeg im Anhang, wie ich mir das vorstelle.

Gruß

Rolf

Tryan
18.10.2008, 13:16
Ich habe es so angeschlossen (siehe Anhang).
Ich habe so gedacht das ich jede LED einzeln ansteuere, sodass ich auf eine Treiber stufe verzichten kann...

mfg Tryan

for_ro
18.10.2008, 14:24
Damit hast du doch nicht jede LED einzeln angesteuert!
Das geht auch gar nicht, sonst müsstest du ja 35 Ausgänge benutzen.
Nur jetzt hast du 7 LEDs an einem Port Pin hängen. Das geht nicht. Schau dir mal im Datenblatt die maximalen Ströme in einen PIN an. Dann ist klar, dass die unterschiedlich hell leuchten, wenn in der Spalte nur eine oder alle sieben LEDs an sind.
Wie gesagt, ich würde einen Treiber mit 6 Ein-/Ausgängen davor schalten. Du hast jetzt 20% Duty Cycle, mit dem Treiber kannst du dann auch 40mA in jede LED lassen, sodass die Matrix eine vernünftige Helligkeit hat.
Und dann kann auch deinem µC nichts passieren.

Gruß

Rolf

Tryan
18.10.2008, 15:28
Warum brauch ich 35 Ausgänge? 7 Zeilen-Ausgänge und 5 Spalten- Ausgänge reichen doch.
Ich kann doch nach und nach jede LED einzeln durch an und ausschalten der Ports ansteuern und, wenn dies schnell genug passiert kann ich Zahlen und Buchstaben mir anzeigen lassen.
Ich habe mir schon gedacht das der Port mir dann nicht genug Strom liefern kann, wenn alle gleichzeitig in einer Spalte leuchten. Um dies zu umgehen wollte ich nach und nach die LEDs durchschalten.
Ich hoffe du verstehst was ich meine... ;)
Meinst du, wie es vor hatte, ist Blödsinn und der Programmieraufwand ist zu groß?

Mfg Tryan

for_ro
18.10.2008, 16:47
Klar kannst du die LEDs so wie du sagst einzeln ansteuern. Das ist dann so, wie du anfangs das gemacht hast.
Allerdings bedeutet das, dass jede LED nur max. 1/35 der Zeit an ist, also weniger als 3%. Da wirst du keine vernünftige Helligkeit hinbekommen.

Gruß

Rolf

Tryan
24.10.2008, 16:46
Hi for_ro,
ich hab endlich meine ULN2003 bekommen und natürlich gleich ausprobiert doch leider bleibt jetzt die anzeige dunkel. Ob die Signale nicht durch den ULN2003 durch kommen würden.
Ich habe es so angeschlossen wie am Anhang.
Vielleicht hast du ja eine Idee warum es nicht funktioniert.

Mfg Tryan

for_ro
24.10.2008, 18:20
Hallo Tyran,
schau dir noch mal meine Zeichnung an, wo die Widerstände hingehören. Du musst sehen, dass immer nur die gleiche Anzahl LED zu einem Widerstand gehören, ansonsten bekommst du Helligkeitsunterschiede. Also die Widerstände in die Zeilen.
Außerdem stimmen jetzt die abgespeicherten Bytewerte nicht mit dem Anschluss-Schema überein. Der ULN2003 schaltet dir den Ausgang an Masse wenn am Eingang eine 1 liegt. Die Spalten sind also richtig, es ist immer nur eine auf 1.
Entsprechend müssen die PortB Ausgänge auf 1 gehen, wenn ein Punkt an sein soll. Im Moment stehen sie auf 0. Also musst du die Bytes genau invertieren.

Gruß

Rolf

Tryan
25.10.2008, 11:27
Hi for_ru,
okay hab das Layout verändert (siehe Anhang), kann aber erst am Montag meine "test-Platine" verändern. Ich hoffe nun das es so richtig ist.

Zum Programm Muss ich jetzt also einfach diese Daten:


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

Inventieren?

Mfg TRyan

P.S. Danke für die ganze Hilfe. Ohne dich wäre ich wohl nie soweit gekommen.

Tryan
27.10.2008, 08:27
Hi for_ro,
Also ich habe es mal so aufgebaut wie du es mir gezeigt hast.
Jedoch so bald ich Masse ans ULN2003 anschließe geht die Anzeige aus.
Macht auch Sinn wenn der ULN meinen Eingang auf Masse zieht.
Um eine LED zu leuchten zu bringen muss bei der Zeilen ein 0V anliegen und bei der Spalte 5V (natürlich mit Vorwiderstand). Ich verstehe einfach nicht wie das funktionieren soll, wenn ich auf beiden Seiten der LED 0V anliegen habe....
Und es würde auch nix bringen 5V an den Zeilen anzulegen, weil dann die Leds sperren und nicht leuchten würden..

for_ro
27.10.2008, 19:39
Hallo Tryan,
ich befürchte, wir haben da die ganze Zeit an einander vorbei geredet.
Ich war immer davon ausgegangen, dass die LEDs genau anders herum angeschlossen sind. Jetzt verstehe ich, warum du das so machen wolltest.
Jetzt gibt es zwei Möglichkeiten:
1. Du nimmst den ULN2003 um die Zeilen anzusteuern, und die Spalten hängst du direkt an den µC. Vorteil: du brauchst keinen neuen Treiber. Nachteil: du musst jetzt die 7 Zeilen durchgehen, also nur noch 1/7 der Zeit pro LED Zeile. Abspeichern musst du dann die Spalten Werte, du brauchst 7 Bytes pro Zeichen und nicht mehr 5.
2. Du besorgst dir einen UDN2981. Den setzt du anstelle des ULN2003 ein und brauchst sonst nichts zu ändern.
Sorry für das Missverständnis.

Gruß

Rolf

Besserwessi
27.10.2008, 20:18
Man könnte alterantiv auch eine andere Anzeige besorgen, wo die LEDs genau andersherum drin sind.

Tryan
30.10.2008, 13:48
Hi for_ro,
alles nicht so schlimm, ich habe jetzt die Widerstände in die Zeilen eingebaut und die Ausleuchtung ist jetzt zu 95% optimal. Bin mir jetzt nicht ganz sicher warum, aber ich bin voll zu frieden ;)

Jetzt wollte ich gerne noch die Helligkeit in zwei stufen dimmen.
Am Tag soll die Ausleuchtung 100% sein (bzw. bei mir 95% ;))
und abends soll es nur noch 50% sein, sodass die Anzeige nicht blendet.

Ich hatte mir gedacht, dass ich einfach die Zeit wie lange eine Spalte ansteuere verändern müsste...
Macht man das mit PWM?
Leider sind T0 und T1 schon belegt ist Timer2 auch in der Lage ein PWM-Signal zu erzeugen?

Mfg Tryan

for_ro
30.10.2008, 19:04
Wie willst du denn die Umschaltung realisieren, über die Zeit oder einen Schalter, oder einen Fotowiderstand?

Den Code würde ich so ändern (praktisch Soft-PWM), da du eh schon alles beisammen hast:


$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 Blinken As Byte

Max_display_off = 1 'diesen Wert noch ausprobieren

Config Dcf77 = Pind.2 , 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")
Loop

Timer0_isr:
Offset = Zeichen - 49 'sucht Werte für Zeichen "1" ab EEProm Adresse 1
Offset = Offset * 5 'immer 5 Werte pro Zeichen
If Spalte = 6 Then
Spalte = 1
End If
Offset = Offset + Spalte
Werte = Lookup(offset , Zeichen_data)
Incr Display_off
Portd = 0 'zum Verhindern von Geisterbildern
If Display_off > Max_display_off And Blinken = 0 Then 'damit bleibt das Zeichen immer für eine bestimmte Zeit aus
Display_off = 0
Portc = Werte 'lädt die Werte
Portd.spalte = 1 'Gibt die Spalte frei
Incr Spalte
End If
Return

Sectic:
Toggle Blinken
Return


Zeichen_data:
Data &B11111111 , &B10111101 , &B10000000 , &B10111111 , &B11111111 '1
Data &B10111101 , &B10011110 , &B10101110 , &B10110110 , &B10111001 '2

Wenn Max_display_off auf 1 steht, bedeutet das, dass er immer einen Zyklus aussetzt. Du kannst die Zahl auch erhöhen.
Wenn dir die Schritte zu groß sind, können wir das bestimmt auch noch verändern.
Es kann sein, dass die Anzeige dann anfängt zu flimmern, weil wir praktisch auch die Frequenz runtersetzen. Dann müssen wir den Timer etwas anders laufen lassen.
Probier's mal aus.

Gruß

Rolf

Tryan
31.10.2008, 16:16
Hi for_ro
Ab heute bist du offiziell für mich der Bascom Gott ;)
Die Umschaltung werde ich mit einem Schalter machen.
So die letze frage, dann sollte das Projekt so weit fertig sein, ist es möglich die Zahlen Blinken zu lassen...?
Ich kann es mit nicht vorstellen, da man ja alle gleichzeitig An und wieder Aus machen müsst und das z.b. in einem 0.5 sek takt. Da aber die Ansteuerung immer nach und nach verläuft, würde es nur zu einem flackern kommen oder?

Mfg Tryan

for_ro
31.10.2008, 17:08
Hi for_ro
Ab heute bist du offiziell für mich der Bascom Gott ;)
Ne, ne, das ist ein bisschen viel.



So die letze frage, dann sollte das Projekt so weit fertig sein, ist es möglich die Zahlen Blinken zu lassen...?

Das Blinken habe ich dir grundsätzlich in den Code oben eingebaut. Da du Config DCF77 benutzt, kannst du auch noch Sectic=1 anhängen. Dann wird im Sekundentakt ein Label Sectic angesprungen. Dort schaltest du das Blinken ein und aus.
Aber du musst es jetzt noch irgendwie generell einschalten, also auch wieder über einen externen Schalter oder so.

Gruß

Rolf

Tryan
31.10.2008, 17:49
Ah das ist ja super ich dachte es wäre gar nicht möglich...
Muss ich das "Label Sectic" selbst definieren?
Oder mach ich das mit dem Display_off?
Ich hab es so versucht (siehe Anhang) Jedoch läuft er wie es mir dacht habe, von links nach rechts durch und blinkt nicht..


$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 Byte , Max_blink_an As Byte

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 = 40
If Pina.6 = 0 Then Max_blink_an = 0
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_an
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_an > Max_blink_an Then
Blink_an = 0
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


Mfg Tryan

for_ro
31.10.2008, 18:01
Probier erst mal meinen Code oben aus. Dann können wir weitersehen.

Tryan
31.10.2008, 18:34
Das ist doch dein Code, dass Dimmen funktioniert wunderbar... habe jetzt versucht das Blinken einzufügen..

Mfg Tryan

for_ro
31.10.2008, 21:56
Ne, ich meinte diesen hier von oben:


$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 Blinken As Byte

Max_display_off = 1 'diesen Wert noch ausprobieren

Config Dcf77 = Pind.2 , 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")
Loop

Timer0_isr:
Offset = Zeichen - 49 'sucht Werte für Zeichen "1" ab EEProm Adresse 1
Offset = Offset * 5 'immer 5 Werte pro Zeichen
If Spalte = 6 Then
Spalte = 1
End If
Offset = Offset + Spalte
Werte = Lookup(offset , Zeichen_data)
Incr Display_off
Portd = 0 'zum Verhindern von Geisterbildern
If Display_off > Max_display_off And Blinken = 0 Then 'damit bleibt das Zeichen immer für eine bestimmte Zeit aus
Display_off = 0
Portc = Werte 'lädt die Werte
Portd.spalte = 1 'Gibt die Spalte frei
Incr Spalte
End If
Return

Sectic:
Toggle Blinken
Return


Zeichen_data:
Data &B11111111 , &B10111101 , &B10000000 , &B10111111 , &B11111111 '1
Data &B10111101 , &B10011110 , &B10101110 , &B10110110 , &B10111001 '2

Gruß

Rolf

Tryan
01.11.2008, 09:44
Ah sorry das hatte ich nicht gesehen...

Also das Dimmen steuere ich so an:
If Pina.7 = 1 Then Max_display_off = 4
If Pina.7 = 0 Then Max_display_off = 0

Aber wie steuere ich das Blinken an?
Muss ich zum Sectic springen damit die Anzeige blinkt?
z.b. If Pina.6 = 1 Then "springe zu Sectic" ?

Mfg Tryan

for_ro
01.11.2008, 09:47
Funktioniert denn das Blinken mit meinem Code im 1-Sekundentakt?

Gruß

Rolf

for_ro
01.11.2008, 10:22
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:

$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

Tryan
01.11.2008, 11:38
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

for_ro
01.11.2008, 12:04
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

Tryan
01.11.2008, 15:14
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

Tryan
21.02.2009, 17:09
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

for_ro
21.02.2009, 18:48
Hallo Tryan,
stell doch mal dein aktuelles Programm ein.
Dann ist das bestimmt kein Problem.

Gruß

Rolf

Tryan
22.02.2009, 10:15
Hallo for_ro
also es hat sich nicht viel verändert.


$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

for_ro
22.02.2009, 15:34
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

Tryan
22.02.2009, 15:48
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:



'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

for_ro
23.02.2009, 10:49
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

Tryan
23.02.2009, 11:46
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

for_ro
24.02.2009, 19:33
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?


$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

Tryan
25.02.2009, 15:08
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

for_ro
25.02.2009, 19:15
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



$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

Tryan
26.02.2009, 15:54
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....



$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

for_ro
26.02.2009, 20:05
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

Tryan
26.02.2009, 20:27
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

for_ro
26.02.2009, 21:06
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

Tryan
27.02.2009, 14:36
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

for_ro
27.02.2009, 15:18
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

Tryan
27.02.2009, 17:08
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

for_ro
27.02.2009, 18:25
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

Tryan
27.02.2009, 19:16
Hallo for_ro
Also hier ist das Programm:


$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

for_ro
27.02.2009, 19:34
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


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

Tryan
28.02.2009, 10:37
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

for_ro
28.02.2009, 12:46
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


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

Tryan
01.03.2009, 17:42
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