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):
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?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; }







Zitieren

Lesezeichen