ATmega 1284P stürzt bei serialEventRun() ab

Hallo zusammen,

ich bastle im Moment an einem Projekt mit dem Mega 1284p (16 MHz). Ich nutze den Mighty1284 Core ohne Bootloader und alles klappt auch soweit. Aber sobald ich die Serielle Schnittstelle verwende zeigt sich ein seltsames Verhalten: Die Kommunikation funktioniert bis zu einem gewissen Punkt, das folgende Programm läuft und gibt mir genau die gesendeten Daten zurück. Dazwischen sind jedoch ein paar Null-Bytes obwohl ich nur druckbare Ziechen gesendet habe gesendet habe. Naja, damit kann man evtl. noch leben. Aber schlimmer: Nach einer gewissen (zufälligen) Anzahl von gesendeten Zeichen stürzt der ATmega ab. Ich konnte das Problem auf die Funktion serialEventRun() in der Arduino-Main zurückverfolgen, da der PIN A0 LOW ist wenn der Controller einfriert. Dann reagiert der Controller auf keinerlei serielle Daten mehr, die PMW an PIN 14 (PORTD bit 6) die ich zum Testen mal angemacht habe, geht aber weiterhin.

void setup() {
  DDRA |= 1;             //PIN A0 Output
  Serial.begin(9600);
  pinMode(14,OUTPUT);
  analogWrite(14,128);   //PWM on PIN D6
}

void loop() {
  PORTA |= 1;   //PIN A0 HIGH
  if (Serial.available()) Serial.write(Serial.read());
  PORTA &= ~1;  //PIN A0 LOW
}

Sorry für die Mischung aus Ardiuno-Befehlen und die Direkte Port Manipulation, das Programm entstand während dem Testen.

Edit: hier mal eine Testausgabe:
▒123467890asdfg▒hj▒klöäyxcv (Hier Absturz)
eingegeben habe ich:
1234567890asdfghjklöäyxcvbnm

Ach ja: ich benutze Putty als Terminal und einen Arduino Duemilanove ohne Atmega für den FTDI.

Ich hoffe hier kann mir jemand weiterhelfen und weiß woran das liegt (evtl mit Kristallkugel?!? :wink: ), ich bin echt am verzweifeln...
Gruß,
Marv

Probier mal die entsprechende Zeile in main.cpp auszukommentieren. Braucht sowieso kein Mensch.
Das existert nur damit serialEvent() funktioniert. Eine total überflüssige Funktion, da sich nur am Ende von loop() ausgeführt wird. Da kann man es auch gleich selbst machen.

int main(void)
{
 init();

 initVariant();

#if defined(USBCON)
 USBDevice.attach();
#endif
 
 setup();
    
 for (;;) {
 loop();
 if (serialEventRun) serialEventRun();
 }
        
 return 0;
}

Das funktioniert folgendermaßen. Die serialEvent() Funktionen sind als weak deklariert. Das heißt wenn die Funktion nicht vom Benutzer definiert wird, wird sie vom Linker auf 0 gesetzt und die Abfrage ist false. Irgendwo da kann auch den Problem liegen, wenn das der Mighty1284 Core nicht richtig behandelt. Dann springst du in den Reset Vektor.

Super, das löst das Problem! Danke für die schnelle Antwort. ich versteh zwar immer noch nicht, wozu dann die Funktion überhaupt drin ist, aber na gut.

Irgendwelche Ideen wegen den "0"-Bytes in der Übertragung?

Da ist ja auch mein angemerktes “init()” aus einem anderen Thread drin. Was heißt bei dir "0"Bytes?

sschultewolter:
Da ist ja auch mein angemerktes "init()" aus einem anderen Thread drin.

Das macht doch nur die initialisierung der Timer und so, dachte ich?!

sschultewolter:
Was heißt bei dir "0"Bytes?

Dass ich statt dem korrekten Character (Ascii) 0x00 zurück bekomme. Manchmal mogeln sich 0x00-Bytes auch einfach zwischen zwei character in der Zeichenkette die ich gesendet habe.