Hallo,
ich habe mir aus 35 low current LEDs eine kleine Matrix direkt an den
ATtiny2313 gebaut. Jetzt habe ich nur ein kleines Problem...die
Ansteuerung. Scheinbar habe ich heute ein Brett vorm Kopf. Ich würde
gerne einen gespeicherten String byteweise zerpflücken und dann die
einzelnen Spalten durchscrollen lassen.
Erstmal soll das ganze nur einen einprogrammierten Text (also nichts mit
rs232) anzeigen können.
Das hab ich schonmal, aber ich komme einfach nicht weiter!
MfG Und3rt4ker
Du Springst zweimal zum Label "Text" zurück. Das darfst du aber wohl
nur, wenn du die Nullterminierung entdeckst. Das andere Mal musst du zum
lpm zurückspringen.
Wenn Du nach jeder Ausgabe wieder auf den Anfang zurückspringst und das
erste Element lädst, dann kommt natürlich nicht viel raus. Außerdem: Wo
ist das Unterprogramm "ausgeben"?
da liegt ja mein Problem, ich bekomm es nicht auf die reihe ein ascii
zeichen....z.B.:"L" über einen Font als Laufschrift von rechts nach
links auszugeben.
Font:
* 0 0 0 0
* 0 0 0 0
* 0 0 0 0
* 0 0 0 0
* 0 0 0 0
* 0 0 0 0
*
@Und3rt4ker
Also, damit gibst Du immer nur das erste Zeichen aus :-(
besser so:
;;;;;;;;;;;Main;;;;;;;;;;;;;;;;;
Text:
ldi ZL, LOW(lauf*2) ; Adresse des Strings in den
ldi ZH, HIGH(lauf*2) ; Z-Pointer laden
Text1:
lpm ; Erstes Byte des Strings nach R0 lesen
tst R0 ; R0 auf 0 testen
breq Text ; wenn 0, dann wieder neu
mov r16, r0 ; Inhalt von R0 nach R16 kopieren
rcall ausgeben ; ausgabe
adiw ZL, 1 ; Adresse des Z-Pointers um 1 erhöhen
rjmp Text1 ; wieder zum Anfang springen
lauf:
.db "DAS SOLL ANGEZEIGT WERDEN",0
Für die Ausgabe mußt Du eine Fonttabelle im Programmspeicher ablegen,
dazu brauchst Du je Zeichen 8 Byte (eigentlich 7, 8 wegen der besseren
Adressierbarkeit). Wenn Du Dich an ASCII orientierst und die Codes
32 bis 127 implementierst brauchst Du 786 Byte dafür, ist 3/8 des
Programmspeichers vom 2313 (und ist 'ne Schweinearbeit).
Für Dein 'L' würde das so aussehen:
Addr+7: 0000 0000 / 00
Addr+6: 0001 0000 / 10
Addr+5: 0001 0000 / 10
Addr+4: 0001 0000 / 10
Addr+3: 0001 0000 / 10
Addr+2: 0001 0000 / 10
Addr+1: 0001 0000 / 10
Addr: 0001 1111 / 1F
immer vorausgesetzt, Du hast die LED-Anoden an Port B angeschlossen,
wenn Kathoden an Port B dann:
Addr+7: 1111 1111 / FF
Addr+6: 1110 1111 / EF
Addr+5: 1110 1111 / EF
Addr+4: 1110 1111 / EF
Addr+3: 1110 1111 / EF
Addr+2: 1110 1111 / EF
Addr+1: 1110 1111 / EF
Addr: 1110 0000 / E0
Zur Ausgabe die Fontadresse des gewünschten Zeichens errechnen
(Basisadresse Fonttabelle + (ASCII-Code - 32) * 8)
und ab dieser Adresse unter Aktivierung der zugehörigen Zeile durch
Port D die 8 Bytes nacheinander auf Port B ausgeben (Thema:
Zeitmultiplex).
Das Ganze in einer Timer-Interruptserviceroutine je Byte so etwa alle
12,5 Millisekunden ergibt flackerfreie 100 Hz Anzeigefrequenz.
Alles gaaanz einfach :-)
Gruß Reinhard
@Und3rt4ker
Ach, übrigens, Dein Programmschnipsel schiebt die Zeile -je nach
Taktfrequenz- so einige tausendmal je Sekunde über das LED-Array.
Also keine Schleife sondern 1-Sekunden-ISR:
Text:
ldi ZL, LOW(lauf*2) ; Adresse des Strings in den
ldi ZH, HIGH(lauf*2) ; Z-Pointer laden
ISR_1_Sek: ; Einsprung ISR
lpm ; Erstes Byte des Strings nach R0 lesen
tst R0 ; R0 auf 0 testen
breq Text ; wenn 0, dann wieder neu
mov r16, r0 ; Inhalt von R0 nach R16 kopieren
; rcall ausgeben ; ausgabe - wird durch 12,5
Millisekunden-
; ISR ersetzt
adiw ZL, 1 ; Adresse des Z-Pointers um 1 erhöhen
iret ; wieder zum Anfang springen
lauf:
.db "DAS SOLL ANGEZEIGT WERDEN",0
Und bitte das Ganze nur als Grundgerüst betrachten, da fehlt z.B. noch
Registerrettung und der Z-Pointers sollte vor Aktivierung der ISR im
Hauptprogramm mit der Stringadresse initialisiert werden.
Gruß Reinhard
Hi RaiRaWB,
danke, danke, danke!*g*
Das löst mein problem mit dem font, aber bis wirklich was über das
"Display" läuft, wird es wohl noch dauern: Die Schule fängt wieder an
heul
Aber noch mal ein großes DANKE
Mfg Und3rt4ker