Trabukh
16.06.2010, 06:46
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):
#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?
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):
#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?