www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Tabelle auslesen (asm)


Autor: Axel H. (mf-futzi)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich möchte Tabellentexte in meinem LCD ausgeben. Dazu der Code weiter 
unten. Mit
ldi     temp2, low(15*18) und
ldi     temp3, high(15*18) lege ich fest, welcher Text (hier: 15)
angezeigt wird.

Nun will ich aber nicht "15" angeben, sondern den Wert 15 an temp2/temp3 
übergeben.

ldi     temp1, 15
ldi     temp2, low(temp1*18)

funktioniert ja logischer Weise nicht. Kann mir da jemand helfen?



Vielen Dank



Ausgabe_lcd:
        push    temp1                           ; Register sichern
        push    temp2

        ldi     temp2, low(15*18)
        ldi     temp3, high(15*18)

        ldi  zl, low(texte_lcd*2)          ; Zeiger auf Texttabelle
        ldi  zh, high(texte_lcd*2)

        add  zl, temp2      ; Tabellenplatz berechnen
        adc  zh, temp3
Ausgabe_lcd1:                                   ; Solange Zeichen ausg.,
        lpm     temp1,z+                        ; bis Zeichen eine 0 ist
        cpi     temp1,0
        breq    Ausgabe_lcd2
        rcall   lcd_data
        rjmp    Ausgabe_lcd1

Ausgabe_lcd2:
        pop     temp2
        pop     temp1

        ret
;----------------------------------------------------------------------- 
--
texte_lcd:
        .db "Pumpsteuerung V1",0,0
        .db "Name           ",0,0
        .db "1. Einstellungen",0,0
        .db "2.Manuell       ",0,0
        .db "3.Status   S1/S2",0,0
        .db "4.TP Bh         ",0,0
        .db "Datum           ",0,0
        .db "Zeit            ",0,0
        .db "Wochentag       ",0,0
        .db "TP-Int ein      ",0,0
        .db "TP-Int aus      ",0,0
        .db "Sensor1 Verz.   ",0,0
        .db "Sensor2 Verz.   ",0,0
        .db "T-Pumpe         ",0,0
        .db "T-Pumpe aus     ",0,0
        .db "T-Pumpe Zulauf  ",0,0
        .db "W-Werk          ",0,0
        .db "W-Werk aus      ",0,0
        .db "Tank voll       ",0,0
        .db "Tank leer       ",0,0
        .db "ein  aus  auto  ",0,0
        .db " ein            ",0,0
        .db " stopp          ",0,0
        .db "S1 auf          ",0,0
        .db "S2 zu           ",0,0
        .db "Mo Di Mi Do Fr  ",0,0
        .db "  Mi Do Fr Sa So",0,0
        .db "                ",0,0
        .db "**** ERROR *****",0,0

Autor: Spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

Dann musst du halt multiplizieren.

Je nach controller:
http://www.atmel.com/dyn/resources/prod_documents/...

oder
http://www.atmel.com/dyn/resources/prod_documents/...

MfG Spess

Autor: Vlad Tepesch (vlad_tepesch)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
warum gibst du nicht jedem Text ein Label und machst die Außerdem nur so 
lang, wie nötig?

Autor: Spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

Die Multiplikation mit 18 lässt sich auch so bewerkstelligen:
ldi  temp1, 15

mov  temp2,temp1
mov  temp3,temp1    ; Kopie von temp1
swap temp2
swap temp3
andi temp2,$F0
andi temp3,$0F   ; temp3:temp2 = 16*temp1

ldi  zl, low(texte_lcd*2)   ;Zeiger auf Texttabelle
ldi  zh, high(texte_lcd*2)

add ZL,temp2
adc ZH,temp3        ; Z=Z+16*temp1

clr temp2          ; Null

add ZL,temp1
adc ZH,temp2
add ZL,temp1
adc ZH,temp2       ; Z=Z+ 2*temp1

MfG Spess

Autor: Axel H. (mf-futzi)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Spess,

ich hab's dann schlussendlich mit einer Multiplikation gemacht und das 
ganze in ein Macro gepackt:

.macro print_lcd_text

        ldi     temp2, @0                 ; Nummer des gewünschten 
Textes
        dec     temp2                     ; 1 abz. (tab beginnt bei 0)
        ldi     temp3, 18                 ; 18 in temp3 (Anz bytes)

        muls    temp3, temp2              ; gew.  Text * Textlänge
        mov     temp3, r1                 ; high byte in temp3
        mov     temp2, r0                 ; low byte in temp2

        ldi  zl, low(texte_lcd*2)         ; Zeiger auf Texttabelle
        ldi  zh, high(texte_lcd*2)

        add  zl, temp2      ; Tabellenplatz berechnen
        adc  zh, temp3
   Ausgabe_lcd1:                          ; Solange Zeichen ausg.,
        lpm     temp1,z+                  ; bis Zeichen eine 0 ist
        cpi     temp1,0
        breq    Ausgabe_lcd2
        rcall   lcd_data
        rjmp    Ausgabe_lcd1
.endmacro


Vielen Dank nochmal für den Tipp

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.