Hallo
@ Falk Brunner
Nun das mit dem niederohmigen Pul-up hat schonmal funktioniert. Der
Mikrocontroller muß sich in dem Strobe-Interrupt aufgehängt haben.
Verwende ATMega32, EEPROM AT24C512B
Allerdings habe ich nun bei genauerem Hinsehen festgestellt, dass die
Daten doch nicht korrekt ausgegeben werden.
Buchstabe werden verschluckt, andere doppelt geschrieben.
Dies kann ja mehrere Gründe haben:
1.) Es gibt Probleme mit dem Intterrupt
2.) Die richtigen Daten liegen noch nicht an, wenn bereits aufs EEPROM
geschrieben wird.
(Was eigentlich nicht der Fall sein sollte, da der Interrupt erst
ausgelöst werden soll, nachdem die richtigen Daten anliegen. So ist es
jedenfalls für den Parallel Port beschrieben.)
3.) Es gibt an sich Probleme beim Schreibvorgang aufs EEPROM
3.) Uart-Probleme
Dies ist die Ausgabe-Routine für den Uart:
// on keypress (PC2) send the data saved in the EEPROM to the usart
// interface
if (debounce(&PINC, PC2)){
word_address = 0;
first_word_address = 0;
seconde_word_address = 0;
i2c_start();
i2c_device_address(Dev_AT24C512+I2C_WRITE);
// set device address and write mode
i2c_write(first_word_address);
i2c_write(seconde_word_address);
// word address = 0x00
i2c_start();
i2c_device_address(Dev_AT24C512+I2C_READ);
// set device address and read mode
i2c_read_Ack();
// read one byte, send acknowledge for next byte
while (TWDR != 0x17){
send_to_usart(TWDR);
i2c_read_Ack();
word_address++;
}
i2c_read_Nack();
// read one byte, send no acknowledge
i2c_stop();
// set stop condition = release bus
first_word_address = (word_address >> 8);
seconde_word_address = (word_address & 0xFF);
send_start = 0;
} //if end
Nun habe ich mal folgendes ausprobiert:
Ich lasse die Daten nicht auf EEPROM schreiben, sondern gebe sie direkt
auf dem Uart aus. Zunächst einmal es werden keine Buchstaben doppelt
geschrieben oder verschluckt. Aber komischerweise wird mein Dokument
entweder ganz oder nur teilweise über den Uart ausgeben.
Liegt es nun an der Uart-Schnittstelle? Weiß jemand Rat?
Auszug aus dem Quelltext:
ISR (INT2_vect){ // STROBE impulse
PRINTER_PORT |= (1<<BUSY); // set BUSY
send_to_usart(DATA);
PRINTER_PORT &= ~(1<<BUSY);
} // ISR end
void send_to_usart(unsigned char data) {
while (!(UCSRA & (1<<UDRE))); // wait until sending is possible
// --> UART Data Register Empty UDRE=1;
UDR = data;
/* The Uart Data Register is empty, the previous assignment was
completed. Writes the sign "data" on the interface. */
}