mikrocontroller.net

Forum: Compiler & IDEs Zmodem Problem


Autor: Sander R. (degusan)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,
ich hab ein großes Problem. Ich soll auf einen AVR (Mega32 -> Mega128 
und AVR GCC) ein Zmodem Protokoll implementieren. Nach einem ausgiebigen 
Studium der offiziellen Doku des Protokolls und nahe zu aller gefundenen 
Google Ergebnisse hatte ich es zuerst mit einem eigenem Code versucht. 
Aus Zeitgründen bin ich dann zum Code von Radu Hristea gewechselt. 
Dieser ist ja für CodeVision verfasst, was kleine Änderungen nötig 
machte.
Nun läuft die Übertragung bis zum senden des erst BinHeaders (HyperTerm 
startet den Datenempfang), dann kommt nach dem Senden des zweiten CRC-16 
Bytes zu der Fehlermeldung „fehlerhaftes Datenpaket“. Daher meine 
Vermutung dass die CRC- Berechnung nicht richtig läuft. Versucht hab ich 
es mittlerweile mit der Berechnung von Radu Hristea, einen Code hier aus 
dem Forum von J.St. (Gast) und einen aus der Doku zum Xmodem Protokoll. 
Alle drei führen zu dem selben Fehler. Beim Code von J.St. (Gast) habe 
ich auch die unterschiedlichsten Generatoren versucht (weiß jemand den 
definitiven Richtigen Zmodem Generator).  Da nun bis Montag alles fertig 
werden soll, meine Anfrage: hat jemand einen funktionierenden Code in 
AVR GCC für Zmodem, Xmodem oder Ymodem Protokoll oder sieht den Fehler 
in der CRC Berechnung.

//---------------------------------------------------------------------- 
-------
word rZModem_crcUpdate(unsigned int crc, unsigned int serialData)
//---------------------------------------------------------------------- 
-------
{   // Please, DO NOT MODIFY ! Any change may cause severe malfunction !
/*asm(
  "ldd   r30, y+2\n"
  "ldd  r31, y+1\n"
  "ld   r27, y\n"
  "eor  r30, r27\n"
  "mov  r26, r30\n"
  "swap r26\n"
  "andi r26, 0x0f\n"
  "eor  r30, r26\n"
  "mov  r26, r30\n"
  "swap r26\n"
  "andi r26, 0xf0\n"
  "eor  r31, r26\n"
  "mov  r26, r30\n"
  "swap r26\n"
  "andi r26, 0xf0\n"
  "lsl  r26 \n"
  "mov  r27, r30  \n"
  "lsr  r27  \n"
  "lsr  r27  \n"
  "lsr  r27  \n"
  "eor  r31, r27  \n"
  "eor  r30, r26 \n"
);*/
unsigned int mask = 0x8811;//0xA001;
  unsigned char i;
  for(i=0;i<8;i++)
  {
    if((crc ^ serialData) & 1) { crc=(crc>>1)^mask; }
    else crc>>=1;
    serialData>>=1;
  }
 /* unsigned char i;
  for(i=8; i>0;i--)
  {
   if (crc & 0x8000)
   {
         crc <<= 1;
         crc += (((serialData<<=1) & 0400)  !=  0);
         crc ^= 0x1021;
     }
     else
   {
         crc <<= 1;
         crc += (((serialData<<=1) & 0400)  !=  0);
     }
  } */
  return (crc);

}

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.