Mehrere Muster speichern und abrufen

  • Hi C-F600,


    also der Quelltext lässt sich doch wohl gar nicht compillieren, oder?
    Da fehlt was. Hast Du den Anfang unterschlagen?
    Poste mal bitte den kompletten Quelltext.



    In der ersten Zeile deklarierst Du ein Array namens Buffer mit12 Elementen vom Typ Word.
    Das macht mich dreifach stutzig.
    1) Wieso Word, wenn Du nur Byte brauchst? Ein Word besteht aus 16 Bits.
    2) Wieso 12 Elemente?
    3) Wieso überhaupt massig RAM verschwenden, für ein Buffer-Array? Du kopierst die Daten aus dem Data-Bereich in ein Array. Wozu?
    Was würdest Du denn machen, wenn Du 400 Data-Zeilen hättest?
    Etwa ein Array mit 400 Einträgen deklarieren?
    Es reicht doch völlig, eine einzige Byte-Variable mit dem jeweiligen Eintrag aus dem Data-Bereich zu belegen.


    Ich verstehe auch nicht den Sinn der beiden ineinander verschachtelten For/Next-Schleifen.
    Am Ende beider Schleifen ist der Wert der Variable i jedenfalls immer 9. Dann rufst Du die Prozedur Anzeige auf.
    Darin wiederum, gibst Du den Inhalt von Buffer(i) an die Portpins aus. Da die Variable i zu dem Zeitpunkt immer 9 ist, gibst Du also jedesmal Buffer(9) aus ...


    Dein Gusub Anzeige gehört doch wohl eher in die innere der For/Next-Schleifen, statt hinter beide, oder?
    Wenn Du Gosub Anzeige hinter die gegenwärtige Zeile 24 setzt, kannst Du Dir das mit dem Buffer-Array jedenfalls sparen. Dann deklariere in erster Zeile einfach
    Dim Buffer as Byte
    Und dann wird an den Ausgängen auch was tanzen.
    (Trotzdem verstehe ich die zwei ineinander verschachtelten For/Next-Schleifen nicht ganz)



    Etc. etc. etc.
    Korrigiere das alles mal, dann sehen wir weiter.

  • Hi also,


    Ja ich habe das ganze Config raus gelassen, erst darunter angefangen zu kopieren.


    Ein Byte reicht mir nicht, weil ich 10 stellen habe? (oder hab ich mich verrechnet?)
    Das mit den 12 Elementen hab ich schon geändert gehabt. (Hab nachträglich meinen Thread bearbeitet gehabt)


    Die beiden For-Next schleifen sind von einem der Vorposter kopiert um mein Logo das länger als 10 Spalten ist durchlaufen zu lassen.


    Das Gosub Anzeige steht inzwischen zwischen den Schleifen, ändert aber leider nichts daran, dass gar nichts angezeigt wird.


    Aber das ich gerade nicht in die Falsche richtung denke.
    Ich mache mir ne Variable als Byte. In diese kann ich dann 8 Zeichen schreiben. Heißt mit dem Loopup hole ich mir die jeweilige Zeile in dem "Data"-Bereich rein, richtig? Sonst hätte ich gerade ein grundlegendes Verständnisproblem.

  • Ein Byte reicht mir nicht, weil ich 10 stellen habe?

    Oh, da habe ich mich flüchtig verguckt.
    Stimmt, in den Data-Zeilen stehen jeweils 10 Bits.


    Dann natürlich:
    Dim Buffer as Word


    Aber das mit Array braucht nicht. Einfach 'ne Word-Variable.


    Wie ich sehe, hast Du inzwischen Dein Vorposting editiert bzw. ergänzt.
    Ich denke mich da nochmal rein und schreibe dann gleich was dazu.



    Edit:


    Diesen Bereich:

    Code
    Clk = 1
    Strobe = 1
    Clk = 0
    Strobe = 0


    würde ich so schreiben:

    Code
    Clk = 1   	: Clk=0
    Strobe = 1  : Strobe = 0


    Also Clk kurz pulsen, dann Strobe kurz pulsen. Weiß ja nicht welches Schieberegister Du verwendest und auf welche Flanke es reagiert, aber so geht es sicher.



    Weiterhin: Ich verstehe das hier nicht:

    Code
    Anzeige:
    Portbits = Buffer(i)
    Zeile 1 = Portbits.0
    Zeile 2 = Portbits.1
    Zeile 3 = Portbits.2
    Zeile 4 = Portbits.3
    Zeile 5 = Portbits.4
    Zeile 6 = Portbits.5
    Zeile 7 = Portbits.6
    Zeile 8 = Portbits.7


    Also Dein Buffer ist vom Typ Word, weil Du 10 Bits in den Data-Zeilen speicherst. Soweit klar.
    In Prozedur Anzeige verwendest Du davon aber nur die Bits 0 bis 7. Warum?
    Die Variable Portbis ist ja auch nur vom Typ Byte. Du weist also der Bytevariable einen Eintrag aus einem Word-Array zu!?!


    Kontrolliere das mal, dann:
    1) Poste mal den gesamten Quelltext, damit ich den testweise compilieren und entsprechend ändern kann.
    2) Sage bitte, welches Schieberegister Du verwendest.
    3) Ich würde sicherheitshalber gerne mal die Beschaltung der Matrix sehen.

  • So es klappt jetzt. Man sollte halt mal kleine Brötchen backen und nicht alles auf einmal wollen ;)



    Läuft. Nur scheinbar ist eine meiner Spalten verreckt *ARGH*

  • Aber das mit Array braucht nicht. Einfach 'ne Word-Variable.

    Das Array war wohl wie hier beschrieben als "Bildschirmspeicher" gedacht, dessen Inhalt dann in einer *Timer-ISR* unabhängig ausgegeben werden sollte, nix mit "Gosub Anzeige" oder sowas, einfach nur in der Hauptschleife die Daten in's Array kopieren (wie in dem verlinkten Post beschrieben) und die ISR kümmert sich um den Rest (das Multiplexen)...


    aber wenn's nun trotz aller Erklärungen doch wieder ein Mischmasch aus Bilderzeugung und Multiplexen direkt dabei werden soll, auch gut, warum auch nicht...


    unter'm Strich einfacher und flexibler wäre die andere Methode... wie auch schon gesagt wurde:

    Stimmt. Viel eleganter. :thumbup:

    ;)

    It's only light - but we like it!


    Da es sich in letzter Zeit häuft: Ich beantworte keine PNs mit Fragen, die sich auch im Forum beantworten lassen!
    Insbesondere solche von Mitgliedern mit 0 Beiträgen, die dann meist auch noch Sachen fragen, die bereits im entsprechenden Thread beantwortet wurden.
    Ich bin keine private Bastler-Hotline, technische Tipps etc. sollen möglichst vielen Lesern im Forum helfen!

  • Problem ist, dass ich über ein Schieberegister Multiplexe.
    ich hab da nicht so recht die Zeit auf den Interrupt zu warten :-/ Oder meine bisherigen Versuche waren einfach zu doof....


    Zeilen liegen direkt auf Port Ausgängen. Spalten werden über ein Schieberegister gemacht. Müsste also ein Bit Rolieren.

  • Hi Pesi,


    das mit dem Timer-Interrupt UND dem Lesen aus Data-Zeilen ist in der Tat erheblich eleganter.
    Aber zumindest den Timer-Interrupt hat er ja nicht umgesetzt. War ihm wohl zu heavy.
    Immerhin hat er das mit den Data-Zeilen versucht, was schon echt was bringt, weil es massiv Flash spart.


    Das mit dem Bildschirmspeicher als Array würde ich aber eher lassen, denn das verbraucht unnötig RAM.
    Bei so 'ner kleinen Matrix geht das natürlich, ist aber nicht zukunftssicher, wenn es später mal eine richtig große Matrix wird und das Programm ansonsten noch mehr RAM schluckt.


    Natürlich muss man sich mal auf irgendein Verfahren festlegen ...

  • Also ich möchte hier nicht den EIndruck erwecken, als würde ich eure Vorschläge einfach ingorieren. Ich habe einfach das Problem, dass ichs noch nicht alles umsetzen kann. Ich bin erstmal froh, dass mit den Daten jetzt soweit hinbekommen zu haben.


    Hab jetzt nochn gaaaanz dofes PRoblem... Wenn ich aus meinem Portbits aus Byte ein Word mache, damit ich alle 10 Zeilen rein bekomme, dann überspringt er immer genau eine Datenzeile und ab der 7. Zeigt er dann an was er will. . . Warum? Habs sogar probiert mal wirklich 16 Bits zu benutzen. Interessiert ihn aber einfach gar nicht :-/

  • Kein Problem, so war das nicht gemeint, mich hatte aber gewundert, dass Irrlicht zuerst zustimmt, das mit dem Buffer ist viel eleganter, und dann nachher wieder anders, Du bräuchtest den nicht.... ?( :D


    Bei so 'ner kleinen Matrix geht das natürlich, ist aber nicht zukunftssicher, wenn es später mal eine richtig große Matrix wird und das Programm ansonsten noch mehr RAM schluckt.

    "Zukunftssicher"... ?( - er will hier ne kleine 12x10 Matrix ansteuern - auch wenn er sie mal auf 24x10 o.ä. erweitert, passt das noch (gut, kommt drauf an, was Bascom sonst so an RAM verschleudert) leicht in nen Tiny2313 rein...


    und wenn er ne *wesentlich größere* (wo dann auch irgendwann die Frage ist, ob das so, mit Multiplexen über meinetwegen dann 32 Zeilen, überhaupt noch sinnvoll ist) Matrix ansteuern will, braucht er eh' nen größeren µC, weil die Data-Zeilen werden dann auch entsprechend mehr....


    Zeilen liegen direkt auf Port Ausgängen. Spalten werden über ein Schieberegister gemacht. Müsste also ein Bit Rolieren.

    Genau, in ner Timer-ISR, ein mal pro Zeile (bzw. bei Dir Spalte?) aufgerufen, nicht die ganze Ausgabe am Stück...


    ich schau' mir das später mal genauer an.... - Du multiplext jetzt also über die *Spalten*, indem Du das Bit im SR weiter schiebst..? - und die Spalte ist dann an bei D = 0, richtig...? Und es sind 12 Spalten am SR, sowie 10 Zeilen direkt an den Ports...?


    das

    Zitat

    If Portbits >= 1 Then
    Waitms 10
    End If

    kapiere ich auch nicht ganz, wenn die Zeile also "leer" ist, dann überspringst Du praktisch die Wartezeit....? - das ist Humbug, weil dadurch die Gesamtdauer des Multiplexens sich je nach Bildinhalt ändert, und damit auch die Helligkeit der LEDs schwankt - man macht die Zeit immer konstant, wenn die Spalte "leer" ist, dann wird halt einfach 10 ms "nix" angezeigt...

    It's only light - but we like it!


    Da es sich in letzter Zeit häuft: Ich beantworte keine PNs mit Fragen, die sich auch im Forum beantworten lassen!
    Insbesondere solche von Mitgliedern mit 0 Beiträgen, die dann meist auch noch Sachen fragen, die bereits im entsprechenden Thread beantwortet wurden.
    Ich bin keine private Bastler-Hotline, technische Tipps etc. sollen möglichst vielen Lesern im Forum helfen!

  • Um mich zu wiederholen:
    1) Poste mal den gesamten Quelltext, damit ich den testweise compilieren und entsprechend ändern kann.


    2) Sage bitte, welches Schieberegister Du verwendest.


    3) Ich würde sicherheitshalber gerne mal die Beschaltung der Matrix sehen.



    Weiterhin eine Frage, damit es gar keine Missverständnisse gibt:
    Du hattest bislang 19 Data-Zeilen.
    Deine Matrix ist aber 10 x 12.
    Erkläre doch mal, was Deine Matrix eigentlich darstellen soll.


    Es bringt jetzt nichts, Vorschläge zu Deinem Programm zu machen, wenn unklar ist, was die Matrix eigentlich anzeigen soll.
    Soll sie ein starres Bild anzeigen, so wie es in den 19 Data-Zeilen zu sehen ist?
    - Wenn ja: Wie soll das gehen, 19 Data-Zeilen mit einer 10 x 12 Matrix darzustellen?


    Oder soll etwas durchscrollen?


    Mir ist einfach nicht klar, was Du vorhast.
    Wenn das geklärt ist, kann man gezielt das Programm entsprechend ändern.

  • Hi, also hier der ganze Quelltext



    Dann zu deinen / euren Fragen


    Die Matrix die ich habe ist von nem "PingPong" Spiel. gabs mal Conrad (http://www.amazon.de/Lernpaket…d=1338388588&sr=1-1-fkmr0)


    Also was am Ende gehen muss:


    Ich möchte über die Datenzeilen ein Muster angeben, was die Matrix aufbauen soll. Das sollen sowohl statische Bilder sein als auch Text der mehr Spalten braucht als ich zur Verfügung habe.
    Ich habe 10 Zeilen - Direkt an den Portausgängen, des weiteren, 12 Spalten. Diese werden über die Schieberegister (deren Typbezeichnung ich leider gerade nicht lesen kann).
    Heißt ich mache am Anfang beim ersten durchlauf ein D = 0 und clocke das und mache das strobe. Danach kommt dann bei mir bei jedes mal in dem Gosub Anzeige ein Clock und strobe mit D = 1 (was das ganze genau eine SPalte nach rechts rückt). nach 12 mal fällt das bit ja rechts raus, heißt ich schiebe vorne eine 0 nach.
    Heißt ich lese Datenzeile 1. Lass das in Spalte 1 anzeigen. Danach 2 in 2 etc,


    Im einfachsten Fall habe ich genau 12 Datenzeilen für die Spalten. Im schlechtesten habe ich halt 20 Datenzeilen für die 12 Spalten.
    Das Laufen etc hatte ich mit der alten Programmvariante alles schon ohne Probleme. Aber es brauchte halt Code ohne Ende. Das ist jetzt schon einfacher.


    Bei dem Code den ich jetzt hier gepostet habe. Klappt es. Es wird ein X eingeblendet und danach zum Füllen eine Spalte ganz an. Dann 2 101010 und andersrum. Und eine 00110011.
    Das waitms ist so lange, dass ich sehe was er mit den LEDs macht. Wenn ich jetzt aber oben bei Dim Portbits as byte ein "as word" draus mache, dann überspringt er jede zweite Datenzeile komplett. EGAL ob diese aus 16bits besteht oder nicht. Und ab der 5. oder 6. Zeile zeigt er an was er will.
    Hierbei ist auch total egal ob ich die Bits überhaupt brauche also Zeile 9 und 10 mit reingenommen werden oder nicht.

  • Es ist klar, dass er jede zweite Datazeile überspringt, wenn Du Portbits vom Typ Word deklarierst, in den Data-Zeilen neuerdings(!) aber nur 8 Bits speicherst.
    Denn dann liest jeder Zugriff auf Data stets 16 Bits ein, weil die Variable Portbits halt Word ist, also 16 Bits.


    Die ganz große Klarheit habe ich zwar noch immer nicht, aber ich würde in Deinen Data-Zeilen jeweils 16 Bits speichern und weiterhin die Variable Portbis tatsächlich vom Typ Word machen, damit die jedesmal den Inhalt einer solchen 16-Bit Data-Zeile komplett aufnehmen kann.
    Davon verwendest Du zwar nur 10 Bits (keine Ahnung, warum Du das nun auf 8 gestutzt hast), aber der Klarheit halber würde ich alle 16 Bits in den Data-Zeilen aufführen.


    Für das Anzeigen von statischen Bildern bietet es sich an, jeweils 12 Data-Zeilen einzulesen und den 12 Spalten zuzuweisen.
    12 Data-Zeilen repräsentieren dann also Deine volle 12 x 10 Matrix.


    Wenn Du viel mit durchscrollenden Bildern arbeitest, ist das wiederum suboptimal, weil Du dann unnötig Flash-Speicher mit Data-Zeilen verballerst, wo es auch Schiebebefehle täten. Aber das ist wieder so ein Thema für sich, seufz.


    Im Moment belegt Dein Programm 6% vom Flash. Da geht also noch was, aber auch nicht bis ins Unermessliche, zumal Data-Zeilen von je 16 Bits (von denen Du nur 10 nutzten kannst) halt das Doppelte verbrauchen.
    Aber für ein paar Hundert komplette Matrix-Bilder reicht diese Art der Datenspeicherung.


    Probiere mal den angehängten Quelltext.
    Wenn Du mehr Bilder hinzufügen willst, oben die Variable Bildanzahl entsprechend anpassen.



    Edit Nr. 23 oder so ...
    Quelltext abermals korrigiert.
    Auch weitere Bilder hinzugefügt. Ist jetzt zu lang, um den direkt zu posten, daher als Anhang.
    Probiere das mal, ich mach jetzt erstmal 'ne wohlverdiente Pause.


  • Hi,


    das dachte ich auch, dass er dann über die Datenzeile hinweg liest. ABER, ich habs probiert mit 16 bits pro Datenzeile und des weiteren müsste er mir dann in Zeile 9 und 10 aber was anzeigen. Bei mir bleiben aber diese Zeilen auch leer. Und wie gesagt obs 16 bits sind interessiert ihn einfach nicht. (Kann ich dem nicht sagen, dass er von rechts gesehen als Bit 0 an nur 10 Stück anschaut?)


    Ich hatte das genau wegen diesem PRoblem auf 8 gestutzt, weil ich wusste, dass es mit 8 bisher immer ging.


    Was meinst du denn mit Schiebebefehlen? (Wie gesagt bin da noch blutiger Anfänger). Aber auch wenn ich was verschiebe muss ich doch das ganze Muster speichern?


    Ich werde später auf jeden Fall mal deinen QUelltext ausprobieren.


    Vielen Dank nochmals für eure Hilfe. Und wenn das alles funktioniert. DANN widmen wir uns der Variante mit "Bildschirmspeicher" und interrupt zum Bildaufbau. ;) Wenn ihr dann noch Nerven übrig habt ;)


    Grüße


    Ps.: Habe gerade mal deinen Code ausprobiert, dat geht nicht. Der blitzt mit allen LEDs irgendwie


    Hab ich nen Gedankenfehler?



    In dem Fall nimmt er doch einfach die Daten, schreibt die 200 mal in die erste Spalte und gut? Das "Nächste Spalte" muss doch nach jedem Datensatz kommen? 1. Datenzeile - 1. Spalten; spalte weiter; 2. Datensatz - 2. Spalte; Spalte weiter ??

  • WICHTIGES EDIT AM ENDE!!!!!!




    Habs so geändert. Jetzt zeigt er was an. Aber gleiches Problem: Er überspringt jede 2. Datenzeile. Aber durch das "To 12" hört er dann halt nach der 5. Spalte auf und lässt den rest leer ;)


    Und um jetzt noch für komplette verwirrung zu sorgen. Hier mein "letztes Programm nochmal".


    Durch das Lookup 0 soll er nur die erste Daten-Zeile benutzen. Macht er auch. ABER ganz lustig. Auf meinem Display bleibt die Zeile 9 dunkel. Wenn ich aus folgendem:

    Code
    Zeile 9 = Portbits.8
    
    
      Zeile 10 = Portbits.9


    einfach aus der 8 ne 9 mache gehts !? Hä??? Es wird mir zu konfus. Das kann doch gar nicht sein. Irgendwas läuft doch da bei der Übernahme der 16 Bits aus den Datenzeilen und deren Aufschlüsselung in die Portbits.X schief?!
    Aloso ich habe jetzt ganz viel rumprobiert. Egal was ich als 16 bit Muster mache. Es passt nicht. Zeile 9 und 10 machen irgendwas. Egal ob ich jetzt Zeile 1 = portbits.0 oder portbits.1 anfange. Dat geht nicht. Sobalds ne Data mit mehr als 8 bits ist und Portbits ne word gehts nicht.
    Wenn ich das Loopup weglasse, und dafür direkt schreibe Portbits = &B1111111111 dann gehts. Da macht er auch alles was ich ihm vorgebe richtig... Dann geht auch das Portbits als Word


    WICHTIGES EDIT!
    Ich habe mir mal die Hilfe zu Data durchgelesen. Und auch wenn ich keinen Zusammenhang finden konnte zu meinem Problem habe ich einfach mal folgendes gemacht:
    'Note that integer
    values (>255 or <0) must end with the %-sign


    'also note that the
    data type must match the variable type that is


    'used for the READ
    statement



    Ich habe einfach hinter meine jetzt nur 10 bit lange Data-Zeile ein % gemacht und siehe da. Der Mist geht!!

  • Ich habe mir mal die Hilfe zu Data durchgelesen. Und auch wenn ich keinen Zusammenhang finden konnte zu meinem Problem habe ich einfach mal folgendes gemacht:

    *Das* ist doch genau der Zusammenhang: wenn Du Data &B00.... schreibst, dann erwartet er ein *Byte*, also auch wenn Du Data &B1111100011001100110 schreibst, speichert er nur ein Byte ab, nicht alle 16 Bit... ;)


    also muss dass % hinten dran, damit er weiß, dass er ein Word abspeichern soll, also alle 16 Bit - die dann beim lesen in ner passenden Variable landen müssen, eben Word...

    It's only light - but we like it!


    Da es sich in letzter Zeit häuft: Ich beantworte keine PNs mit Fragen, die sich auch im Forum beantworten lassen!
    Insbesondere solche von Mitgliedern mit 0 Beiträgen, die dann meist auch noch Sachen fragen, die bereits im entsprechenden Thread beantwortet wurden.
    Ich bin keine private Bastler-Hotline, technische Tipps etc. sollen möglichst vielen Lesern im Forum helfen!

  • Ja, tut es auch, da habe ich mich wohl missverständlich ausgedrückt... es ist aber nicht so, dass er dann einfach so viele Bits speichert, wie dahinter stehen, sondern ohne weitere Angabe nur 8 - und wenn es 16 sein sollen, dann muss zur Unterscheidung das % hinten dran... ist halt bei Bascom so ne Konvention


    also unabhängig von binär oder nicht, ist bei dezimal auch so: schreibst Du Data 137, dann speichert er ein Byte mit Wert 137 - hier dann eben auch Data 137%, damit er's als Word speichert, wenn gebraucht...


    in Assembler ist's z.B. etwas anders, da gibt's .db für "Data Byte" und .dw für "Data Word", da wird also beim "Befehl" schon unterschieden - in Bascom gibt's nur den einen "Data"-Befehl, und die Unterscheidung dann bei der Zahl selbst...

    It's only light - but we like it!


    Da es sich in letzter Zeit häuft: Ich beantworte keine PNs mit Fragen, die sich auch im Forum beantworten lassen!
    Insbesondere solche von Mitgliedern mit 0 Beiträgen, die dann meist auch noch Sachen fragen, die bereits im entsprechenden Thread beantwortet wurden.
    Ich bin keine private Bastler-Hotline, technische Tipps etc. sollen möglichst vielen Lesern im Forum helfen!

  • Jau, Pesi hat mal wieder recht und toll, dass Du das mit %-Zeichen am Ende der Data-Zeilen sogar selbst herausgefunden hast, C-F600!


    Teste doch bitte nochmal meinen unveränderten Quelltext, ergänze da nur das Prozenzzeichen am Ende jeder Data-Zeile.
    Es wäre mir echt lieb, wenn Du zum Testen meinen Quelltext nimmst, sonst muss ich mich immer wieder neu in Deine Ergüsse eindenken.


    Falls es tatsächlich zicken sollte, ist das hier ein sehr guter Test, was Du schon selbst probiert hast:

    Zitat

    Wenn ich das Loopup weglasse, und dafür direkt schreibe Portbits = &B1111111111 dann gehts.

    Wirklich guter Test, aber ich würde folgendes Bitmuster empfehlen:
    Portbits = &B0000001100000001%


    Denn damit kommst Du auch eventuellen Verschiebungen auf die Schliche.
    Korrekt ausgeführt also alles Nullen, nur die Zeilen 1, 9 und 10 an.

  • Ja, aber hast Du inzwischen auch die Prozentzeichen eingefügt und die Portbits mal direkt gesetzt, ohne Lookup?


    Aber wie dem auch sei, ich habe noch 'nen Fehler in der Spaltensteuerung entdeckt.
    Die Prozentzeichen habe ich ebenfalls ergänzt.
    Neue Version hängt an.


    Bitte exakt beschrieben, was die tut.
    Was sie tun soll, siehst Du ja in den Data-Zeilen.


    Edit 2: Korrigierte Version ...