Moin, habe schon gesucht aber nichts gefunden... Gibt es eine einfache Möglichkeit den 10bit Wert des ADC des atmega8 mit Rest durch eine bestimmte Zahl zu teilen und dann sowohl das ergebnis als auch den Rest zu erhalten, also z.B. 100/16=6 Rest 4 ? Das ginge natürlich über eine Schleife, die immer wieder von 100 16 subtrahiert und wenn das nicht mehr möglich ist das Ergebnis und den Rest ausgibt. Ist aber komplizierter und dauert lange, besonders wenn ich das mal mit einem externen 12 oder 16 bit ADC machen möchte. Gruß Dussel
Hallo, naja, wenn Du durch eine 2er Potenz teilst, ist es einfach... /16 bei 16Bit Wert: in als 16 Bit in YH, YL mov ZL,YL mov ZH,YL andi ZL, 0xF0 ; untere 4 Bit auf 0 -> ergibt (Wert/16)*16 sub YL,ZL sbc YH,YL ; der Rest ind YH/YL lsr ZH ; 4x rechts schieben (Wert/16) ror ZL lsr ZH ror ZL lsr ZH ror ZL lsr ZH ror ZL ; Ergebnis in ZH/ZL Wenn nicht, dann eben normale Division, da bleibt der Rest auch in einem Register übrig. Gruß aus Berlin Michael
Die Funktion div aus dem Header <math.h> (bzw. std::div aus <cmath> falls du C++ programmierst) macht das explizit: http://www.cppreference.com/stdmath/div.html Ansonsten optimieren AFAIK auch manche Compiler int quot = a / b; int rem = a % b; so, dass nur eine Division stattfindet.
Bei einer Division durch 16 ist es besonders einfach. Die unteren 4 Bits sind der Rest. In C: z.B. 100%16
Hab ich vergessen zu schreiben, mache das in Assembler. Und das mit der 16 war nur ein Beispiel. Kann jeder beliebige Wert sein. Das Problem ist halt, dass die Zahl auf zwei Register aufgeteilt ist, die beiden Register vom ADC.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.