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...
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....
Kennt ihr vielleicht eine Möglichkeit das Programm effektiver zu schreiben?Code:Do '--------------------------------- '"1" Anzeigen '--------------------------------- Portb = &B11111101 Portd = &B00000010 Waitus Zeit Portb = &B11111110 Portd = &B00000100 Waitus Zeit Portb = &B11111101 Portd = &B00000100 Waitus Zeit Portb = &B11111011 Portd = &B00000100 Waitus Zeit Portb = &B11110111 Portd = &B00000100 Waitus Zeit Portb = &B11101111 Portd = &B00000100 Waitus Zeit Portb = &B11011111 Portd = &B00000100 Waitus Zeit Portb = &B10111111 Portd = &B00000100 Waitus Zeit Portb = &B10111111 Portd = &B00000010 Waitus Zeit Portb = &B10111111 Portd = &B00001000 Waitus Zeit Portb = &B11111111 Portd = &B00000000 Loop
Vielen Dank für eure Hilfe
mfg Tryan
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...
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:
GrußCode:Dim Offset As Word Dim Zeichen As String * 1 Dim Spalte As Byte Dim Werte As Byte Declare Sub Out_zeichen(byval Z As String) Do Zeichen = "1" Call Out_zeichen(zeichen) Loop Sub Out_zeichen(byval Z As String) Offset = Asc(zeichen) - 49 'sucht Werte für Zeichen "1" ab EEProm Adresse 1 Offset = Offset * 5 'immer 5 Werte pro Zeichen Spalte = 1 Portb = &B11111111 Do Portd = 0 'zum Verhindern von Geisterbildern Incr Offset 'geht die 5 Werte durch Readeeprom Werte, Offset Portb = Werte 'lädt die Werte Portd = Spalte 'Gibt die Spalte frei Print Bin(werte) 'zum Testen Shift Spalte , Left 'erhöht auf die nächste Spalte Loop Until Spalte = 32 'stoppt nach der 5. Spalte End Sub $eeprom Data &B00000000 'Zelle 0 im EEProm nicht benutzen!!! Data &B11111111 , &B10111101 , &B10000000 , &B10111111 , &B11111111 '1 Data &B10111101 , &B10011110 , &B10101110 , &B10110110 , &B10111001 '2
Rolf
Hi for_ro
danke für deine Hilfe.
Ich habe dein Programm getestet leider zeigt die Anzeige nix an.
Um ein Fehler aus meiner Seite auszuschießen könntest du mir dein Programm ein wenig näher erklären.
Ich verstehe es soweit das die Spalten mit PortD nach und nach geschaltet werden.
1Spalte=>2Splate=>3Spalte=>4Spalte=>5Spalte=>1Spal te usw...
Wenn die erste 1 Spalte "ausgewählt" ist, wird der erste Wert von dem EEPROM an PortB ausgeben
Wenn die erste 2 Spalte "ausgewählt" ist, wird der zweite Wert von dem EEPROM an PortB ausgeben
usw..
Stimmt das soweit?
Aber warum bauche ich nur 5 Werte um 7 Zeilen mit ProtB anzusteuern? Es müsten doch sieben sein oder?
Mfg Tryan
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
Hi, also ich hab dein teil genommen und hab einfach meinen µC ausgewählt und die Ports konfiguriert.
Hab ich irgendwas vergessen?Code:$regfile = "m16DEF.DAT" $crystal = 16000000 Config Porta = Input Config Portb = Output Config Portc = Output Config Portd = Output Dim Offset As Word Dim Zeichen As String * 1 Dim Spalte As Byte Dim Werte As Byte Declare Sub Out_zeichen(byval Z As String) Do Zeichen = "1" Call Out_zeichen(zeichen) Loop Sub Out_zeichen(byval Z As String) Offset = Asc(zeichen) - 49 'sucht Werte für Zeichen "1" ab EEProm Adresse 1 Offset = Offset * 5 'immer 5 Werte pro Zeichen Spalte = 1 Portb = &B11111111 Do Portd = 0 'zum Verhindern von Geisterbildern Incr Offset 'geht die 5 Werte durch Readeeprom Werte , Offset Portb = Werte 'lädt die Werte Portd = Spalte 'Gibt die Spalte frei Print Bin(werte) 'zum Testen Shift Spalte , Left 'erhöht auf die nächste Spalte Loop Until Spalte = 32 'stoppt nach der 5. Spalte End Sub $eeprom Data &B00000000 'Zelle 0 im EEProm nicht benutzen!!! Data &B11111111 , &B10111101 , &B10000000 , &B10111111 , &B11111111 '1 Data &B10111101 , &B10011110 , &B10101110 , &B10110110 , &B10111001 '2
Mfg Tryan
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
Hi for_ro
Ich habe das Zeichen durch das Z verändern, jedoch gab es keine Änderung. Anzeige bleibt leer
In der Simulation scheint das Programm auch richtig zu laufen, aber nur wenn ich F8 drücke...
Ich programmiere den ATmega16 mit Ponyprog2000 und da kann ich auch den EEPROM separat mit der Bascom erstellten *.eep Datei beschreiben. Jedoch wenn ich den EEPROM vom ATmega16 auslese ist der immer leer. Muss man die "DATA" unbedingt ins EEPROM schreiben?
Code:$regfile = "m16DEF.DAT" $crystal = 16000000 Config Porta = Output Config Portb = Output Config Portc = Output 'Zeilen Config Portd = Output 'Spalten Dim Offset As Word Dim Zeichen As String * 1 Dim Spalte As Byte Dim Werte As Byte Declare Sub Out_zeichen(byval Z As String) Porta = &B11111111 Do Zeichen = "3" Call Out_zeichen(zeichen) Loop Sub Out_zeichen(byval Z As String) Offset = Asc(z) - 49 'sucht Werte für Zeichen "1" ab EEProm Adresse 1 Offset = Offset * 5 'immer 5 Werte pro Zeichen Spalte = 1 Portc = &B11111111 Do Portd = 0 'zum Verhindern von Geisterbildern Incr Offset 'geht die 5 Werte durch Readeeprom Werte , Offset Portc = Werte 'lädt die Werte Portd = Spalte 'Gibt die Spalte frei Print Bin(werte) 'zum Testen Shift Spalte , Left 'erhöht auf die nächste Spalte Loop Until Spalte = 32 'stoppt nach der 5. Spalte End Sub $eeprom Data &B00000000 'Zelle 0 im EEProm nicht benutzen!!! Data &B11111111 , &B10111101 , &B10000000 , &B10111111 , &B11111111 '1 Data &B10111101 , &B10011110 , &B10101110 , &B10110110 , &B10111001 '2 Data &B11111111 , &B00000000 , &B11111111 , &B00000000 , &B11111111 '3 TEST
Brauchst du nur so abändern, dann sind die Zeichen im Flash.
Code:$regfile = "m16DEF.DAT" $crystal = 16000000 Config Porta = Output Config Portb = Output Config Portc = Output 'Zeilen Config Portd = Output 'Spalten Dim Offset As Word Dim Zeichen As String * 1 Dim Spalte As Byte Dim Werte As Byte Declare Sub Out_zeichen(byval Z As String) Porta = &B11111111 Do Zeichen = "3" Call Out_zeichen(zeichen) Loop End Sub Out_zeichen(byval Z As String) Offset = Asc(z) - 49 'sucht Werte für Zeichen "1" ab EEProm Adresse 1 Offset = Offset * 5 'immer 5 Werte pro Zeichen Spalte = 1 Portc = &B11111111 Do Portd = 0 'zum Verhindern von Geisterbildern Incr Offset 'geht die 5 Werte durch Werte=Lookup(Offset,Zeichen_data) 'Readeeprom Werte , Offset Portc = Werte 'lädt die Werte Portd = Spalte 'Gibt die Spalte frei Print Bin(werte) 'zum Testen Shift Spalte , Left 'erhöht auf die nächste Spalte Loop Until Spalte = 32 'stoppt nach der 5. Spalte End Sub '$eeprom Zeichen_data: Data &B00000000 'Zelle 0 im EEProm nicht benutzen!!! Data &B11111111 , &B10111101 , &B10000000 , &B10111111 , &B11111111 '1 Data &B10111101 , &B10011110 , &B10101110 , &B10110110 , &B10111001 '2 Data &B11111111 , &B00000000 , &B11111111 , &B00000000 , &B11111111 '3 TEST
Hi for_ro
Von der Grundfunktion, funktionier das Programm nun
Leider ist die gleichmäßige Ausleuchtung sehr schlecht...Code:$regfile = "m16DEF.DAT" $crystal = 16000000 Config Porta = Output Config Portb = Output Config Portc = Output 'Zeilen Config Portd = Input 'Spalten Dim Offset As Word Dim Zeichen As String * 1 Dim Spalte As Byte Dim Werte As Byte Declare Sub Out_zeichen(byval Z As String) Do Zeichen = "1" Call Out_zeichen(zeichen) Loop End Sub Out_zeichen(byval Z As String) Offset = Asc(z) - 49 'sucht Werte für Zeichen "1" Offset = Offset * 5 'immer 5 Werte pro Zeichen Spalte = 1 Portc = &B11111111 Do Porta = 0 'zum Verhindern von Geisterbildern Incr Offset 'geht die 5 Werte durch Werte = Lookup(offset , Zeichen_data) Portc = Werte 'lädt die Werte Porta = Spalte 'Gibt die Spalte frei Waitms 5 Shift Spalte , Left 'erhöht auf die nächste Spalte Loop Until Spalte = 32 'stoppt nach der 5. Spalte End Sub Zeichen_data: Data &B00000000 'Zelle 0 im EEProm nicht benutzen!!! Data &B11111111 , &B10111101 , &B10000000 , &B10111111 , &B11111111 '1 Data &B10111101 , &B10011110 , &B10101110 , &B10110110 , &B10111001 '2 Data &B00000000 , &B00000000 , &B00000000 , &B00000000 , &B00000000 '3 TEST
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
Nur habe ich es da leider noch nicht geschafft in die zweite "Datenzeile" zu springen, wie es mit dem deinem Programm so einfach war.Code:$regfile = "m16DEF.DAT" $crystal = 16000000 $baud = 19200 Dim A(7) As Byte Dim Leds As Byte Dim I As Byte Dim J As Byte Config Porta = Output Porta = 0 Config Portc = Output Portc = &HFF Restore Dotmatrix For I = 1 To 8 Read A(i) Next Do For I = 0 To 6 Portc = &HFF Reset Portc.i J = I + 1 Waitus 750 Porta = A(j) Next Loop End Dotmatrix: Data &B11100110 , &B11100100 , &B11100100 , &B11100100 , &B11100100 , &B11101110 , &B11100100 Data &B11110001 , &B11100000 , &B11100000 , &B11100000 , &B11100000 , &B11101110 , &B11101110
Mfg Tryan[code]
Lesezeichen