Hallo zusammen ich habe folgende Schaltung: Es werden die über den Parallel Port geschickten Daten vom Mikrocontroller auf ein EEPROM geschrieben (funktioniert). Diese sollen später bei Knopfdruck über Usart ausgeben werden (funktioniert auch). Nun habe ich das Problem, dass die Daten nur über Usart geschickt werden, wenn ein Druckerkabel angeschlossen ist. Woran kann das liegen? Kann es an der Definition der Portrichtung liegen? Ein kompletter Port ist als Eingang definiert. Nur zur Übersicht der Signalleitungen und der Funktionsweise: http://www.goblack.de/desy/digitalt/par-schnittstelle/centronics/index.html http://www.netzmafia.de/skripten/hardware/rp1/rp12.html Ich nutze hauptsächlich neben den Datenleitungen Strobe, Busy, Select. Busy und Select sind als Ausgang definiert. Bei fallender Flanke von Strobe wird ein Interrupt ausgelöst. Oder liegt es evt. daran, dass an Strobe bei nicht vorhandenem Druckerkabel kein definiertes Signal ist? Wie kann ich das Problem Schaltungs- oder Softwaretechnisch lösen? Ich verwende ATMega32. Gruß Elbegucker
@ Elbegucker (Gast) >Nun habe ich das Problem, dass die Daten nur über Usart geschickt >werden, wenn ein Druckerkabel angeschlossen ist. Masse (GND) am seriellen Port nicht angeschlossen? >liegen? Ein kompletter Port ist als Eingang definiert. Interne oder externe Pull-Ups benutzt? MFG Falk
Habe gerade noch bemerkt, dass die Schaltung reagiert (exterene Interrupt auslöst) wenn ich an die Strobe -Leitung mit meinem Finger komme. Dadurch werden daten aufs Eeeprom geschrieben, was nicht passieren sollte. was mach ich dagegen?
@ Elbegucker (Gast)
>was mach ich dagegen?
Niederohmigen Pull-Up verwenden, so 1..5KOhm.
Ausserdem, wie soll dein uC Daten auf den UART senden, wenn er keinen
Steuerbefehl per Parallel-Port bekommt? Hat das deine Software
berücksichtigt?
MFG
Falk
Falk Brunner wrote: > Ausserdem, wie soll dein uC Daten auf den UART senden, wenn er keinen > Steuerbefehl per Parallel-Port bekommt? Hat das deine Software > berücksichtigt? Dazu müsste man wissen, ob Elbegucker einen "Hardwareknopf" oder einen "Softwareknopf" meint...
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. */ }
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.