Forum: Mikrocontroller und Digitale Elektronik Modulo 7 mit atmega16


von Stifu (Gast)


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

von Kai G. (runtimeterror)


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?

von Torsten (Gast)


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.

von Kai G. (runtimeterror)


Lesenswert?

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

von Kai G. (runtimeterror)


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.

von Stifu (Gast)


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?

von Kai G. (runtimeterror)


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).

von Stifu (Gast)


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

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.