Hallo Leute,
ich bin ja schon länger im Bereich AVR Programmierung unterwegs. Allerdings bisher in Basic. Jetzt wollte ich ein neues Projekt anfangen (bzw. ein altes wieder aufnehmen), nur dass ich es diesmal in C verwirklichen will. Ich will einen Drucker ansteuern, per Parallel-Port versteht sich, und habe dazu das hier gefunden. Ich hab allerdings ein anderes Board und daher auch eine andere Pinbelegung. Ich als Basicer bin erschlagen von der Komplexität der Sprache C was Port- und Pinzuweisungen angeht, Basic ist eben doch sehr einfach gestaltet. Nun hab ich mich daran gemacht den Quellcode von obigem Link an meine Umgebung anzupassen, und wollte nun von euch wissen, ob ich alles (oder wenigstens etwas...) richtig gemacht hab, bevor ich mir meinen Drucker damit zerschieße.
Hier mein Code:
Code:
 //----------------------------------------------------------------------
#define     F_CPU 16000000  // Taktfrequenz des myAVR-Boards
#include    <avr\io.h>      // AVR Register und Konstantendefinitionen
#include    <util/delay.h>
//----------------------------------------------------------------------

void init_io(void);
void strobe(void);

int main(void) 
{
    init_io();
    unsignedchar string[12] = "Hello World!"; //Text string

PINF = (1<<PINF2); //Setzt Strobe auf high

while(PINK == 255); //Wartet auf einen Tastendruck
for (unsignedchar i = 0; i <= 12; i++) //Liest alle Stellen des String
    {
        PORTA = string[i]; //Legt die Zeichen an den Datenausgang
        strobe(); //Sagt dem Drucker, dass Daten anliegen
while(PORTB == 1); //Wartet auf die Bestätigung des Druckers, dass Daten empfangen wurden
    }

}

void init_io(void)
{
    DDRE = 0b11111111; //Datenleitungen DATA0-7
DDRF = 0b10100111; //Steuerleitungen vom/zum Drucker
//PF0: nc       Out
//PF1: nc       Out
//PF2: Strobe   Out
//PF3: Busy     In
//PF4: ACK      In
//PF5: INIT     Out
//PF6: ERROR    In
//PF7: Autofeed Out
DDRK = 0b00000000; //An alle Pins sind Taster angeschlossen
PORTK = 0; //Pull-Up nicht setzen
PORTF |= (1<<PinF7); //Schaltet Autofeed ein
}

void strobe(void)
{
    PINF = ~(1<<PINF2); //Setzt Stobe auf low = Drucker soll empfangen
    _delay_ms(1);
    PINF = (1<<PINF2);  //Setzt Strobe wieder auf high
}

//----------------------------------------------------------------------
Verwendet wird ein ATMega 2560 und das myAVR Workpad. Achja, ich wollte den Code vom ersten Beispiel im Link übersetzen, sollte ich vlt. dazusagen.

MfG
Matthias