| 1 | '----------------------------------------------------------------------------
 | 
| 2 | 'Name                      : LCD Bus-Wandler.bas
 | 
| 3 | 'Ersteller                  : Ekkehard Oetken
 | 
| 4 | 'Zweck                     : Displayinhalt auslesen
 | 
| 5 | 'PIC                          : Mega32
 | 
| 6 | '----------------------------------------------------------------------------
 | 
| 7 | 
 | 
| 8 | 'PortC.0 = Systel-Display D4
 | 
| 9 | 'PortC.1 = Systel-Display D5
 | 
| 10 | 'PortC.2 = Systel-Display D6
 | 
| 11 | 'PortC.3 = Systel-Display D7
 | 
| 12 | 'PortC.5 = Systel-Display RS
 | 
| 13 | 'PortD.2 = Systel-Display E
 | 
| 14 | 
 | 
| 15 | 'Die Ausgabe erfolgt im UTF-8-Format, VT100-Emulation
 | 
| 16 | 'Ablaufdauer der Interruptroutine: 2us
 | 
| 17 | 'Verzögerung zwischen Interrupt und Start der Routine: 4us
 | 
| 18 | 
 | 
| 19 | 
 | 
| 20 | $regfile = "m32def.dat"
 | 
| 21 | $crystal = 16000000
 | 
| 22 | $baud = 38400
 | 
| 23 | 
 | 
| 24 | Ddrc = &B00000000                     'Displayport als Eingang
 | 
| 25 | Ddrd = &B11111011                     'Interrupt-Pin an Port D.2 als eingang konfigurieren
 | 
| 26 | 
 | 
| 27 | Portc = &B00000000                     'Pull-Up abschalten
 | 
| 28 | Portd = &B00000100                     'Pull-Up an Port D.2 einschalten
 | 
| 29 | 
 | 
| 30 | On Int0 Lesen                                   'Interrupt wird bei jedem Display-Enable ausgelöst
 | 
| 31 | Config Int0 = Rising                         'Interrupt bei steigender Flanke
 | 
| 32 | Enable Int0                                        'Interrupt 0 einschalten
 | 
| 33 | Enable Interrupts                              'Interrupts global einschalten
 | 
| 34 | 
 | 
| 35 | Dim Disp As String * 16                   'Gibt die Displayanzeige im UTF-8-Format aus
 | 
| 36 | Dim Dispp1 As String * 8                 'Speichert die ersten 8 Stellen der Dsiplayanzeige
 | 
| 37 | Dim Dispp2 As String * 8                 'Speichert die letzten 8 Stellen der Displayanzeige
 | 
| 38 | 
 | 
| 39 | Dim Stelle(17)as Byte                         'Array: Speichert Bytewerte der 16 Displaystellen
 | 
| 40 | Dim Systel As Byte                              'Speichert die Bytewerte am Displayport
 | 
| 41 | Dim Timeout As Long                         'Zur Erkennung des Ausbleibens der Daten am Displayport
 | 
| 42 | Dim Intcounter As Byte                       'Zählt die Impulse am "Enable" PIN zum Überspringen
 | 
| 43 |                                                                 'des LN nach DDRAM Addresse 1000 0000
 | 
| 44 | Dim Bytecounter As Byte                    'Speichert den Pointer vom Array "Stelle"
 | 
| 45 | Dim Nibble As Bit                                 'Umschaltung zwischen HN=1 und LN=0
 | 
| 46 | Dim N As Byte                                       'Schleifenzähler für die Stringbildung
 | 
| 47 | 
 | 
| 48 | Systel = 0
 | 
| 49 | Timeout = 0
 | 
| 50 | Intcounter = 0
 | 
| 51 | Bytecounter = 1
 | 
| 52 | Nibble = 1
 | 
| 53 | N = 1
 | 
| 54 | 
 | 
| 55 | 
 | 
| 56 | 
 | 
| 57 | Do
 | 
| 58 | 
 | 
| 59 |    If Timeout >= 50 Then                                          'Timeout nicht durch Interrupt zurückgesetzt
 | 
| 60 |       Print Chr(27) ; "[1;0f" ; "Check Connection"
 | 
| 61 |       Timeout = 50
 | 
| 62 |    Else
 | 
| 63 |       For N = 1 To 17                                                    'Den String "Disp" für zusammenbauen
 | 
| 64 |       Disp = Disp + Chr(stelle(n))
 | 
| 65 |       Next N
 | 
| 66 | 
 | 
| 67 |       Dispp1 = Mid(disp , 1 , 8)                                     'Das neunte Zeichen entfernen
 | 
| 68 |       Dispp2 = Mid(disp , 10 , 8)
 | 
| 69 |       Disp = Dispp1 + Dispp2
 | 
| 70 | 
 | 
| 71 |       Print Chr(27) ; "[1;0f" ; Disp                                   'Ausgabe auf dem Bildschirm
 | 
| 72 |       Disp = ""                                                                    'String zurücksetzen
 | 
| 73 |    End If
 | 
| 74 | 
 | 
| 75 |    Incr Timeout
 | 
| 76 | 
 | 
| 77 | Loop
 | 
| 78 | 
 | 
| 79 | 
 | 
| 80 | 
 | 
| 81 | 
 | 
| 82 | Lesen:                                                   'Interrupt ausgelöst
 | 
| 83 |    If Pinc = 24 Then                              'Wenn das DDRAM auf Addresse 1000 0000 gesetzt wird
 | 
| 84 |       Bytecounter = 1                             'Setzte den Pointer von Array "Stelle" zurück
 | 
| 85 |       Intcounter = 0                                 'Setzt den Zähler zum Überspringen des LN nach 
 | 
| 86 |                                                                 'DDRAM-Addresse 1000 0000 zurück
 | 
| 87 |       Nibble = 1                                        'Speichere im nächsten Durchgang das HN
 | 
| 88 |    Else
 | 
| 89 |       If Intcounter >= 2 Then                    'überspringe das erste Nibble
 | 
| 90 |          If Nibble = 1 Then                          'Speichere das HN
 | 
| 91 |             Systel.4 = Pinc.0                         'Schreibe die oberen vier Bit von "Systel"
 | 
| 92 |             Systel.5 = Pinc.1
 | 
| 93 |             Systel.6 = Pinc.2
 | 
| 94 |             Systel.7 = Pinc.3
 | 
| 95 |             Nibble = 0                                      'Sperre das HN für den nächsten Durchgang
 | 
| 96 |          Else                                                    'Speichere das LN
 | 
| 97 |             Systel.0 = Pinc.0                           'Schreibe die unteren vier Bits von "Systel"
 | 
| 98 |             Systel.1 = Pinc.1
 | 
| 99 |             Systel.2 = Pinc.2
 | 
| 100 |             Systel.3 = Pinc.3
 | 
| 101 |             Stelle(bytecounter) = Systel        'Schreibe das komplette Byte in
 | 
| 102 |                                                                      'Position X von Bytearray "Stelle"
 | 
| 103 |             Incr Bytecounter                            'Erhöhe den Pointer von Array "Stelle"
 | 
| 104 |             Nibble = 1                                        'Sperre das LN für den nächsten Durchgang
 | 
| 105 |          End If
 | 
| 106 |       End If
 | 
| 107 |    End If
 | 
| 108 | 
 | 
| 109 |    Timeout = 0                                              'Reset Zähler für fehlende Displaydaten
 | 
| 110 |    Incr Intcounter                                         'Erhöhe den Zähler "Intcounter" um 1
 | 
| 111 | Return
 | 
| 112 | 
 | 
| 113 | 
 | 
| 114 | 
 | 
| 115 | End
 |