www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Checksumme


Autor: Alex (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Daniel Braun (khani)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Achim Walther (Gast)
Datum:

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

Gruß, Achim.

Autor: Bob (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Alex (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Alex (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hmm, zu langsam ...

Also danke euch dreien :-)

Autor: Unbekannter (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: Alex (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
AVR Kern bei 16MHz wenn es dir hilft :-)

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

Autor: Fritz Ganter (fritzg)
Datum:

Bewertung
0 lesenswert
nicht 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]);
  }

Autor: Alex (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

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.