Forum: Mikrocontroller und Digitale Elektronik Modulo Ergebniss


von tk (Gast)


Lesenswert?

Hallo, ich habe ein Problem mit einem Modulo vergleicher. Ich lese aus 
einem FAT Dateisystem Cluster informationen rein zB. (0x0003) mit diesem 
"vergleicher"

while(( Cluster_Location_Address % 512) != 0)
{
    Address_Overflow++;
    Cluster_Location_Address--;
}

Das geht gut und recht bis zu 0x0080, am Anfang multipliziere ich den 
Wert noch mals 2, also 0x0100...Dann gibt es Probleme.. Kann es sein 
das, das Modulo Ergebnis nur 8bit ist? Der höchste Wert den der Modulo 
"vergleicher" rechnen musst ist logischer weise 511 bzw. 510.. Wie kann 
ich dieses Problem umgehen? Es wäre sehr ärgerlich wenn modulo nur bis 
8bit geht...

Grüsse

von jÜrgen (Gast)


Lesenswert?

welcher prozessor?
welcher compiler?

und ein wenig mehr C-Code... welche deklarationen hast du gemacht?

von tk (Gast)


Lesenswert?

Also ist ein PIC18F8520, compiler ist MPLAB C18   und deklarationen wie 
folgt:

  unsigned long int Cluster_Location_Address;
  unsigned short int Address_Overflow;

von jÜrgen (Gast)


Lesenswert?

ich kenn MPLAB zwar nicht, aber hast du schon mal versucht eine variable 
mit dem modulo ergebniss zu beschreiben und dann im debug modus 
anzusehen?

von Bartholomäus S. (sam_vdp)


Lesenswert?

Zu deinen Moduloproblem direkt kann ich dir nichts sagen, aber einen 
Tipp am Rande hab' ich: Modulo-Operationen mit Zweierpotenzen gehen sehr 
schön mit bitweisem "und":
x%(2^n)=x&(2^n-1)

x % 512 = x & 511

Beispiel:
7%4=3 bzw.:
7=111.b
4-1=3=11.b
7&3=111.b & 11.b=11.b=3

Bitweise Operationen sollte der Compiler ja mit mehr als 8 Bit machen 
können und diese Variante ist sogar noch einiges schneller (war 
zumindest bei mir auf nem XScale so: 
http://www.pocketmatrix.com/forums/viewtopic.php?t=15995&highlight= )

Beste Grüße,
Bartl

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.