www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Tutorial: Mehrfachverzweigungen


Autor: Flo S. (tuxianer)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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 
Fegler kommt wenn minimum>maximum ist...ist das korrekt?

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Florentin Schirmer wrote:
> 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
> 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

Autor: Falk Brunner (falk)
Datum:

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

Autor: Flo S. (tuxianer)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
achso...r16 ist der zu prüfende wert....

Autor: Flo S. (tuxianer)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
noch ne Frage zum 2. Teil:
    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     

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?

Autor: Falk Brunner (falk)
Datum:

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

Autor: Flo S. (tuxianer)
Datum:

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

Autor: Falk Brunner (falk)
Datum:

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

Autor: Flo S. (tuxianer)
Datum:

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

Autor: Falk Brunner (falk)
Datum:

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

Autor: Flo S. (tuxianer)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ja...hier:

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



aber wie nimmt der aus Sprungtabele nen Wert???

Autor: Simon K. (simon) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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:
Sprungtabelle:
.db 1, 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.

Autor: Falk Brunner (falk)
Datum:

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

Autor: Flo S. (tuxianer)
Datum:

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

Autor: Flo S. (tuxianer)
Datum:

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

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ Florentin Schirmer (tuxianer)

>wo steht das?

Soll ich dir das Tutorial jetzt vorlesen?
Unter Programmbeschreibung.

MfG
Falk

Autor: Flo S. (tuxianer)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
sryy das mit de adresse habe ich echt überlesen...

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.