Forum: Mikrocontroller und Digitale Elektronik Parallel Port Problem


von Elbegucker (Gast)


Lesenswert?

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

von Falk B. (falk)


Lesenswert?

@ 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

von Elbegucker (Gast)


Lesenswert?

Gnd am seriellen Port ist angeschlossen
keine externe pull-ups verwendet

von Elbegucker (Gast)


Lesenswert?

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?

von Micha (Gast)


Lesenswert?

nicht anfassen ;-)

von Falk B. (falk)


Lesenswert?

@ 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

von Der M. (steinadler)


Lesenswert?

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...

von Elbegucker (Gast)


Lesenswert?

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.  */
}

von Elbegucker (Gast)


Lesenswert?

??

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
Noch kein Account? Hier anmelden.