mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik 5-Byte-Zahl hochzählen


Autor: Johannes Permoser (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
hi,

für einen zeitstempel muss ich eine zahl, die aus 5 byte besteht immer
um 1 hochzählen. die zahl ist wie folgt aufgebaut: t5 YH YL ZH ZL

angehängt habe ich mal meine version, allerding ist diese nicht gerade
ressourcenschonend (haufenweise vergleiche)

kann man das auch eleganter lösen? mit flags ausm SREG?

mfg, Johannes

Autor: Laeubi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ldi temp, 1
add ZL, temp
ldi temp, 0
addc ZH, temp
addc YL, temp
addc YH, temp
addc t5, temp

Würde gehen :)

Autor: Hartmut Gröger (hardygroeger)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

noch kürzer:

clr tmp,0
adiw ZH:ZL,1
adc YL,tmp
adc YH,tmp
adc t5,tmp

MfG HG

Autor: Hartmut Gröger (hardygroeger)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
erste Zeile ist natürlich:   clr tmp

Autor: H.joachim Seifert (crazy_horse)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
subi r20, -1
sbci r21, -1
sbci r22, -1
sbci r23, -1
sbci r24, -1

sollte auch gehen, wenn Register ab r16 verwendet werden. Registernamen
natürlich anpassen.

Autor: Johannes Permoser (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
funktioniert alles super, danke euch.

jetzt wärs noch nett, wenn mir jemand die version von Hartmut Gröger
erklären könnte

Autor: Hannes Lux (hannes)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> jetzt wärs noch nett, wenn mir jemand die version von Hartmut Gröger
> erklären könnte

Dann schau dir doch einfach mal den Hilfetext zu "adiw" im AVR-Studio
an. Dazu setzt du den Editorcursor auf den Befehl und betätigst die
F1-Taste.

...

Autor: Dennis Strehl (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@H.Joachim Seifert:

subi r20, -1
sbci r21, 0
sbci r22, 0
sbci r23, 0
sbci r24, 0

Ich denke so funktioniert es besser ;)
Wir wollen ja nicht um
0000000100000001000000010000000100000001
hochzählen.

------------------

clr tmp,0
adiw ZH:ZL,1
adc YL,tmp
adc YH,tmp
adc t5,tmp

Zuerst wird eine 0 in tmp geladen, die wird später verwendet.
adiw addiert einen Immediate-Wert (also eine Konstante) zu einem Word,
also zwei Registern.
Danach wird das Carry mit adc YL,tmp (wobei tmp=0 ist)
weiterverrechnet.

--------------------

Meine Lösung:

adiw ZL, 1
sbci YL, 0
sbci YH, 0
sbci t5, 0

Autor: Johannes Permoser (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Danach wird das Carry mit adc YL,tmp (wobei tmp=0 ist)
weiterverrechnet.

und das verstehe ich nicht. was sagt das carry-flag? warum ändert sich
was am wert, wenn ich irgendwo 0 dazuzähle?

> Meine Lösung:

wird ja immer schöner, danke

Autor: Jadeclaw Dinosaur (jadeclaw)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ok, nehmen wir uns das Teil mal:
clr tmp,0
adiw ZH:ZL,1  ;Hier wird 1 dazuaddiert.
Läuft das Register dabei über, wird das Carry-Flag gesetzt.
Carry gesetzt ist wie 1 gemerkt.
adc YL,tmp   ; 0 + Carry(1/0) dazuaddiert.
Ist Carry gesetzt, addiert ADC 0+1 dazu, ist Carry gelöscht,
so wird 0 + 0 dazuaddiert,
d.h. der Wert im Register ändert sich nicht.
Falls das Register durch die aus dem Carry bestehende 1 überläuft,
wird Carry gesetzt.
adc YH,tmp    ; Dito
adc t5,tmp    ; Dito.
Bei passendem Zählerstand, kann auf diese Weise das Carryflag bis zum
Ende durchgereicht werden.

Gruss
Jadeclaw.

Autor: H.joachim Seifert (crazy_horse)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@dennis:
ich glaube, da bist du auf dem Holzweg, man müsste es gleich mal durch
den Simulator laufen lassen. Aber ich bin mir ziemlich sicher, dass es
so richtig war.
Wenn du natürlich am Anfang einen Additionsbefehl nimmst, muss im
weiteren nur eine 0 addiert werden, das ist richtig.
Mit adiw geht es natürlich in diesem speziellen Fall (unterstes Byte
liegt im unteren Byte von x,y oder z)

Autor: Dennis Strehl (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sorry, hattest wirklich recht.
Ich war davon ausgegangen dass subi r20, -1 das gleiche sei wie addi
r20, 1. (Ich weiß, den Befehl gibt es nicht).

Autor: H.joachim Seifert (crazy_horse)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Dein Beispiel funktioniert gar nicht, würde nur mit adi gehen. Bleibt
dir nach adiw also nur adc, also ein weiteres Register benutzen. Damit
bleibt die Lösung mit adiw ohne jeden Vorteil, aber 2 Nachteilen.

Autor: Philipp Burch (philipp_burch)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hab' grade getestet, die Variante von Joachim funzt zweifellos.

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

Bewertung
0 lesenswert
nicht lesenswert
> was sagt das carry-flag?

Das cary flag sagt dass es einen Überlauf gegeben hat.
So wie in 9 + 1 ergibt 0, 1 Übertrag.

Autor: Hannes Lux (hannes)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Johannes:

Wenn du in Assembler programmieren willst, dass musst du die Bedeutung
der Flags im SREG kennen. Denn sämtliche Verzweigungen sind ja
"bedingte Sprünge", ohne Verzweigungen kommst du nicht weit. Du hast
also Operationen (und Vergleiche), die die Flags verändern, und
bedingte Sprünge, die anhand der Flags springen oder eben nicht (BRxx).
Das Carry-Flag ist das Überlauf/Unterlauf-Flag, das nutzt man nicht nur
als Verzweigungsbedingung, sondern auch zur Addition/Subtraktion mit
Übertrag. Deshalb gibt es neben ADD (ohne Carry) auch ADC (mit Carry),
neben SUB auch SBC und neben SUBI auch SBCI.

Welche Befehle die Flags beeinflussen und welche Befehle vom Zustand
der Flags beeinflusst werden, erfährst du als Übersicht in der Tabelle
"Instruction Set Summary" am Ende des (vollständigen) Datenblatts
deines AVRs und etwas detailierter in der separaten Datei
"AVR-Instruction-Set" von der ATMEL-Homepage, sowie in der
Onlinehilfe des AVR-Studios.

Es ist völlig klar, dass du nicht vom ersten Tage an alles wissen
kannst, aber gelegentlich kann man da mal nachsehen und erfährt und
versteht Einiges, was man beim letzten Lesen noch nicht richtig
verstanden hat.

Bit- & Bytebruch...
...HanneS...

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.