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?
Lesezeichen