Forum: Mikrocontroller und Digitale Elektronik Drucker am AVR anschlissen


von Holger (Gast)


Lesenswert?

Hallo,

ich möchte einen Centronix-Drucker an einen AVR hängen.
Dazu habe ich auch schon viele Seiten gefunden, auch einmal mit Code. Da 
ich nicht so viel vom Programmieren verstehe, hoffe ich hier auf Hilfe.
Mein Problem: Wie muss ich den Code abändern, dass ein String gedruckt 
wird? (ohne die ganzen LEDs und Taster, nur mit GOTO)



Der Code:
1
$regfile = "m8def.dat"
2
$crystal = 1000000
3
4
Ddrb = &B00000000                                           'Port B komplett als Eingang
5
Ddrc = &B00001111                                           'Am Port C PC0 bis PC3 Ausgang, Rest Eingang
6
Ddrd = &B11111111                                           'Port D komplett als Ausgang
7
8
Portb = &B00011110                                          'Pullup für PB1 bis PB4 aktivieren (Taster)
9
Portc = &B00001111                                          'Beim starten auf 0 setzen
10
Portd = &B00000000                                          'Beim starten auf 0 setzen
11
12
Dim Nutzdaten As String * 30
13
Dim Textstring As String * 30
14
Dim Bytewerte(30) As Byte At Textstring Overlay
15
Dim X As Byte
16
Dim Y As Byte
17
18
Led_gruen Alias Portc.0
19
Led_rot Alias Portc.1
20
Taster1 Alias Pinb.1
21
Taster2 Alias Pinb.2
22
Taster3 Alias Pinb.3
23
Taster4 Alias Pinb.4
24
25
Strobe Alias Portc.3
26
Init_signal Alias Portc.2
27
Busy Alias Pinb.5
28
Ack_signal Alias Pinb.6
29
30
'Portd ist DATA0 - DATA7 der Centronics Schnittstelle
31
32
Led_gruen = 0                                               'LED Grün an
33
Led_rot = 0                                                 'LED Rot an
34
35
Wait 1                                                      'Test, ob beide LEDs funktionieren
36
37
Led_rot = 1                                                 'LED Rot aus
38
39
40
Do
41
If Taster1 = 0 Then                                         'Taster 1 gedrückt
42
    Textstring = "!R! STAT1; EXIT; {012}"
43
    Gosub Senddata                                          'Rote LED aus
44
    Waitms 50                                               ' wegen dem Tastenprellen
45
End If
46
If Taster2 = 0 Then                                         'Taster 2 gedrückt
47
    Textstring = "!R! FRPO I1, 1; EXIT;"
48
    Gosub Senddata
49
    Waitms 50                                               ' wegen dem Tastenprellen
50
End If
51
If Taster3 = 0 Then                                         'Taster 3 gedrückt
52
    Textstring = "!R! ELOG; EXIT;"
53
    Gosub Senddata
54
    Waitms 50                                               ' wegen dem Tastenprellen
55
End If
56
If Taster4 = 0 Then                                         'Taster 4 gedrückt
57
    Waitms 50                                               ' wegen dem Tastenprellen
58
End If
59
Loop
60
61
62
Senddata:
63
    Led_gruen = 1                                           'Grüne LED aus
64
65
    Do
66
    Loop Until Busy = 1
67
68
    Led_rot = 0
69
    Init_signal = 0                                         'Init-Signal auf Low zum initialisieren
70
    Waitms 50                                               '50 millisekunden warten
71
    Init_signal = 1
72
    Waitms 50
73
74
    Y = Len(textstring)
75
    For X = 1 To Y Step 1
76
        Portd = Bytewerte(x)
77
        Waitms 10
78
        Strobe = 1
79
        Waitms 10
80
        Strobe = 0
81
82
        Do
83
        'Wartet, bis der Drucker ein ACK gesendet hat, um sicher zu gehen, dass kein Zeichen verloren geht
84
        Loop Until Ack_signal = 1
85
86
    Next X
87
88
    Led_gruen = 0                                           'Grüne LED an
89
    Led_rot = 1
90
Return
91
92
End


PS: Ich möchte nur Text drucken. Ohne Angaben zur Grösse und Schriftart.

von Karl H. (kbuchegg)


Lesenswert?

Holger wrote:

> ich nicht so viel vom Programmieren verstehe, hoffe ich hier auf Hilfe.
> Mein Problem: Wie muss ich den Code abändern, dass ein String gedruckt
> wird? (ohne die ganzen LEDs und Taster, nur mit GOTO)

Die zentrale Ausgabefunktion ist bei Senddata.
Nimm dir dort den Abschnitt bis zum Return und schmiss alles raus was 
mit LED und Tastern zu tun hat.

von Klaus2 (Gast)


Lesenswert?

Y = Len(textstring)
    For X = 1 To Y Step 1
        Portd = Bytewerte(x)
        Waitms 10
        Strobe = 1
        Waitms 10
        Strobe = 0

        Do
        'Wartet, bis der Drucker ein ACK gesendet hat, um sicher zu 
gehen, dass kein Zeichen verloren geht
        Loop Until Ack_signal = 1

    Next X


Da steckt alles drin!

Klaus.

von Holger (Gast)


Lesenswert?

Also ist "Textstring" der String der den zu druckenden Text enthält?
Wofür ist X und Y?

von Klaus2 (Gast)


Lesenswert?

1) ja

2) x: zählvariable für auszugebne zeichen des strings

3) y: anzahl zeichen des strings

4) du hast zu wenig ahnung für sowas

Klaus.

von Klaus2 (Gast)


Lesenswert?

korrigiere:

1) nein, textstring ist eine VAR mit inhalt -> Textstring = "!R! STAT1; 
EXIT; {012}"

4) dabei bleibe ich aber :)

Was hast du denn vor???

Klaus.

von Holger (Gast)


Lesenswert?

4) Kann sein, aber erkläre mal, villeicht verstehe ich es ja doch.

Kann man dieses !R! STAT1; EXIT setzen?

von Karl H. (kbuchegg)


Lesenswert?

Holger wrote:
> 4) Kann sein, aber erkläre mal, villeicht verstehe ich es ja doch.

Ganz ehrlich.

Centronics ist so simpel anzusteuern, wenn du das in dem Quelltext nicht 
geschnallt hast, was da abgeht, dann hast du wirklich zuwenig Ahnung.

In der Schleife wird Zeichen für Zeichen an den Ausgabeport gelegt und 
nachdem das Zeichen am Port anliegt, wird Strobe einmal rauf und einmal 
runter gesetzt (mit einer kleinen Wertezeit dazwischen)

> Kann man dieses !R! STAT1; EXIT setzen?

Lern erst mal BASCOM.
Was denkst du, was diese Zeilen hier

    Textstring = "!R! ELOG; EXIT;"
    Gosub Senddata

wohl machen.

Ob du da "!R! ELOG; EXIT;" reinschreibst, oder "Das Leben ist schoen" 
oder "Ich hab von Bascom keine Ahnung" ist doch völlig wurscht. An eine 
Stringvariable wird ein Text zugewiesen.

Bin schon neugierig, wie du den Rest deines Projektes bewältigen willst, 
wenn es schon an derart simplen Sachen scheitert.

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.