Hallo
Vielleicht funktioniert es auch nur mit Busy:
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);
}
(ungetestet)
Gruß
mic
P.S.:
Achtung, alle nicht extra gesetzte Steuersignale zum Drucker sind low!
Lesezeichen