Forum: Mikrocontroller und Digitale Elektronik attiny2313-5*7LED-Matrix direkt an ports.


von Und3rt4ker (Gast)


Lesenswert?

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






1
.nolist
2
.include "tn2313def.inc"
3
.list               
4
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
5
;Zeilen:  PortB  0-4(5)  
6
;Spalten:  PortD  0-6(7)
7
;* * * * *6
8
;* * * * *5
9
;* * * * *4
10
;* * * * *3
11
;* * * * *2
12
;* * * * *1
13
;* * * * *0
14
;4 3 2 1 0
15
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
16
 
17
ldi r16, ramend
18
out spl, r16      ;Stack initialisieren
19
20
ldi r16  , 0xFF      
21
out ddrB , r16      ;DDRB   =Ausgang
22
out ddrD , r16      ;DDRD   =Ausgang
23
ldi r16  , 0x00
24
out portB,r16      ;PortB  =low    
25
out portD,r16      ;PortD  =low
26
27
;;;;;;;;;;;Main;;;;;;;;;;;;;;;;;
28
Text:
29
        
30
    ldi ZL, LOW(lauf*2)      ; Adresse des Strings in den
31
        ldi ZH, HIGH(lauf*2)     ; Z-Pointer laden
32
        lpm                      ; Erstes Byte des Strings nach R0 lesen
33
        tst R0                   ; R0 auf 0 testen
34
        breq Text              ; wenn 0, dann wieder neu
35
        mov r16, r0              ; Inhalt von R0 nach R16 kopieren
36
        rcall ausgeben         ; ausgabe 
37
        adiw ZL, 1               ; Adresse des Z-Pointers um 1 erhöhen
38
        rjmp Text                ; wieder zum Anfang springen
39
 
40
41
lauf:
42
.db "DAS SOLL ANGEZEIGT WERDEN",0

von Matthias L. (Gast)


Lesenswert?

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.

von Johannes M. (johnny-m)


Lesenswert?

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"?

von Und3rt4ker (Gast)


Lesenswert?

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
  *  

von Johannes M. (johnny-m)


Lesenswert?

Ah so, Dir fehlt also die Fonttabelle...

von Und3rt4ker (Gast)


Lesenswert?

genau, und wie ich damit einen laufenden text hinbekomme. ich habe heute 
so ein riesen brett vorm kopf, sry wenn das für euch komisch klingt 
grins
mfg

von ReiRaWB (Gast)


Lesenswert?

@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

von ReiRaWB (Gast)


Lesenswert?

@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

von Und3rt4ker (Gast)


Lesenswert?

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

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.