Leider trifft beides nicht zu. Ich habe aus Jux einfach mal nach dem ersten Aufruf von print_mem() die Speicherkarte herausgezogen, am Ausgang meiner "Experimente" hat das jedoch nichts geändert.

Watchdog habe ich sicherheitshalber auch nochmal überprüft, der ist definitiv aus.

EDIT: Folgender Code läuft im Übrigen anstandlos:
Code:
// µC: ATmega644

#include <util/delay.h>
#include <avr/io.h>

#ifndef F_CPU
#define F_CPU 14745600UL
#endif
#define BAUD 9600UL
#define UBRR_VAL ((F_CPU+BAUD*8)/(BAUD*16)-1)

volatile unsigned char mem_main[256];

int main() {
	uart_init();

	for (unsigned int i = 0; i < 256; i++) {
		mem_main[i] = i;
	}

	for (;; _delay_ms(1000)) {
		for (unsigned int i = 0; i < 256; i++) {
			uart_putc(mem_main[i]);
		}
	}
	return 0;
}

void uart_init() {
	UBRR0H = (unsigned char) (UBRR_VAL >> 8);
	UBRR0L = (unsigned char) (UBRR_VAL);
	UCSR0B = (1 << TXEN0);
	UCSR0C = (1 << UCSZ01) | (1 << UCSZ00); // Asynchron 8N1
}

void uart_putc(unsigned char c) {
	while (!(UCSR0A & (1 << UDRE0))) {
	}
	UDR0 = c;
}
EDIT 2: Wenn ich in meinem Programm die Baudrate auf 300 Stelle, scheint alles korrekt anzukommen. Wie kann sowas sein?

EDIT 3: Zugegeben, ein dritter Edit ist schon peinlich, aber ich wurde das ungute Gefühl nicht los, dass mein Terminalprogramm nichts taugt. Die Vermutung hat sich bestätigt, mit hTerm funktioniert alles, wie es soll.
Ich bitte somit um Verzeihung, dass an der völlig falschen Stelle gesucht werde und danke euch beiden für eure Hilfe.