Moin,

bei meinem Versuch, einen Kartenleser für einfache Speicherkarten zu entwerfen, bin ich über ein Softwareproblem gestolpert. Es scheint, als würde mein Array mem_main sich ständig verändern.

Hier der Code (relevanter Ausschnitt):
Code:
#include <avr/io.h>
#include <util/delay.h>

#include "uart.h"

#define SM_RST		PC0
#define SM_CLK		PC1
#define SM_IO		PC2
#define SM_PORT		PORTC
#define SM_PIN		PINC
#define SM_DDR		DDRC

unsigned char mem_main[256];

int main() {
	uart_init();
	sm_init();

	sm_read();

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

	return 0;
}

void sm_init() {
	SM_DDR = (1 << SM_RST) | (1 << SM_CLK);
	SM_DDR &= ~(1 << SM_IO);
	SM_PORT = (1 << SM_IO);
}

void sm_read() {
	sm_command(0x30, 0x00, 0x00); // Kommando zum Lesen senden
	SM_PORT &= ~(1 << SM_CLK);
	SM_DDR &= ~(1 << SM_IO);
	SM_PORT |= (1 << SM_IO);
	_delay_us(100);

	for (unsigned int i = 0; i < 256; i++) { // Byte-Schleife
		unsigned char temp_byte; // Temporäres Byte
		for (unsigned char k = 0; k < 8; k++) { // Bit-Schleife
			SM_PORT |= (1 << SM_CLK); // Taktleitung auf H setzen
			if (SM_PIN & (1 << SM_IO)) // I/O-Pin abfragen
				temp_byte |= (1 << k);
			_delay_us(100);
			SM_PORT &= ~(1 << SM_CLK); // Taktleitung auf L setzen
			_delay_us(100);
		}
		mem_main[i] = temp_byte; // Temporäres Byte in Hauptspeicher schreiben
	}
}

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;
}
Seltsamerweise ändern sich vereinzelte Bytes in mem_main[...] anscheinend bei jeder Ausführung von print_mem(), obwohl keine schreibenden Zugriffe mehr stattfinden. Was könnte ich übersehen haben?