www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Problem bei umstellung von ATMega32 auf ATMega644


Autor: Tobias (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,
ich hatte bisher auf einem ATMega32 programmiert auf dem ich unter 
anderem einen OC Ausgang betrieben habe:
TCCR2 = (1 << CS22);  //Timer2 auf FCPU/64 einstellen
TCCR2 |= (1 << WGM21); // CTC Modus (Timer2 wird bei erreichen von OCR2 zurück gesetzt
OCR2 = 108; //Compare Match alle 1/4048Hz
TCCR2 |= (1 << COM20)
TIMSK |= (1<<TOIE2);    //Timer2 wird aktiviert
da ich nun zwecks Platzproblemen auf einen Pinkompatiblen ATMega644 
umgestiegen bin, musste ich einige Register anpassen. Aus dem obigen 
Code ist folgender geworden:
TCCR2A = (1 << CS22);  //Timer2 auf FCPU/64 einstellen
TCCR2A |= (1 << WGM21); // CTC Modus (Timer2 wird bei erreichen von OCR2 zurück gesetzt
OCR2A = 108; //Compare Match alle 1/4048Hz
TCCR2A |= (1 << COM2A0)
TIMSK2 |= (1<<TOIE2);    //Timer2 wird aktiviert

nur leider passiert beim 644 gar nichts. Ich sehe auch in den 
Datenblätter keine Gründe warum das nicht funktionieren sollte.

Autor: Bensch (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Es gibt eine Migration Note AVR505 von Atmel

Autor: Tobias (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
dem Dokument zufolge müsste es funktionieren :/

Autor: holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
TCCR2A = (1 << CS22);  //Timer2 auf FCPU/64 einstellen

CS22 gibt es nur in TCCR2B

Autor: Oliver (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>dem Dokument zufolge müsste es funktionieren :/

Nö. Ein Register ist falsch.

644er Datenblatt öffnen, per mit Textsuche alle Konfigurationsbits 
suchen, und nachschauen, in welchem Register die stecken. Am einfachsten 
in Kapitel 29 "register summary".

Oliver

Autor: Tobias (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo nochmals,
leider sind die Probleme noch nicht gelöst. Die verwendeten Timer 
funktionieren nun auch auf dem 644, aber was ich nicht zum laufen kriege 
ist die USART Schnittstelle.

Initialisierung ATMega32:
  UBRRH = UBRR_VAL >> 8;
  UBRRL = UBRR_VAL & 0xFF;
   
  UCSRB = (1<<RXEN)|(1<<TXEN)| (1 << RXCIE);      //UART TX einschalten
  UCSRC = (1<<URSEL)|(1<<USBS)|(3<<UCSZ0);      //8 data, 2 stop bits
ATmega 644:
  UBRR0H = UBRR_VAL >> 8;
  UBRR0L = UBRR_VAL & 0xFF;
   
  UCSR0A = 0;
  UCSR0B = (1<<RXEN0)|(1<<TXEN0)| (1 << RXCIE0);      //UART TX einschalten
  UCSR0C = (1<<USBS0)|(3<<UCSZ00);      //8 data, 2 stop bits

Der Interrupt wird bei Empfang einer Botschaft ausgelöst und er springt 
in die Funktion in der ich die Bytes einer Botschaft weiter bearbeite, 
allerdings scheinen die Bytes nicht korrekt gelesen zu werden, da 
bereits das Startbyte im ATMega644 nicht erkannt wird (funktioniert im 
ATMega32 alles problemlos
ATMega32:
void ProcessRXByte(void){

uint8_t RX_Byte = RXB;

  if ((RX_Byte == 170) && (ReadingFrame == 0)){
//Startbyte
    RS_CRC_SUM = 0;
    ReadingFrame = 1;
    RS_Frame_len = 0;

  }
  else if (ReadingFrame == 1) {
    if (RS_Frame_len == 0) {      // Zweites Byte = Länge und Adresse
      if ((RX_Byte & 7) != HOME_ADDR){
        ReadingFrame = 0;
        return;
    }
      RS_data_len = ((RX_Byte >> 3) & 0x1F);
      RS_Frame_len = RS_data_len + 3;
    }
    else if ((RS_Frame_len - RS_data_len) == 2) {    // Drittes Byte = Identifier
      RS_Identifier = RX_Byte;
    }
    else if (RS_Frame_len == 1) {    // CRC Byte

      RS_CRC = RX_Byte;
      ReadingFrame = 0;
      if ((RS_CRC_SUM % 256) == RS_CRC) {
        pfunc = Botschaftsliste[RS_Identifier];
        LastMsgContact = 0;
        (*pfunc)();    //Funktion entsprechend des Identifiers aufrufen
      }
      else {    // CRC-Prüfung nicht bestanden
        fcn_crc_error();
      }

    }
    else {  // Datenbytes
      RS_DataBuffer[RS_data_len + 1 - RS_Frame_len] = RX_Byte;
    }
    RS_CRC_SUM += RX_Byte;
    RS_Frame_len--;
  }
}
ATMega644:
void ProcessRXByte(void){

uint8_t RX_Byte = RXB;

  if ((RX_Byte == 170) && (ReadingFrame == 0)){
//Startbyte
                SET_LED_USR1;   // LED geht an zu zeigen dass ein Startbyte erkannt wurde
    RS_CRC_SUM = 0;
    ReadingFrame = 1;
    RS_Frame_len = 0;

  }
  else if (ReadingFrame == 1) {
    if (RS_Frame_len == 0) {      // Zweites Byte = Länge und Adresse
      if ((RX_Byte & 7) != HOME_ADDR){
        ReadingFrame = 0;
        return;
    }
      RS_data_len = ((RX_Byte >> 3) & 0x1F);
      RS_Frame_len = RS_data_len + 3;
    }
    else if ((RS_Frame_len - RS_data_len) == 2) {    // Drittes Byte = Identifier
      RS_Identifier = RX_Byte;
    }
    else if (RS_Frame_len == 1) {    // CRC Byte

      RS_CRC = RX_Byte;
      ReadingFrame = 0;
      if ((RS_CRC_SUM % 256) == RS_CRC) {
        pfunc = Botschaftsliste[RS_Identifier];
        LastMsgContact = 0;
        (*pfunc)();    //Funktion entsprechend des Identifiers aufrufen
      }
      else {    // CRC-Prüfung nicht bestanden
        fcn_crc_error();
      }

    }
    else {  // Datenbytes
      RS_DataBuffer[RS_data_len + 1 - RS_Frame_len] = RX_Byte;
    }
    RS_CRC_SUM += RX_Byte;
    RS_Frame_len--;
  }
}

Hoffe auf Hilfe.

Danke

Autor: Tobias (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ich merk grad, die beiden Funktionen sind ja identisch. Sollten sie ja 
auch sein. Also sind die Unterschiede nur in der Initialisierung (und 
beim Senden, was im Moment aber noch zweitrangig ist solang die 
Botschaften noch nichtmal gelesen werden können).

Autor: Tobias (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Berechnung von UBBR_VAL bei beiden µC identisch:
#define F_CPU 14745600L 
#define BAUD 115200L

#define UBRR_VAL ((F_CPU+BAUD * 8)/(BAUD*16)-1)      //clever runde
#define BAUD_REAL (F_CPU/(16*(UBRR_VAL+1)))         //reale Baudrate

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.