mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Modulo 7 mit atmega16


Autor: Stifu (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Leute,

ich hab mich schon hier mit der Suchfunktion durch das Forum gewühlt und 
auch google hab ich schon befragt, jedoch bin ich noch zu keinem 
Ergebnis gekommen.

Es geht um Modulo Rechnen mit einem Atmel 8Bit Prozessor und zwar dem 
mega16. Wie man das Modulo bei einer Divison durch eine gerade Zahl 
bildet, ist mir klar, jedoch bräuchte ich das Modulo bei einer division 
durch 7. Ich komm einfach nicht zur Lösung.

Ich bin mir sicher, dies ist nicht allzu schwer und jemand von euch kann 
mir da weiterhelfen.

Grüsse Stifu

Autor: Kai G. (runtimeterror)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wo ist der Unterschied zwischen einer geraden und einer ungeraden Zahl 
bezüglich der Modulo-Operation?

Ich sehe da keinen.

Wenn du Zweierpotenzen meinst kommt man ohne Modulo-Operation aus.

Welche Sprache hättest du gerne?

Autor: Torsten (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Mussten den Modulo in der Uni schonmal programmieren in ASM für ne 
Plattform die sich Compi16 nannte. Hab hier nen Link wpo man sich so ein 
Programm mal anschauen kann
http://et.netaction.de/et/file/files/645/sim-S03.TXT
Ist eigentlich recht simpel zu programmieren.

Autor: Kai G. (runtimeterror)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Vielleicht findest du hier auch noch die eine oder andere Info: 
Beitrag "AVR/ Teilbarkeit durch 100 und 400"

Autor: Kai G. (runtimeterror)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sorry Torsten, aber die Dokumentation zu dem Quelltext finde ich nicht 
wirklich hilfreich - sie erklärt nur die einzelnen Zeilen und nicht den 
Algorithmus.

In Kurzschreibweise macht der Code Folgendes um a mod b zu berechnen:

Ziehe von einer Zahl a sooft es geht die Zahl b ab. Der verbleibende 
Rest ist a mod b

while (a >= b) a -= b;

a := a mod b

Das ist aber bei großen a und kleinem b extrem langsam!

Zudem schreibt Stifu ja auch, dass er die Modulo-Rechnung generell 
beherrscht.

Autor: Stifu (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Vielen dank für die schnellen Antworten.

Also ich bräuchte den Algorithmus für die Programmiersprache Assembler. 
Bei geraden Zahlen ermittle ich das Modulo indem ich die gewünschte Zahl 
mit Divisor-1 verande.

Also bei 8 % 4 verande ich 8 mit 4 das ergibt das Modulo daraus also 0. 
Dies ist leider bei ungeradem divisor nicht möglich. Die Variante mit 
abziehen kenn ich, jedoch ist die mir zu Zeitaufwendig. Ich bräuchte 
eine möglichst kurze Operation. Kennt ihr da was passendes?

Autor: Kai G. (runtimeterror)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das hat nichts damit zu tun, dass die Zahl gerade ist, sondern eine 
Zweierpotenz, wie oben schon geschrieben. Mit der Zahl 6 funktioniert 
das z.B. nicht!

Es gibt viele Verfahren das zu lösen. Die Holzhammermethode ist oben ja 
schon beschrieben worden. (fortlaufendes Subtrahieren)

Die elegante Methode ist eine binäre Division, welche vergleichsweise 
anspruchsvoll ist. Unter dem obigen Querverweis zu dem anderen Thread 
habe ich den Algorithmus für konstante Divisoren bereits beschrieben. 
Gib Bescheid, wenn du den nicht verstehen solltest.

Die schnellste (aber speicherhungrigste Methode) ist eine Lookup-Tabelle 
in der für jede Zahl der Rest vermerkt ist (vorberechnete Werte).

Autor: Stifu (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Stimmt da hab ich in der Eile die geraden Zahlen mit denen der 
Zweierpotenz verwechselt. Mein Fehler.

Also bei deinem Link und deiner Erklärung seh ich nicht ganz durch, ich 
wäre über ein klein wenig 'nachhilfe' von dir erfreut.

Zudem hab ich noch ein zweites Problem. Also ich bin momentan dabei eine 
Uhr mit Datum in Assembler zu programmieren. Zeit und Datum funktioniert 
soweit ohne Probleme und wird auch auf einem Display angezeigt. Nun 
kommt es aber zur Wochentagsberechnung. Gibt es da eine gescheite Formel 
welche einfach in Assembler realisierbar ist?

Zum andern hätt ich da ne Frage zur Ausgabe auf dem Display, wenn ich 
den Wochentag mal berechnte habe. Was ist die schönste Methode, ich habe 
schon eine Funktion fürs LCD geschreiben, welche einen String ausgibt. 
Ich hab auch schon gelesen, dass die Wochentagsausgabe einfach über eine 
Stringtabelle gespeichert werden kann und je nach Wochentag den 
entsprechenden String auf dem Display erscheinen lassen kann.
Nur weiss ich nocht nicht ganz, wie ich das anstellen soll.

Ich hoffe ihr könnt mir meine Fragen beantworten.

Grüsse

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.