Hallo
Vielleicht funktioniert es auch nur mit Busy:
(ungetestet)Code:// Druckeransteuerung mit AVR über Centronics-Schnittstelle mic 7.4.2012 // https://www.roboternetz.de/community/threads/57421-Anf%C3%A4nger-Quellcode // PORTE ist D0-D7 // PORTF sind die Steuersigale: // PF0: Selin Out Low = Drucker ausgewählt // PF1: nc Out // PF2: Strobe Out fallende Flanke = Datenübernahme // PF3: Busy In Low = nicht beschäftigt // PF4: ACK In Low = Übernahmebestätigung // PF5: INIT Out Low = Drucker initialisieren // PF6: ERROR In Low = Fehler aufgetreten // PF7: Autofeed Out Low = Linefeed bei CR // http://www.hardwareecke.de/berichte/schnittstellen/centronics.php // http://de.wikipedia.org/wiki/IEEE_1284 #define F_CPU 16000000 // Taktfrequenz des myAVR-Boards #include <avr\io.h> // AVR Register und Konstantendefinitionen #include <util/delay.h> int main(void) { unsigned char i; unsigned char text[14] = "Hello World!\n\r"; //Text string + LFCR DDRE = 0b11111111; // Datenleitungen DATA0-7 DDRF = 0b10100111; // Steuerleitungen vom/zum Drucker DDRK = 0b00000000; // An alle Pins sind Taster angeschlossen PORTK= 0b00000000; // Wie sind die Taster angeschlossen? //PORTK= 0b11111111; // bei Bedarf Tastenpullups einschalten PORTF |= (1<<PF7); //Schaltet Autofeed aus PORTF |= (1<<PF2); //Setzt Strobe auf high while(PINK == 255); //Wartet auf einen Tastendruck for (i = 0; i<14; i++) //Liest alle Stellen des String (Index 0 bis 13!) { while(PINF & (1<<PF3)); // Warten wenn Drucker beschäftigt (busy=high) PORTE = text[i]; // Legt die Zeichen an den Datenausgang PORTF &= ~(1<<PF2); // Setzt Stobe auf low = Drucker Daten übernehmen _delay_ms(1); PORTF |= (1<<PF2); // Setzt Strobe wieder auf high _delay_ms(1); } while(1); // Programm darf nie beendet werden! return(0); }
Gruß
mic
P.S.:
Achtung, alle nicht extra gesetzte Steuersignale zum Drucker sind low!







Zitieren

Lesezeichen