mikrocontroller.net

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


Autor: Und3rt4ker (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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






.nolist
.include "tn2313def.inc"
.list               
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;Zeilen:  PortB  0-4(5)  
;Spalten:  PortD  0-6(7)
;* * * * *6
;* * * * *5
;* * * * *4
;* * * * *3
;* * * * *2
;* * * * *1
;* * * * *0
;4 3 2 1 0
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 
ldi r16, ramend
out spl, r16      ;Stack initialisieren

ldi r16  , 0xFF      
out ddrB , r16      ;DDRB   =Ausgang
out ddrD , r16      ;DDRD   =Ausgang
ldi r16  , 0x00
out portB,r16      ;PortB  =low    
out portD,r16      ;PortD  =low

;;;;;;;;;;;Main;;;;;;;;;;;;;;;;;
Text:
        
    ldi ZL, LOW(lauf*2)      ; Adresse des Strings in den
        ldi ZH, HIGH(lauf*2)     ; Z-Pointer laden
        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 Text                ; wieder zum Anfang springen
 

lauf:
.db "DAS SOLL ANGEZEIGT WERDEN",0

Autor: Matthias Lipinsky (lippy)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Johannes M. (johnny-m)
Datum:

Bewertung
0 lesenswert
nicht 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"?

Autor: Und3rt4ker (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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
  *  

Autor: Johannes M. (johnny-m)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ah so, Dir fehlt also die Fonttabelle...

Autor: Und3rt4ker (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: ReiRaWB (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: ReiRaWB (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Und3rt4ker (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.