Hallo
Bin ja kurz davor 'nen alten Drucker zu reanimieren. ;)
Hier nun eine verbesserte Variante:
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 Steuersignale:
// PF0: nc 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 strobe (1<<PF2)
#define busy (1<<PF3)
#define ack (1<<PF4)
#define init (1<<PF5)
#define error (1<<PF6)
#define autofeed (1<<PF7)
#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, t;
unsigned char text[14] = "Hello World!\n\r"; //Text string + LFCR
DDRE = 0b11111111; // Datenleitungen DATA0-7
DDRF = strobe | init | autofeed; // Steuerleitungen zum Drucker (Ausgänge)
PORTF = strobe | init | autofeed; // Kein strobe, kein init und kein autofeed
PORTF = busy | ack | error; // PullUps für die Eingangssignale aktivieren
t=PINK; // Tastenstatus einlesen
while(PINK == t); // Hat sich was geändert?
for (i = 0; i<14; i++) //Liest alle Stellen des String (Index 0 bis 13!)
{
while(PINF & busy); // Warten wenn Drucker beschäftigt (busy=high)
PORTE = text[i]; // Legt die Zeichen an den Datenausgang
PORTF &= ~strobe; // Setzt Stobe auf low = Drucker Daten übernehmen
_delay_ms(1);
PORTF |= strobe; // Setzt Strobe wieder auf high
_delay_ms(1);
}
while(1); // Programm darf nie beendet werden!
return(0);
}
(ebenfalls ungetestet)
Ich vermute, der Drucker wurde dauernd im Init gehalten. Diese Version setzt nun auch das Init-Bit.
Nach dem Reset ist Port K sowieso Eingang, deshalb braucht man keine zusätzliche Initialisierung. Allerdings weiß ich immer noch nicht, wie die Taster angeschlossen sind. Schalten sie gegen Vcc oder gegen GND? Externe PullUps/PullDowns?
Der String endet mit LFCR, deshalb kann man das Autofeed beim Drucker deaktivieren. Wenn's mal klappt kannst du das ja ändern...
Die PullUps an den Eingängen sind eher ein Versuch, scheint mir vernünftig. Port K wird bei mir (KamAVR) akzeptiert.
Gruß
mic
P.S.: Der Mega2560 hat tatsächlich einen Port K: http://www.atmel.com/Images/doc2549.pdf
(Über 'nen Mega32u4 bin ich noch nicht hinausgekommen...)
Lesezeichen