www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Problem mit Modulo-Funktion "__udivmodqi4"


Autor: Dieter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich benötige in meinem Programm eine modulo-Operation und verwende dafür 
die Funktion "__udivmodqi4".

typedef struct
{
   uint8_t quot; /* Quotient */
   uint8_t rem;  /* Rest */
} udiv8_t;

extern udiv8_t udiv8 (uint8_t, uint8_t) __asm__("__udivmodqi4");

...
udiv8_t daten;
daten = udiv8(GlobalArray[i],16);
...

Der berechnete Quotient und Rest stehen im Register r24,r25. Aber die 
Ergbnisse werden nicht in die Struktur "daten" geschrieben. Wieso nicht?
In "daten" steht immer 0 und 1 drin (r30, r31).
Ich benutze das AVRStudio 4.18.

Kann mir da jemand bitte weiterhelfen, wieso das so ist?

mfg

Autor: Stefan B. (stefan) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Kann ich nicht nachvollziehen bzw. bei mir stimmt es mit 
WinAVR-20071221.

Vollständiges Beispiel
(Ersatz der beiden undefinierten Variablen GlobalArray und i durch 
eine Konstante. Die Berechnung wird weiterhin zur Laufzeit vorgenommen)

#include <avr/io.h>

typedef struct
{
   uint8_t quot; /* Quotient */
   uint8_t rem;  /* Rest */
} udiv8_t;

extern udiv8_t udiv8 (uint8_t, uint8_t) __asm__("__udivmodqi4");

int main(void)
{
  udiv8_t daten;
  daten = udiv8(240,16);
  asm volatile("nop"); // Breakpoint für Watch 'daten'
}

Relevanter Ausschnitt aus dem Disassemblat

14: daten = udiv8(240,16);
+00000037: LDI     R22,0x10   Load immediate
+00000038: LDI     R24,0xF0   Load immediate
+00000039: RCALL   PC+0x000D  Relative call subroutine
+0000003A: STD     Y+2,R25    Store indirect with displacement
+0000003B: STD     Y+1,R24    Store indirect with displacement
15: asm volatile("nop"); // Breakpoint für Watch 'daten'
+0000003C: NOP                      No operation

Für mich sieht das korrekt aus. Die beiden Zeilen mit STD speichern das 
Ergebnis in die Variable daten.

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.