mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Incrementieren einer 16Bit Zahl


Autor: Norbert (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hallo zusammen,

ich möchte einer 16 Bit Zahl immer bis dezimal 9999 hochzählen lassen
(für eine Zeitmessung mit AVR 4433). Gibt es eine kürzere Möglichkeit
wie in meinen Beispielprogramm? Danke im Voraus.

Norbert

Autor: Norbert (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Noch zur Info, nur Assembler.

Gruß

Norbert

Autor: Benedikt (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das erhöhen get so einfacher:
add ZahlLow, eins
adc ZahlHigh, null
(natürlich müssen vorher noch ein Register mit 0 und 1 geladen
werden).
Am Ende dann überprüfen ob das Ergebnis 10000 beträgt. fertig.

Autor: Norbert (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Super, danke für die schnelle Antwort.

Gruß

Norbert

Autor: Chris (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,
Das Addieren in 16-Bit Breite geht mit nur einem Befehl, wenn man eines
der Doppelregister X, Y, oder Z verwendet. z.B.

adiw r24,1

erhöht r25:r24 um eins, r24 ist dabei das untere Byte. Carry wird
intern behandelt. Der Befehl benötigt zwei Taktzyklen. SBIW ist der
entsprechende Befehl zur Subtraktion.

Gruß

Autor: Norbert (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Das mit ADIW scheint noch besser zu sein. Habe das Programm gleich
geändert, hoffe das der 16-Bit Compare funktioniert. Die Anweisung hab
ich von Atmel
(http://www.atmel.com/dyn/resources/prod_documents/...). Kann
ihn aber gedanklich nicht ganz nachvollziehen.

Autor: ...HanneS... (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Warum zählst du nicht rückwärts? Dann brauchst du nur 0 auszuwerten.

Autor: Andi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hier das ganze stark vereinfacht mit rückwärts zählen:

.def    Time1L = r24
.def    Time1H = r25

HAUPT:    ldi  Time1L,low(10000)  ;Counter auf 10000 (low-byte in r24)
setzen
    ldi  Time1H,high(10000)  ;Counter auf 10000 (high-byte in r25) 
setzen

ZAEHL:    sbiw  Time1L,1    ;16-Bit Counter um 1 verringern
    brne  ZAEHL      ;und solange widerholen solange <> 0

OVER:    rjmp  HAUPT      ;Das ganze von vorne

Mach es Dir doch einfacher in dem Du die Anweisungen low und high
verwendest dann brauchst Du das nicht immer auszurechnen.

Gruß
Andi

Autor: Andi (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Mist, wegen der Textformatierung sieht das jetzt ein bißchen
unübersichtlich aus.
Oben noch mal als Text-File.

Gruß
Andi

Autor: Norbert (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke Andi und natürlich alle anderen die geholfen haben,

die Version werde verwenden.

Gruß

Norbert

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.