Das ist ne gute Idee
Nur, wie lese ich das aus? Mit einer For ... next schleife?
und, soll ich den Bildspeicher dann in ne externe Datei verlegen, sprich eine Textdatei?
Gruß und danke für die gute Antwort von nxtman95
Das ist ne gute Idee
Nur, wie lese ich das aus? Mit einer For ... next schleife?
und, soll ich den Bildspeicher dann in ne externe Datei verlegen, sprich eine Textdatei?
Gruß und danke für die gute Antwort von nxtman95
@radbruch:
Kann man die LED-Matrix aus dem Video irgendwo kaufen oder hast du dir die Platine selber gelayoutet und ätzen/bestücken lassen?
MfG
Torrentula
MfG Torrentula
Hallo
Das ist die PingPong-Platine vom C. 120 LEDs mit einem 8MHz-Mega8:
http://www.conrad.de/ce/de/product/902766/
https://www.roboternetz.de/community...mprogrammieren
Zum Bildspeicher: Das Wort klingt zwar gewaltig, aber es handelt sich nur um neun 16-Bit-Werte die selbstverständlich im Ram des µC verwaltet werden. Der Aufbau eines Einzelbildes läuft etwa so: Alle Spalten aus, Zeilenbits für erste Spalte setzen, erste Spalte einschalten, kurz warten, alle Spalten aus, Zeilenbits für zweite Spalte setzen, zweite Spalte ein, kurz warten (später mal ist das der Abstand zwischen den ISR-Aufrufen), alle Spalten aus, ... , letzte Spalte an, kurz warten, letzte Spalte aus, Zeilenbits für erste Spalte setzen,...usw. immer schneller bis das Bild nicht mehr flimmert.
Für den Anfang, um es mit Interrupts nicht ünnötig kompliziert zu machen, kann man das in der Hauptschleife programmieren:
(Kompilierbar, aber ungetestet und eher symbolisch gedacht)Code:$regfile = "m16def.dat" $crystal = 16000000 $hwstack = 40 $swstack = 16 $framesize = 32 Declare Sub Zeilensetzen Dim Bildspeicher(11) As Word , Spalte As Byte , Temp As Word Bildspeicher(1) = &B01100001111 Bildspeicher(2) = &B01100001111 Bildspeicher(3) = &B10000001111 Bildspeicher(4) = &B10000001111 Bildspeicher(5) = &B01111110000 Bildspeicher(6) = &B01111110000 Bildspeicher(7) = &B10011110000 Bildspeicher(8) = &B10011110000 Bildspeicher(9) = &B01100001111 Bildspeicher(10) = &B01100001111 Bildspeicher(11) = &B10000001111 Spalte = 1 Do Select Case Spalte Case 1 : Reset Portc.7 Zeilensetzen Set Portd.0 Case 2 : Reset Portd.0 Zeilensetzen Set Portd.1 Case 3 : Reset Portd.1 Zeilensetzen Set Portd.2 Case 4 : Reset Portd.2 Zeilensetzen Set Portd.3 '... Case 9 : Reset Portd.7 Zeilensetzen Set Portc.7 End Select If Spalte < 9 Then Spalte = Spalte + 1 Else Spalte = 1 Waitms 10 'hier kann man dann das Bild zusammenbasteln Loop End Sub Zeilensetzen Temp = Bildspeicher(spalte) If temp.0 = 1 Then Set Porta.0 Else Reset Porta.0 If temp.1 = 1 Then Set Porta.1 Else Reset Porta.1 If temp.2 = 1 Then Set Porta.2 Else Reset Porta.2 If temp.3 = 1 Then Set Porta.3 Else Reset Porta.3 If temp.4 = 1 Then Set Portb.4 Else Reset Portb.4 If temp.5 = 1 Then Set Portb.5 Else Reset Portb.5 '... If temp.10 = 1 Then Set Portc.1 Else Reset Portc.1 If temp.11 = 1 Then Set Portc.2 Else Reset Portc.2 End Sub 'Wenn die Pins aufeinanderfolgen ist es deutlich schlanker: 'Sub Zeilensetzen 'Porta = Bildspeicher(spalte) And 255 'Portb = Bildspeicher(spalte) / 255 And 7 'End Sub
Gruß
mic
Geändert von radbruch (22.10.2011 um 13:24 Uhr) Grund: Kleine Optimierung eingebaut
Bild hier
Atmel’s products are not intended, authorized, or warranted for use
as components in applications intended to support or sustain life!
Danke für den Code,
und wie kann ich jetzt das "Bild" anzeigen lassen, müssen die Ports nicht noch als Output konfiguriert werden?
gruß nxtman95
Klar müssen sie das. Da ich aber deine Pinbelegung nicht kenne, und es ja eigentlich deine Matrix ist, habe ich dir auch was zum Tippen übriggelassen....müssen die Ports nicht noch als Output konfiguriert werden
Bild hier
Atmel’s products are not intended, authorized, or warranted for use
as components in applications intended to support or sustain life!
Ich verstehe jetzt immer noch nicht, wie ich jetzt an dieser Stelle
das Bild, oder die Bilder zusammensetzen soll o.OCode:'hier kann man dann das Bild zusammenbasteln
Der Bildspeicher ist die Schnittstelle zwischen deinem Programm und der Matrix. Sein Inhalt wird, normalerweise im Hintergrund per Interrupt, immer an die Matrix ausgegeben. Um die Anzeige zu ändern muss man deshalb den Bildspeicher ändern. Jedes Bit im Array Bildspeicher() repräsentiert eine LED in der Matrix. Wenn das Bit zum Zeitpunkt der Spaltenabfrage gesetzt (=high) ist leuchtet die LED nicht gesetzt (=low) bedeutet LED ist aus.
Jedes Bit im Bildspeicher steht für ein Pixel im darzustellenden Bild. Wie ändert man ein bestimmtes Bit im Bildspeicher? Dafür schreibt man sich kleine Funktionen die gezielt einen einzelnen Pixel ändern. Zum Setzen und Löschen könnten die Funktionen etwa so aussehen:
(ungetestet)Code:Declare Sub Zeilensetzen Declare Sub Set_pixel(byval X As Byte , Byval Y As Byte) ' Nullpunkt ist oben links als 0,0 Declare Sub Reset_pixel(byval X As Byte , Byval Y As Byte) Dim Bildspeicher(11) As Word , Spalte As Byte Dim X As Byte , Y As Byte Dim Temp As Word , Zaehler As Word ' ... If Spalte < 9 Then Spalte = Spalte + 1 Else Spalte = 1 Waitus 100 ' 10000*100µs ergeben eine Sekunde 'hier kann man dann das Bild zusammenbasteln Select Case Zaehler Case 10000 : For X = 0 To 8 ' diagonale Set_pixel X , X Next X Case 20000 : For X = 0 To 10 ' waagrecht Set_pixel X , 0 Set_pixel X , 8 Next X Case 30000 : For Y = 0 To 8 ' senkrecht Set_pixel 0 , Y Set_pixel 10 , Y Next X Case 40000 : For X = 1 To 9 ' alle an Bildspeicher(x) = 255 Next X Case 50000 : For X = 1 To 9 ' Bitmuster Bildspeicher(x) = &B10101010101 Next X Case 60000 : For X = 1 To 9 ' alle aus Bildspeicher(x) = 0 Next X Zaehler = 0 End Select Zaehler = Zaehler + 1 Loop End Sub Set_pixel(byval x As Byte , byval Y As Byte) Bildspeicher(x + 1).y = 1 ' Bascom startet Arrays mit 1 End Sub Sub Reset_pixel(byval X As Byte , Byval Y As Byte) Bildspeicher(x + 1).y = 0 End Sub Sub Zeilensetzen
Gruß
mic
Geändert von radbruch (22.10.2011 um 17:15 Uhr) Grund: Programmkopf vergessen
Bild hier
Atmel’s products are not intended, authorized, or warranted for use
as components in applications intended to support or sustain life!
radbruch, ich verzweifele an dem Ding. Ich hab schon alles mögliche durchgecheckt die Platine, den Code. Ich binn halt noch nicht so gut, was das programmieren betrifft...
Durchaus möglich, dass mein Code nicht funktioniert. Wie ist deine Matrix jetzt angeschlossen? Wie sieht das komplette Programm aus? Wir sollten uns Spalte für Spalte und Zeile für Zeile vorantasten.
Bild hier
Atmel’s products are not intended, authorized, or warranted for use
as components in applications intended to support or sustain life!
Lesezeichen