Bascom Problem beim Ansteuern einer LED-Matrix

Kokusnuss

Neues Mitglied
09. Jan. 2011
41
0
0
Sprachen
  1. BascomAVR
Hallo zusammen,

ich habe mir eine LED Matrix 8x24 gebaut.
Angesteuert wird sie von 1xAtmega8, 3xCMOS 4094 und 1xCMOS 4017 (für die Zeilen).

Zum Üben habe ich verschiedenste Anzeigemöglichkeiten ausprobiert und bissher auch hinbekommen.
Nun möchte ich gern mit dem "lookup"-Befehl und Datensätzen arbeiten, doch habe da ein kleines Problem. :banghead:

Und zwar wird das erste Zeichen noch komplett richtig angezeigt.
Jedoch wird bei jedem weiteren Zeichen die letzte Zeile des vorherigen Zeichens an die oberste Stelle mitgenommen und der Zeichenaufbau beginnt erst nach dieser Zeile. Dadurch verschiebt sich alles.
Ich steh wohl gerade etwas auf dem Schlauch. Daher möchte ich hier höfflichst um Hilfe bitten.

Hier ersteinmal der Quelltext:
Code:
'-------------------------
'  Variabelndeklaration
'-------------------------
Dim Zeile As Byte
Dim Zeichen As Byte

Dim I As Byte

'############################
'       Hauptprogramm
'############################

Zeile = 0

Reset_4017 = 1
Clock_4017 = 1

I = 0
'-------------------------
'       Do-Schleife
'-------------------------
Do

Zeichen = Lookup(i , Test)

Strobe_4094 = 0

Shiftout Data_4094 , Clock_4094 , Zeichen , 0 , 8

Strobe_4094 = 1

Incr I
If I = 8 Then
I = 0
End If

Incr Zeile
Clock_4017 = 0
Clock_4017 = 1

If Zeile = 9 Then
Zeile = 1
Reset_4017 = 1
Reset_4017 = 0
End If

Waitms 20

Loop

End

$data
Test:
Data &B110000 , &B110000 , &B110000 , &B110000 , &B110000 , &B110000 , &B111111 , &B111111

Das ist wiegesagt erstmal nur zum Üben um die Ansteuerung besser zu verstehen. :to_pick_ones_nose:

Vielen Dank schonmal im Vorraus

Liebe Grüße
Kokusnuss
 
Hallo Kokosnuss!

Willkommen im AVR-Praxis Forum! :ciao:

Auf Grund der späten/frühen Stunde habe ich nur mal eben schnell drüber geschaut und würde sagen....
DATA-Zeilen beginnen bei NULL und du setzt auch hier....
Code:
Incr I
If I = 8 Then
[COLOR="#FF0000"]I = 0[/COLOR]
End If
...dein I auf NULL zurück.

Du zählst aber bis ACHT und nicht bis SIEBEN. :wink:

Von NULL bis ACHT sind eben 9... und nicht 8! :cool:


Grüße,
Cassio
 
Hallo Cassio,

der Index I für die Lookup-Tabelle hat doch immer nur die Werte 0 .. 7. Der Fehler muss also woanders liegen.

(Kann aber auch sein, dass es noch zu früh für mich ist ;))

Ach, es kann sein, dass es an folgendem liegt:

In die do-loop Schleife geht Kokosnuss mit Zeile=0 rein, in der Schleife hat Zeile immer die Werte 1..8,
bei Zeile=1 führt er Reset_4017 (1-0) aus. Das passt so sicher nicht. Zeile muss anders initialisiert werden.

@Kokosnuss: Willkommen im AVR-PRAXiS Forum! :ciao:
 
Moin Dirk!

Ja, natürlich..... hast Recht!
War wohl gestern doch schon etwas spät. :wink:

Ist ja gar keine FOR-NEXT Schleife....


Gruß,
Cassio
 
Hallo zusammen.:wavey:
Vielen dank für die herzlichen Willkommensgrüße und die superschnelle Hilfe.

Also ich habe es jetzt so gelöst um dreimal das gleiche Zeichen anzeigen zu lassen:
Code:
Do

For Zeile = 0 To 7
Strobe_4094 = 0

Zeichen = Lookup(zeile , Test)

Shiftout Data_4094 , Clock_4094 , Zeichen , 0 , 8
Shiftout Data_4094 , Clock_4094 , Zeichen , 0 , 8
Shiftout Data_4094 , Clock_4094 , Zeichen , 0 , 8

Strobe_4094 = 1

Clock_4017 = 0
Clock_4017 = 1
If Zeile = 0 Then
Reset_4017 = 1
Reset_4017 = 0
End If
Waitms 20
Next Zeile

Loop

End

So ist es auch einfacher.^^ Vielen Dank nochmal für eure super freundliche Hilfe.:tee:
Jetzt kann ich mich weiter ran tasten und mehre Zeichen darstellen, sowie mit Strings und overlay-Variabeln arbeiten.

Bis später :ciao:

Liebe Grüße
Kokusnuss
 
Hallo nochmal,

ich habe nochmal eine Frage?
Kann man Byte-Datensätze auf ihre länge bestimmen? D.h. statt 8 Bit pro Zeichen und pro Zeile, sagen wir nur soviel Bit wie das Zeichen breit ist.
So dass das "I" nur 4 Bit lang ist und das "W" beispielsweise 8 Bit lang. Gibt es die möglichkeit soetwas zu realisieren? Und wenn ja wie? :D

Vielen Dank schonmal im Vorraus

Liebe Grüße
Kokusnuss
 
Hi,

ich habe nochmal eine Frage?
Kann man Byte-Datensätze auf ihre länge bestimmen? D.h. statt 8 Bit pro Zeichen und pro Zeile, sagen wir nur soviel Bit wie das Zeichen breit ist.
So dass das "I" nur 4 Bit lang ist und das "W" beispielsweise 8 Bit lang. Gibt es die möglichkeit soetwas zu realisieren? Und wenn ja wie? :D
Hä ? :confused:
Wie meinst du das ? Bei ASCII-Zeichen nur die Bits verwenden ab dem ersten benutzten 1-Bit ?? oder was ?
Irgendwie steh ich auf dem Schlauch.

Gruß
Dino
 
Wenn ich ein "I" darstellen möchte steht im Byte-Datensatz
Code:
 Data &B00000111 , &B00000010 , &B00000010 , &B00000010 , &B00000010 , &B00000010 , &B00000010 , &B00000111
In diesem Fall benötigt man doch eigentlich nur max. 3 Bits zur Darstellung des "I" für jede Zeile. Im Byte-Datensatz hätte ich gern die Nullen unterdrückt, damit ich die Buchstaben nacheinander darstellen kann und so immer nnur 1 Bit (also eine LED) leer lasse bis das nächste Zeichen kommt.
Ich dachte man könnte es so machen
Code:
 Data &B111 , &B010 , &B010 , &B010 , &B010 , &B010 , &B010 , &B111
aber Bascom macht den Rest automatisch in der Darstellung mit Nullen voll.
 
Hallo,

Ich glaube er meint das die Bitbreit der einzelnen Zeichen unterschiedlich sein sollen.
Das heißt, dass ein I weniger Breit ist als ein W.
So wie der Zeichensatz Arial: -> IIII -> WWWW
Buchstaben die eine Fixe Bitbreite benutzen benötigen pro Zeichen immer die gleiche Bit-Anzahl.
So wie der Zeichensatz Courier New: -> IIII -> WWWW

LG
TrueNEO

War wieder mal zu langsam. :D
 
Ja genau ich möchte das I weniger breit darstellen als das W. Das ist ja auch kein Problem.
ABER wie schaffe ich es, dass die beiden Buchstaben mit je der Bit-Länge von 8 mit nur einer Leerspalte(Leerzeichen) dargestellt werden und nicht noch zusätzlich die anderen Nullen die das I bei der Darstellung mit Arial ja nun leider hat?

LG
 
Hallo !

Ich gehe auch davon aus, wie Neo es schon geschrieben hat.....

Er möchte keine feste Zeichenbreite für jeden Buchstaben von z.B. 5x7 oder 8x8...... sondern eher eine TTF.
Die Bits für jeden Buchstaben in den Data-Zeilen einzeln anzulegen ist ja relativ einfach,
aber er muss dann für kürzere Buchstaben (als das 8x8) auch getrennte Zählungen einsetzen.
Die Standard For-Next Schleife, um die zugehörige Anzahl Datensätze auszulesen wird da nicht funktionieren.
Die Zählgröße wäre dann nämlich je nach Buchstabe unterschiedlich.

Interessante Aufgabe.... habe ich noch nicht drüber nachgedacht.

Grüße,
Cassio
 
Hi,

aha ... jetzt wird es klarer.

Also da würden sich zwei Möglichkeiten ergeben.
Bei beiden müssen die Daten rechts- oder linksbündig in den Pixeldaten angeordnet sein.

1. Man benutzt ein weiteres Byte pro Zeichen in dem drinsteht wieviele Pixel das Zeichen breit ist um nur diese Anzahl von Pixel zB in die Schieberegister für eine Matrixanzeige hinzeinzuschieben. Man benötigt dafür aber ein extra Byte pro Zeichen. Also mehr Speicherverbrauch für die Musterdaten.

2. Man fängt an zu schieben und sieht nach ob ganze Spalten mit 0-Bytes erscheinen. Bei der 2ten Spalte mit 0-Bytes schiebt man nicht rein sondern stopt. Ebenfalls stoppen tut man wenn die maximal 8 Pixel reingeschoben sind. Das hat den Nachteil dasn man bei diesen 2 Leerspalten eventuell Probleme mit Sonderzeichen oder Mustern bekommt wo mittendrin 2 Leerspalten existieren da man 2 hintereinanderliegende Leerspalten ja sozusagen als Endekennung der Pixeldaten benutzt hat.

So könnteman es machen. Einen der beiden Tode muß man sterben. Entweder mehr Speicherverbrauch oder Probleme mit speziellen Sonderzeichen.

Gruß
Dino
 
Hallo,

Wenn ein kompletter Zeichensatz im Speicher abgelegt und auf den per Index zugegriffen werden soll,
würde ich die 8 mal x Bits/Pixel erweitern auf 8 mal x+1.
In der zusätzlichen Zeile werden dann die auszugebenden Spalten durch setzen der einzelnen Bits gekennzeichnet.
Damit kann sehr einfach ein Zeichen im Speicher adressiert werden und das erste Byte legt die auszugebenden
Spalten fest.

Z.B.:

00001111 -> Die mit 1 gekennzeichneten Spalten werden ausgegeben.
00000111 -> Bitmaske für ein I
00000010
00000010
00000010
00000010
00000010
00000111
00000000


Alles was Rot dargestellt ist wird ausgegeben.
Ich hoffe es ist verständlich.

LG
TrueNEO
 
In der zusätzlichen Zeile werden dann die auszugebenden Spalten durch setzen der einzelnen Bits gekennzeichnet.
Das wäre dann sozusagen Version 1b.
Man hat kein Byte mit der Anzahl auszugebender Bits sondern ein Byte mit Markierungsbits was auszugeben ist. So geht es natürlich auch.
Wenn man dann in nem Editor die Pixeldaten ansieht ist es dadurch besser ersichtlich was auszugeben ist. Hat dann mit den gesetzten Bits einen Vorteil (Übersicht).

Viele Wege führen nach Rom ;)
 
Ok Danke für die super guten Vorschläge,

da ich nicht ganz so erfahren in der Programmierung mit Bascom bin, weiß ich leider nicht wie ich wie man diese guten Ideeen im Programm einbindet. (von den Befehlen her)
Also das Darstellen von den im Datensatz befindlichen Daten kriege ich hin, doch dass man ein Muster vorgibt oder die Anzahl der Bits, wüsste ich nicht wie ich es programmieren soll???

LG
 
Nagut. Ich würde es so realisieren:
Für Ascii-Zahl x,y,z sind 4 Bits, a,b,c sind 5 Bits usw
 
Ich denke ich werde morgen folgendes probieren:

shiftout Data_4094 , Clock_4094 , Zeichen , 0 , i
Für ASCII-Zahl x,y,z --> i =4
Für ASCII-Zahl a,b,c --> i =5

somit müsste ich doch eigentlich auch sagen können, dass nur 4 oder 5 Bits reingeschoben werden sollen.
Oder bin ich da komplett auf dem falschen Dampfer?

LG
 
x,y,z sind einfach nur Beispiele für irgendwelche Zahlen die denn dort stehen könnten.
Sprich ASCII-Zahl =65 für "A" --> 7 Bits breit oder so.^^
Sorry, dass ich immer so rätselhaft schreibe^^
 
Hallo zusammen,:)

ich habe es jetzt hinbekommen den String so darzustellen, ohne dass Lücken entsehen. (Abstände zwischen den Buchstaben überall gleich)
Leider konnte ich den Gedanken von letztens
(shiftout Data_4094 , Clock_4094 , Zeichen , 0 , i)
nicht umsetzen, da Bascom auf die Variable "i" nicht reagiert?! :confused: ("i" habe ich als Byte deklariert)

Und egal welchen Wert "i" hat, der ausgegebene Datensatz beträgt immer das ganze Byte.
Hab ich da etwas falsch gemacht oder irgendwelche Denkfehler, weshalb meine Überlegung nicht funktioniert?:confused:

Ich würde mich sehr über eure Hilfe freuen. :)

Liebe Grüße
Kokusnuss
 

Über uns

  • Makerconnect ist ein Forum, welches wir ausschließlich für einen Gedankenaustausch und als Diskussionsplattform für Interessierte bereitstellen, welche sich privat, durch das Studium oder beruflich mit Mikrocontroller- und Kleinstrechnersystemen beschäftigen wollen oder müssen ;-)
  • Dirk
  • Du bist noch kein Mitglied in unserer freundlichen Community? Werde Teil von uns und registriere dich in unserem Forum.
  •  Registriere dich

User Menu

 Kaffeezeit

  • Wir arbeiten hart daran sicherzustellen, dass unser Forum permanent online und schnell erreichbar ist, unsere Forensoftware auf dem aktuellsten Stand ist und der Server regelmäßig gewartet wird. Auch die Themen Datensicherheit und Datenschutz sind uns wichtig und hier sind wir auch ständig aktiv. Alles in allem, sorgen wir uns darum, dass alles Drumherum stimmt :-)

    Dir gefällt das Forum und unsere Arbeit und du möchtest uns unterstützen? Unterstütze uns durch deine Premium-Mitgliedschaft!
    Wir freuen uns auch über eine Spende für unsere Kaffeekasse :-)
    Vielen Dank! :ciao:


     Spende uns! (Paypal)