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
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!
danke, dass du mir jetzt schon (fast) den ganzen Code zusammen "gebastelt" hast. Meiner sieht jetzt so aus:
Code:$regfile = "m16def.dat" $crystal = 16000000 $hwstack = 40 $swstack = 16 $framesize = 32 Config Porta = Output Config Portb = Output Config Portc = Output Config Portd = Output 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 X As Byte , Y As Byte Dim Bildspeicher(11) As Word , Spalte As Byte , Temp As Word , Zaehler As Word 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 5 : Reset Portd.2 Zeilensetzen Set Portd.3 Case 6 : Reset Portd.2 Zeilensetzen Set Portd.3 Case 7 : Reset Portd.2 Zeilensetzen Set Portd.3 Case 8 : 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 Waitus 100 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 Temp = Bildspeicher(spalte) If Temp.1 = 1 Then Set Portd.2 Else Reset Portd.2 If Temp.2 = 1 Then Set Portd.1 Else Reset Portd.1 If Temp.3 = 1 Then Set Portd.0 Else Reset Portd.0 If Temp.4 = 1 Then Set Portc.7 Else Reset Portc.7 If Temp.5 = 1 Then Set Portc.6 Else Reset Portc.6 If Temp.6 = 1 Then Set Portc.5 Else Reset Portc.5 If Temp.7 = 1 Then Set Portc.4 Else Reset Portc.4 If Temp.8 = 1 Then Set Portc.3 Else Reset Portc.3 If Temp.9 = 1 Then Set Portc.2 Else Reset Portc.2 If Temp.10 = 1 Then Set Portc.1 Else Reset Portc.1 If Temp.11 = 1 Then Set Portc.0 Else Reset Portc.0 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
aber es gibt immer noch keine Reaktion auf der Matrix. Sollte ich die Platine von der Matrix vlt. nochmal neu machen und diesmal mit Schieberegistern?
gruß nxtman95
So einfach gehts ja nicht. Du musst schon deine eigenen Pins einsetzen.Code:Case 3 : Reset Portd.1 Zeilensetzen Set Portd.2 Case 4 : Reset Portd.2 Zeilensetzen Set Portd.3 Case 5 : Reset Portd.2 Zeilensetzen Set Portd.3
Bild hier
Atmel’s products are not intended, authorized, or warranted for use
as components in applications intended to support or sustain life!
Och man binn ich doof!![]()
Das hab ich völlig vergessen xD
Danke für den Tipp, sonst wär ich wahrscheinlich nie drauf gekommen...
Aber jetzt, wenn das Muster "alle an" da ist, ist nur die hälfte der Leds angeschaltet...
Edit: Die Zeilen 5,6,7,8,9 und 11 gehen nicht komischerweise... alles ist gut verlötet, also kein kurzer und in der software kann ich auch keinen Fehler entdecken...
Gruß nxtman95
Geändert von nxtman95 (22.10.2011 um 23:26 Uhr)
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!
Hi, danke für die schnelle Antwort,
der Code:
Ich habe es zig mal überprüft, alle Zeilen und Spalten belegungen stimmenCode:$regfile = "m16def.dat" $crystal = 16000000 $hwstack = 40 $swstack = 16 $framesize = 32 Config Porta = Output Config Portb = Output Config Portc = Output Config Portd = Output 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 X As Byte , Y As Byte Dim Bildspeicher(11) As Word , Spalte As Byte , Temp As Word , Zaehler As Word Spalte = 1 Do Select Case Spalte Case 1 : Reset Portb.5 Zeilensetzen Set Portb.4 Case 2 : Reset Portb.4 Zeilensetzen Set Portb.3 Case 3 : Reset Portb.3 Zeilensetzen Set Portb.2 Case 4 : Reset Portb.2 Zeilensetzen Set Portb.1 Case 5 : Reset Portb.1 Zeilensetzen Set Portb.0 Case 6 : Reset Portb.0 Zeilensetzen Set Porta.7 Case 7 : Reset Porta.7 Zeilensetzen Set Porta.6 Case 8 : Reset Porta.6 Zeilensetzen Set Porta.5 Case 9 : Reset Porta.5 Zeilensetzen Set Portb.5 End Select If Spalte < 9 Then Spalte = Spalte + 1 Else Spalte = 1 Waitus 100 Select Case Zaehler Case 1000 : For X = 0 To 8 ' diagonale Set_pixel X , X Next X Case 2000 : For X = 0 To 10 ' waagrecht Set_pixel X , 0 Set_pixel X , 8 Next X Case 3000 : For Y = 0 To 8 ' senkrecht Set_pixel 0 , Y Set_pixel 10 , Y Next X Case 4000 : For X = 1 To 11 ' alle an Bildspeicher(x) = &B11111111111 Next X Case 5000 : For X = 1 To 9 ' Bitmuster Bildspeicher(x) = &B11111111100 Next X Case 6000 : 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 Temp = Bildspeicher(spalte) If Temp.1 = 1 Then Set Portd.2 Else Reset Portd.2 If Temp.2 = 1 Then Set Portd.1 Else Reset Portd.1 If Temp.3 = 1 Then Set Portd.0 Else Reset Portd.0 If Temp.4 = 1 Then Set Portc.7 Else Reset Portc.7 If Temp.5 = 1 Then Set Portc.6 Else Reset Portc.6 If Temp.6 = 1 Then Set Portc.5 Else Reset Portc.5 If Temp.7 = 1 Then Set Portc.4 Else Reset Portc.4 If Temp.8 = 1 Then Set Portc.3 Else Reset Portc.3 If Temp.9 = 1 Then Set Portc.2 Else Reset Portc.2 If Temp.10 = 1 Then Set Portc.1 Else Reset Portc.1 If Temp.11 = 1 Then Set Portc.0 Else Reset Portc.0 End Sub
Hallo
Obwohl die Arrays mit dem Index 1 starten, ein Byte besteht auch bei Bascom aus Bit0 bis Bit7:
Ich bin leider auch ziemlich ratlos. Scheinbar ist nur der Port C betroffen. Das einzige was mir dazu einfällt: JTAG ist nicht ausgeschaltet. Das würde allerdings nur PC2-5 betreffen. Wird an den "fehlerhaften" Pins etwas ausgegeben?Temp = Bildspeicher(spalte)
If Temp.1 = 1 Then Set Portd.2 Else Reset Portd.2
http://www.google.de/search?q=JTAG+i...+ausgeschaltet
Version 2:
(ungetestet)Code:$regfile = "m16def.dat" $crystal = 16000000 $hwstack = 40 $swstack = 16 $framesize = 32 Config Porta = &B11100000 ' PA7-PA5 sind Ausgang (Spalten 7-9) Config Portb = &B00111111 ' PB5-PB0 (Spalten 1-6) Config Portc = &B11111111 ' PC7-PC0 (Zeilen 0-7) Config Portd = &B00000111 ' PA2-PA0 (Zeilen 8-10) 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) ' x von 0 bis 8, y von 0 bis 10 Dim Bildspeicher(11) As Word , Spalte As Byte , Temp As Word , Zaehler As Word Dim X As Byte , Y As Byte Zaehler = 0 Spalte = 1 ' Spalte ist Index im Array und startet deshalb mit 1! Do ' Anfang der späteren ISR ' alle Spalten aus Portb = Pinb And &B11000000 ' PB5-PB0 ausschalten Porta = Pina And &B00011111 ' PA7-PA5 ausschalten ' Zeilenpins der aktuellen Spalte setzen ' Zeile 0 bis 7 ist PC0 bis 7, Zeile 8 bis 10 ist PD0 bis 2 Temp = Bildspeicher(spalte) Portc = Temp And 255 ' Bits 0 bis 7 an PortC.0 bis .7 ausgeben Temp = Temp / 256 ' Bits 8-10 werden Bits 2-0 Portd = Temp And 7 ' Bits 7-3 ausblenden und Bits 2-0 an Port D ausgeben ' aktuelle Spalte einschalten Select Case Spalte Case 1 : Set Portb.4 Case 2 : Set Portb.3 Case 3 : Set Portb.2 Case 4 : Set Portb.1 Case 5 : Set Portb.0 Case 6 : Set Porta.7 Case 7 : Set Porta.6 Case 8 : Set Porta.5 Case 9 : Set Portb.5 End Select If Spalte < 9 Then Spalte = Spalte + 1 Else Spalte = 1 ' Ende der späteren ISR Waitus 100 Select Case Zaehler Case 1000 : For X = 0 To 8 ' diagonale Set_pixel X , X Next X Case 2000 : For X = 0 To 10 ' waagrecht Set_pixel X , 0 Set_pixel X , 8 Next X Case 3000 : For Y = 0 To 8 ' senkrecht Set_pixel 0 , Y Set_pixel 10 , Y Next X Case 4000 : For X = 1 To 11 ' alle an Bildspeicher(x) = &B11111111111 Next X Case 5000 : For X = 1 To 9 ' Bitmuster Bildspeicher(x) = &B11111111100 Next X Case 6000 : 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 '( ' Wird nicht verwendet und soll nur die Zeilenbelegung zeigen. Durch die aufsteigenden Bits kann man die Bytes schneller ausgeben. Sub Zeilensetzen Temp = Bildspeicher(spalte) If Temp.0 = 1 Then Set Portc.0 Else Reset Portc.0 If Temp.1 = 1 Then Set Portc.1 Else Reset Portc.1 If Temp.2 = 1 Then Set Portc.2 Else Reset Portc.2 If Temp.3 = 1 Then Set Portc.3 Else Reset Portc.3 If Temp.4 = 1 Then Set Portc.4 Else Reset Portc.4 If Temp.5 = 1 Then Set Portc.5 Else Reset Portc.5 If Temp.6 = 1 Then Set Portc.6 Else Reset Portc.6 If Temp.7 = 1 Then Set Portc.7 Else Reset Portc.7 If Temp.8 = 1 Then Set Portd.0 Else Reset Portd.0 If Temp.9 = 1 Then Set Portd.1 Else Reset Portd.1 If Temp.10 = 1 Then Set Portd.2 Else Reset Portd.2 End Sub ')
Geändert von radbruch (25.10.2011 um 09:26 Uhr) Grund: Version 2 angehängt
Bild hier
Atmel’s products are not intended, authorized, or warranted for use
as components in applications intended to support or sustain life!
Lesezeichen