Forum: Mikrocontroller und Digitale Elektronik Checksumme


von Alex (Gast)


Lesenswert?

Hallo,

ich sammele Daten auf einer MMC.
Nun würde ich diese gerne per Checksumme sichern. Die Algorithmen, die
man findet sind aber irgendwie alle ein wenige umständlich.

Gibt es keine einfach Möglichkeit, einfach einen Algorithmus (ohne
Look-Up-Table, avrgcc) über 511 Elemente eines unsigned char Array
laufen zu lassen und das Ergebnis im 512. Element zu speichern?

Nach Möglichkeit sollte die Aktion auch keine paar 100ms dauern.

Falls jemand praxistaugliche Tipps hat, wäre ich dankbar. Muss ja nicht
unbedingt eine CRC sein, andere Verfahren sind auch willkommen.

Es geht nur darum zu erkennen, dass ein Sektor komplett beschrieben
wurde (keine Unterbrechung der Spannungsversorgung) und die Daten
konsistent sind.

Danke,
Alex

von Daniel B. (khani)


Lesenswert?

Hallo Alex,

CRC ist IMHO keine sonderlich komplizierte Angelegenheit (solange man
sie nicht wirklich evrstehen möchte). Man kann ganz einfach die
CRC-Funktionalitäten in avr-libc (siehe Dokumentation dazu) verwenden.

Einfacher ist natürlich die Möglichkeit, alle Datenelemente
aufzusummieren und die Summe dann modulo 256 abzulegen (Modulo ist der
ganzzahlige Rest bei der Division - für die die es nicht wissen).

Daneben existieren noch Massen an Verfahren - aber entweder nimmt man
ein schon implementiertes oder ein gaaanz einfaches, es sei denn man
hat spezielle Anforderungen.

MfG, Daniel

von Achim Walther (Gast)


Lesenswert?

Vielleicht kannst Du etwas von dem Algorithmus abschauen, der bei
NMEA-Datensätzen verwendet wird (GPS). Hier mal ein Beispiel
(allerdings in Java!)
1
/**
2
 * calculates the NMEA checksum using XOR. The NMEA checksum does not
3
include the first and last character
4
 * of the message ('$' and '*'). The input parameter has to be
5
provided without these characters.
6
 * @param input   String for checksum calculation.
7
 */
8
public static String getChecksum(String input)
9
{
10
    byte result = 0;
11
    int len = input.length();
12
    for (int i=0; i < len; i++) {
13
        result ^= input.charAt(i);
14
    }
15
    
16
    return Integer.toHexString((int) result).toUpperCase();
17
}

Gruß, Achim.

von Bob (Gast)


Lesenswert?

du kannst die gesendeten daten addieren, und dann durch die anzahl
dividieren. dieses schreibst du am ende mit rein da hast du immer einen
vergleich.

von Alex (Gast)


Lesenswert?

Hallo,

danke euch beiden für die Tipps (dass ich an die libc nicht selbst
gedacht habe ärgert mich).

Mal schauen, welche Variante am praktikabelsten ist.

Alex

von Alex (Gast)


Lesenswert?

Hmm, zu langsam ...

Also danke euch dreien :-)

von Unbekannter (Gast)


Lesenswert?

Naja, kommt eben darauf an, welche Fehler Du entdecken willst.

Und Du kannst bei einer CRC auch die Tabelle weglassen, dann wird's
eben ein wenig langsamer.

Aber die Angabe "100 ms" ist eben sehr relativ. Ein
Low-Power-Prozessor mit 100 kHz macht da deutlich weniger als ein mit
100 MHz getakteter Signalprozessor...

von Alex (Gast)


Lesenswert?

AVR Kern bei 16MHz wenn es dir hilft :-)

Nur hat der halt nebenbei noch ziemlich viel anderes zu tun...

von Fritz G. (fritzg)


Lesenswert?

Nimm doch einfach das crc aus der avr-libc, die Verwendung ist ganz
einfach:

  mycrc = 0xffff;
  for (i = 0; i < len; i++)
  {
    mycrc = _crc_ccitt_update (mycrc, string[i]);
  }

von Alex (Gast)


Lesenswert?

Schon klar, ist alles andere als mein erstes gcc-Projekt. Wichtig war,
dass sogar der äquivalente C-Source beigelegt ist, damit ich auf der PC
Seite ohne Probleme das Gegenstück implementieren kann.

Alex

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.