Forum: Mikrocontroller und Digitale Elektronik Tutorial: Mehrfachverzweigungen


von Flo S. (tuxianer)


Lesenswert?

Ich habe mal ne frage zu der Codestelle:
1
    subi    r16,minimum                 ; Nullpunkt verschieben
2
    cpi     r16,(maximum-minimum+1)     ; Index auf Maximum prüfen
3
    brsh    kein_Treffer                ; Index zu gross -> Fehler

was geschieht hier genau? Ich Interpretiere das jetzt so, dass ein 
Fegler kommt wenn minimum>maximum ist...ist das korrekt?

von Karl H. (kbuchegg)


Lesenswert?

Florentin Schirmer wrote:
> Ich habe mal ne frage zu der Codestelle:
>
>
1
>     subi    r16,minimum                 ; Nullpunkt verschieben
2
>     cpi     r16,(maximum-minimum+1)     ; Index auf Maximum prüfen
3
>     brsh    kein_Treffer                ; Index zu gross -> Fehler
4
>
>
> was geschieht hier genau? Ich Interpretiere das jetzt so, dass ein
> Fegler kommt wenn minimum>maximum ist...ist das korrekt?

Nein.
Angenommen minimum habe den Wert 5 und maximum den Wert 8,
dann überprüft (im Prinzip) der Code ob der Wert in r16
zwischen 5 und 8 liegt.
Er tut das, in dem er von r16 zunächst mal die 5 abzieht
und das Ergebnis dann mit (8-5+1 = 4) vergleicht. Wenn das
Ergebnis 4 oder größer war, dann liegt r16 ausserhalb des
zulässigen Bereichs

r16       r16-5        (r16-5 >= 4)

3      3 - 5 = 254        ja -> Wert ausserhalb
6      6 - 5 = 1          nein -> Wert im Bereich
9      9 - 5 = 4          ja -> Wert ausserhalb

von Falk B. (falk)


Lesenswert?

@ Florentin Schirmer (tuxianer)

>Ich habe mal ne frage zu der Codestelle:

>    subi    r16,minimum                 ; Nullpunkt verschieben
>    cpi     r16,(maximum-minimum+1)     ; Index auf Maximum prüfen
>    brsh    kein_Treffer                ; Index zu gross -> Fehler

>was geschieht hier genau? Ich Interpretiere das jetzt so, dass ein

Das steht doch im Tutorial. Es wird geprüft, ob der Wert in r16 zwischen 
minimum und maximum liegt

minimum <= r16 <= maximum

Wenn nicht, wird zu kein_Treffer gesprungen.

>Fegler kommt wenn minimum>maximum ist...ist das korrekt?

Nein.

MfG
Falk

von Flo S. (tuxianer)


Lesenswert?

achso...r16 ist der zu prüfende wert....

von Flo S. (tuxianer)


Lesenswert?

noch ne Frage zum 2. Teil:
1
    ldi     ZL,low(Sprungtabelle)       ; Tabellenzeiger laden, 16 Bit
2
    ldi     ZH,high(Sprungtabelle)
3
    add     ZL,r16                      ; Index addieren, 16 Bit
4
    ldi     r16,0                   
5
    adc     ZH,r16
6
    ijmp

wie genau funktioniert das...der Index wird ja irgeendwie in den Z 
Pointer addresiert und das der 16 bit hat muss das ganze ausgesplittet 
werden...aber wie kommt es dann zur finalen adresse?

von Falk B. (falk)


Lesenswert?

@  Florentin Schirmer (tuxianer)

????
Das wird ja nun alles HAARKLEIN beschrieben. Ist das WIRKLICH SOO 
unverständlich.
Ist mir unverständlich ;-)

>wie genau funktioniert das...der Index wird ja irgeendwie in den Z
>Pointer addresiert und das der 16 bit hat muss das ganze ausgesplittet
>werden

Ja, eben! Dafür gibt es zwei Befehle. Die laden das LOW und das HIGH 
Byte von Z, auch als ZL und ZH bekannt. Das machen die zwei ersten 
Zeilen.

>...aber wie kommt es dann zur finalen adresse?

Durch Addition des Index. Und da der Index nur eine 8-Bit Zahl ist, muss 
er erweitert werden (HIGH Byte ist Null) und als 16 Bit-Wert addiert 
werden.
Das machen die drei nächsten Zeilen.

MFG
Falk

von Flo S. (tuxianer)


Lesenswert?

>>...aber wie kommt es dann zur finalen adresse?
>
> Durch Addition des Index. Und da der Index nur eine 8-Bit Zahl ist, muss
> er erweitert werden (HIGH Byte ist Null) und als 16 Bit-Wert addiert
> werden.
> Das machen die drei nächsten Zeilen.
>
> MFG
> Falk


ja und genau das versteh ich nicht...kannst du mir das mal anhand von 
Zalen erläutern...?

r16 wird zu ZL adsiert aber was ist ZL jetzt Zahlenmäsig und was kommt 
raus?

von Falk B. (falk)


Lesenswert?

Florentin Schirmer (tuxianer)
Datum: 03.08.2007 15:39

>>...aber wie kommt es dann zur finalen adresse?
>
> Durch Addition des Index. Und da der Index nur eine 8-Bit Zahl ist, muss
> er erweitert werden (HIGH Byte ist Null) und als 16 Bit-Wert addiert
> werden.
> Das machen die drei nächsten Zeilen.
>
> MFG
> Falk


ja und genau das versteh ich nicht...kannst du mir das mal anhand von
Zalen erläutern...?

r16 wird zu ZL adsiert aber was ist ZL jetzt Zahlenmäsig und was kommt
raus?

@ Florentin Schirmer (tuxianer)

>ja und genau das versteh ich nicht...kannst du mir das mal anhand von
>Zalen erläutern...?

Das ist wie das Addieren mit Papier und Bleistift (kann das die 
Generation PISA noch? :-)
Man muss mit Übertrag rechnen.

Also, sagen wir in ZH steht 5, in ZL steht 252, unser Index in r16 ist 
26. Das Z-Register zeigt also nach 5*256+252 = 1532 = 0x05FC

ZL + r16 = 252 + 26 = 278

Diese Zahl ist zu gross für 8 Bit, es kommt zum arithmetischen Überlauf. 
Der setzt das Carry-Flag. In ZL steht dann 278-256 = 22

Danach wird r16 mit 0 geladen. Danach werden R16 + das Carry-Flag zu ZH 
addiert

ZH + R16 + Carry = 5 + 0 + 1 = 6

Damit zeigt das Z-Register auf 6*256 + 22 = 1558 = 0x0616

>r16 wird zu ZL adsiert aber was ist ZL jetzt Zahlenmäsig und was kommt
>raus?

Das kann man im AVR-Studio wunderbar simulieren.

MfG
Falk

von Flo S. (tuxianer)


Lesenswert?

dasist ja alles soweit klar...nur wie kommen die Zahlen ins Th bzw. ZL?

von Falk B. (falk)


Lesenswert?

@ Florentin Schirmer (tuxianer)

>dasist ja alles soweit klar...nur wie kommen die Zahlen ins Th bzw. ZL?

???
Sie werden geladen?
Mit ldi?

Mfg
Falk

von Flo S. (tuxianer)


Lesenswert?

ja...hier:

    ldi     ZL,low(Sprungtabelle)       ; Tabellenzeiger laden, 16 Bit
    ldi     ZH,high(Sprungtabelle)



aber wie nimmt der aus Sprungtabele nen Wert???

von Simon K. (simon) Benutzerseite


Lesenswert?

"Sprungtabelle" ist ein Label. Und jedes Label kann zu einer (16-Bit) 
Adresse aufgelöst werden. Das macht der Assemblierer.

Irgendwo im Code hast du dieses Label stehen. Das sieht ungefähr so aus:
1
Sprungtabelle:
2
.db 1, 3 
3
.db 2, 7

EDIT: Ups, es geht ja garnicht um eine Datentabelle. Dann ist mein 
Codeausschnitt natürlich mumpitz. Für eine richtige Sprungtabelle siehe 
2 Posts unter diesem.

Oder was auch immer. Die Daten (.db) müssen ja an irgendeiner 
Flash-Adresse stehen - "Sprungtabelle" eben.

von Falk B. (falk)


Lesenswert?

@ Florentin Schirmer (tuxianer)

>aber wie nimmt der aus Sprungtabele nen Wert???

Das steht doch nun WIRKLICH im Tutorial. Hast du das überhaupt mal in 
RUHE gelesen?

Kopfschütelnd
Falk

von Flo S. (tuxianer)


Lesenswert?

naja ich habe den Code hier:


.include "m8def.inc"

; Mehrfachverzweigung Version B

; Clevere Version mit Sprungtabelle
; minimum und maximum sind auf 0..255 begrenzt!

.equ minimum = 3
.equ maximum = 7

start_vergleich:

    subi    r16,minimum                 ; Nullpunkt verschieben
    cpi     r16,(maximum-minimum+1)     ; Index auf Maximum prüfen
    brsh    kein_Treffer                ; Index zu gross -> Fehler
    ldi     ZL,low(Sprungtabelle)       ; Tabellenzeiger laden, 16 Bit
    ldi     ZH,high(Sprungtabelle)
    add     ZL,r16                      ; Index addieren, 16 Bit
    ldi     r16,0
    adc     ZH,r16
    ijmp                                ; indirekter Sprung in 
Sprungtabelle

kein_treffer:

; hier stehen jetzt alle Anweisungen für den Fall, dass keiner der 
Vergleiche erfolgreich war

    rjmp    ende_vergleich

Sprungtabelle:
    rjmp    zweig_0
    rjmp    zweig_1
    rjmp    zweig_2
    rjmp    zweig_3
    rjmp    zweig_4

zweig_0:

; hier stehen jetzt alle Anweisungen für diesen Zweig

    rjmp    ende_vergleich

zweig_1:

; hier stehen jetzt alle Awneisungen für diesen Zweig

    rjmp    ende_vergleich

zweig_2:

; hier stehen jetzt alle Anweisungen für diesen Zweig

    rjmp    ende_vergleich

zweig_3:

; hier stehen jetzt alle Anweisungen für diesen Zweig

    rjmp    ende_vergleich

zweig_4:

; hier stehen jetzt alle Anweisungen für diesen Zweig

    rjmp    ende_vergleich

ende_vergleich:

; hier geht das Programm weiter

    rjmp    ende_vergleich          ; nur für Simulationszwecke! 
ENTFERNEN!

von Flo S. (tuxianer)


Lesenswert?

wo steht das?



Falk Brunner wrote:
> @ Florentin Schirmer (tuxianer)
>
>>aber wie nimmt der aus Sprungtabele nen Wert???
>
> Das steht doch nun WIRKLICH im Tutorial. Hast du das überhaupt mal in
> RUHE gelesen?
>
> Kopfschütelnd
> Falk

von Falk B. (falk)


Lesenswert?

@ Florentin Schirmer (tuxianer)

>wo steht das?

Soll ich dir das Tutorial jetzt vorlesen?
Unter Programmbeschreibung.

MfG
Falk

von Flo S. (tuxianer)


Lesenswert?

sryy das mit de adresse habe ich echt überlesen...

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.