Forum: Mikrocontroller und Digitale Elektronik Tabelle auslesen (asm)


von Axel H. (mf-futzi)


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

von Spess53 (Gast)


Lesenswert?


von Vlad T. (vlad_tepesch)


Lesenswert?

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

von Spess53 (Gast)


Lesenswert?

Hi

Die Multiplikation mit 18 lässt sich auch so bewerkstelligen:
1
ldi  temp1, 15
2
3
mov  temp2,temp1
4
mov  temp3,temp1    ; Kopie von temp1
5
swap temp2
6
swap temp3
7
andi temp2,$F0
8
andi temp3,$0F   ; temp3:temp2 = 16*temp1
9
10
ldi  zl, low(texte_lcd*2)   ;Zeiger auf Texttabelle
11
ldi  zh, high(texte_lcd*2)
12
13
add ZL,temp2
14
adc ZH,temp3        ; Z=Z+16*temp1
15
16
clr temp2          ; Null
17
18
add ZL,temp1
19
adc ZH,temp2
20
add ZL,temp1
21
adc ZH,temp2       ; Z=Z+ 2*temp1

MfG Spess

von Axel H. (mf-futzi)


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

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.