Select Language!
DisplayDisplay

Display

Damit man den Wheelie auch im Fahrbetrieb voll im Griff hat, bekommt es ein 2,1 Zoll TFT-Display. Die Werte werden von den Prozessoren über die USARTs ausgegeben und mit dem MAX232 auf RS232-Pegel gewandelt. Dadurch ist eine störungsfreie Übertragung den Lenker hoch bis zum Display gewährleistet. Außderdem kann auch der PC anstatt des Displays angeschlossen werden. Dazu muß nur ein VT100 kompatibles Terminal gestartet werden.
Hans-Peter Küsters bietet einen fertigen Kontroller mitsamt Display und Highlevelbefehlen in Bascom an. Außerdem hat der eingesetzte ATMega 128 ordendlich Reserve für den eigenen Programmcode. Auch in der Grundausstattung ist ein RS232-Wandler vorhanden, somit ist keine weitere Hardware für mein Bedienteil notwendig. Der Preis von unter 90 Euro für Display, Controller und RS232-Wandler hat selbst mich vom selberätzen abgehalten ;-)

Mit den Tastern können 3 Parameter der Regelungen verändert werden. Das macht die Optimierung der Software sehr komfortabel.

Display im Testbetrieb

Flash is required!

Howto

Der Code für das Display benötigt 2 Lib-Dateien. Diese werden mit dem Display mitgeliefert. Außerdem ein Konverter dabei, mit dem man eigene Bilder in BIN-Dateien umwandeln kann. Mein Hintergrund ist in den Dateien lcd.bin und color.bin abgelegt. Sie sind weiter unten zum Download bereitgestellt.

Quellcode

' (c) 2007 Speed-IT-up (Display3000), Peter Küsters

$hwstack = 128
$swstack = 128
$framesize = 128

$regfile = "m128def.dat"
$crystal = 16000000
$baud1 = 57600

Config Serialin1 = Buffered , Size = 40 , Bytematch = 13
Config Serialout1 = Buffered , Size = 40
Echo Off

Declare Sub Writeserinp
Declare Sub Checkserinp
Declare Sub Parser

Const Mymainchannel = 2
Const Sw_down = 50
Dim Buffer As String * 15
Dim Bufferarray(15) As Byte At Buffer Overlay
Dim Serinpstr As String * 63
Dim Serinpbuffer As String * 63
Dim Serinbuffarr(5) As Byte At Serinpbuffer Overlay
Dim Cr_received As Byte
Dim Strsize As Byte
Dim Mainchannel As Byte
Dim Subchannel As Word
Dim Wert As Single
Dim Frage As Byte
Dim Zeichenpos As Byte

Dim Strpuff As String * 20
Dim Status_old As String * 20
Dim Temp_level_oben As Byte
Dim Temp_level_unten As Byte
Dim Farbe As Word
Dim Voltage As Single
Dim Speed_l As Integer
Dim Speed_r As Integer
Dim Speed As Integer
Dim Speed_hold As Integer
Dim Strspeed As String * 20

'Now we need to select Port B as to an output port (data output to the display)
Ddrb = &B1111111                                            'DDR = Data direction register; All 8 ports switched to output (1)
$include Init21_display3000.bas

Open "COM2:" For Binary As #1

Orientation = Landscape
Graphics_mode = 256high_compressed
Gosub Lcd_cls
Restore Logo
Call Lcd_bitmap(0 , 0 , 175 , 131)
Enable Interrupts
Do
   If Cr_received = 1 Then                                  'wenn was im ser. Buffer ist abholen
      Cr_received = 0
      Input #1 , , Serinpstr Noecho
      Clear Serialin1
      'zum Abtrennen eines oder mehrerer LF am Anfang des Strings, das noch vom Vorgänger-String im Buffer steht
      While Asc(serinpstr) = 10
         Strsize = Len(serinpstr) - 1
         Serinpstr = Right(serinpstr , Strsize)
      Wend
      'Hier ist der String empfangen und ein event. LF entfernt
      Call Checkserinp
   End If
Loop
'---------------------------------------------------------------------------
'     Serial1charmatch
'     Im Eingangspuffer wurde ein "13" empfangen
'     Dieser eine Takt Interrupt verzögert theoretisch die Regelung!?!
'---------------------------------------------------------------------------

Serial1charmatch:
    Cr_received = 1
Return

'---------------------------------------------------------------------------
'     Writeserinp
'     Leitet den empfangenen String zum nächsten Modul weiter
'---------------------------------------------------------------------------

Sub Writeserinp
  'Print #1 Serinpstr                                        ' Befehl Weiterreichen
End Sub

'---------------------------------------------------------------------------
'     Checkserinp
'     Hier der String abgeholt
'     Der Mainchannel und der : wird geprüft
'---------------------------------------------------------------------------

Sub Checkserinp
   If Asc(serinpstr) = 35 Then                              'Strings mit # gleich weiterleiten
      'Call Writeserinp
      Exit Sub
   End If
   If Asc(serinpstr) = 27 Then                              'Strings mit ESC gleich weiterleiten
      'Call Writeserinp
      Exit Sub
   End If

   Zeichenpos = Instr(serinpstr , ":")
   If Zeichenpos > 0 Then                                   ' Doppelpunkt Gefunden
      If Instr(serinpstr , "*") > 0 And Instr(serinpstr , "*") < Zeichenpos Then
         'Call Writeserinp
         Call Parser
         Exit Sub
      Else                                                  'kein *
         Serinpbuffer = Left(serinpstr , Zeichenpos)
         Mainchannel = Val(serinpbuffer)
         If Mainchannel = Mymainchannel Then
            Call Parser
            Exit Sub
         Else
            'Call Writeserinp
            Exit Sub
         End If
      End If
   Else                                                     'kein :
      If Mainchannel = Mymainchannel Then                   'Mainchannel müsste noch von vorigem Durchlauf drinstehen
         Call Parser
         Exit Sub
      Else                                                  'anderes Modul
         'Call Writeserinp
         Exit Sub
      End If
   End If
End Sub
'---------------------------------------------------------------------------
'     Parser
'     Hier beginnt der Parser
'
'---------------------------------------------------------------------------
Sub Parser
   Local I As Byte
                                              'der ":" und alles davor kommt weg
   Zeichenpos = Len(serinpstr) - 2                          'Instr(serinpstr , Doppelpunkt)
   Serinpbuffer = Right(serinpstr , Zeichenpos)
   Zeichenpos = Instr(serinpbuffer , "=")
    If Zeichenpos > 0 Then                                  '= ist vorhanden
      Frage = 0
   Else
      Frage = 1
   End If
   If Zeichenpos = 0 Then Zeichenpos = Len(serinpbuffer)
   Buffer = Left(serinpbuffer , Zeichenpos)
   Subchannel = Val(buffer)
   If Frage = 0 Then
      Frage = Len(serinpbuffer) - Zeichenpos
      Buffer = Right(serinpbuffer , Frage)
      Wert = Val(buffer)
   End If
   Select Case Subchannel
      'Lenker
      Case 3
         Strpuff = Format(buffer , " +0")
         Call Lcd_print(strpuff , 24 , 85 , 1 , 1 , 1 , Black , White)
      'Power Motor links
      Case 7
         If Wert < 0 Then
            Temp_level_oben = 0
            Wert = Wert * -1
            Temp_level_unten = Wert / 5
         Else
            Temp_level_unten = 0
            Temp_level_oben = Wert / 5
         End If
         If Wert > 160 Then
            Farbe = Red
         Else
            Farbe = Green
         End If
         If Temp_level_unten > 36 Then Temp_level_unten = 36
         Temp_level_unten = 90 + Temp_level_unten
         Call Lcd_box(100 , 90 , 105 , Temp_level_unten , Farbe)
         Call Lcd_box(100 , Temp_level_unten , 105 , 126 , White)

         If Temp_level_oben > 36 Then Temp_level_oben = 36
         Temp_level_oben = 90 - Temp_level_oben
         Call Lcd_box(100 , Temp_level_oben , 105 , 90 , Farbe)
         Call Lcd_box(100 , 53 , 105 , Temp_level_oben , White)
      'Power Motor rechts
      Case 8
         If Wert > 0 Then
            Temp_level_unten = 0
            Temp_level_oben = Wert / 5
         Else
            Temp_level_oben = 0
            Wert = Wert * -1
            Temp_level_unten = Wert / 5
         End If
         If Wert > 160 Then
            Farbe = Red
         Else
            Farbe = Green
         End If
         If Temp_level_unten > 36 Then Temp_level_unten = 36
         Temp_level_unten = 90 + Temp_level_unten
         Call Lcd_box(70 , 90 , 75 , Temp_level_unten , Farbe)
         Call Lcd_box(70 , Temp_level_unten , 75 , 126 , White)

         If Temp_level_oben > 36 Then Temp_level_oben = 36
         Temp_level_oben = 90 - Temp_level_oben
         Call Lcd_box(70 , Temp_level_oben , 75 , 90 , Farbe)
         Call Lcd_box(70 , 53 , 75 , Temp_level_oben , White)

      Case 9                                                'Speed left
         Speed_l = Wert
         If Wert > 0 Then
            Temp_level_unten = 0
            Temp_level_oben = Wert / 5
         Else
            Temp_level_oben = 0
            Wert = Wert * -1
            Temp_level_unten = Wert / 5
         End If
         If Wert > 160 Then
            Farbe = Red
         Else
            Farbe = Blue
         End If
         If Temp_level_unten > 36 Then Temp_level_unten = 36
         Temp_level_unten = 90 + Temp_level_unten
         Call Lcd_box(75 , 90 , 80 , Temp_level_unten , Farbe)
         Call Lcd_box(75 , Temp_level_unten , 80 , 126 , White)

         If Temp_level_oben > 36 Then Temp_level_oben = 36
         Temp_level_oben = 90 - Temp_level_oben
         Call Lcd_box(75 , Temp_level_oben , 80 , 90 , Farbe)
         Call Lcd_box(75 , 53 , 80 , Temp_level_oben , White)
      Case 10                                               'Speed right
         Speed_r = Wert
         If Wert < 0 Then
            Temp_level_oben = 0
            Wert = Wert * -1
            Temp_level_unten = Wert / 5
         Else
            Temp_level_unten = 0
            Temp_level_oben = Wert / 5
         End If
         If Wert > 160 Then
            Farbe = Red
         Else
            Farbe = Blue
         End If
         If Temp_level_unten > 36 Then Temp_level_unten = 36
         Temp_level_unten = 90 + Temp_level_unten
         Call Lcd_box(95 , 90 , 100 , Temp_level_unten , Farbe)
         Call Lcd_box(95 , Temp_level_unten , 100 , 126 , White)

         If Temp_level_oben > 36 Then Temp_level_oben = 36
         Temp_level_oben = 90 - Temp_level_oben
         Call Lcd_box(95 , Temp_level_oben , 100 , 90 , Farbe)
         Call Lcd_box(95 , 53 , 100 , Temp_level_oben , White)
      Case 11
        If Buffer <> Status_old Then
         Status_old = Buffer
         Call Lcd_print( "                    " , 10 , 25 , 1 , 1 , 1 , White , White)
         Select Case Wert
            Case 10
               Call Lcd_print( "Störung! ADXL low" , 10 , 25 , 1 , 1 , 1 , Red , White)
            Case 11
               Call Lcd_print( "Störung! ADXL high" , 10 , 25 , 1 , 1 , 1 , Red , White)
            Case 12
               Call Lcd_print( "Störung! Gyro low" , 10 , 25 , 1 , 1 , 1 , Red , White)
            Case 13
               Call Lcd_print( "Störung! Gyro high" , 10 , 25 , 1 , 1 , 1 , Red , White)
            Case 14
               Call Lcd_print( "Störung! Fußschalter" , 10 , 25 , 1 , 1 , 1 , Red , White)
            Case Else
               If Buffer = "Standby" Then Speed_hold = 0
               Call Lcd_print(buffer , 10 , 25 , 1 , 1 , 1 , Black , White)
         End Select
        End If
      'Battery
      Case 12
         Voltage = Val(buffer)
         Voltage = Voltage * 0.0328
         Select Case Voltage
              Case 0 To 24
               Farbe = Red
              Case 24 To 25
               Farbe = Orange
              Case 25 To 29
               Farbe = Green
              Case Else
               Farbe = Black
         End Select
         Buffer = Str(voltage)
         Buffer = Left(buffer , 4)
         Strpuff = Format(buffer , " 0") + "V"
         Call Lcd_print(strpuff , 24 , 52 , 1 , 1 , 1 , Farbe , White)

        'Speed wird hier gezeichnet, da die Zeit bei den Speedbalken zu knapp wird.
         Speed = Speed_l + Speed_r
         Speed = Speed / 2
         If Speed < 1 And Speed > -1 Then Speed = 0
         Strspeed = Str(speed)
         Strspeed = Format(strspeed , " +0.0")
         Strspeed = Left(strspeed , 6)
         If Speed > Speed_hold Then
             Speed_hold = Speed
             Call Lcd_print(strspeed , 135 , 58 , 1 , 1 , 1 , Black , White)
         End If
         Strspeed = Strspeed + " km/h"
         Call Lcd_print(strspeed , 50 , 38 , 1 , 1 , 1 , Black , White)

      Case Else
   End Select
   Enable Interrupts
End Sub

End

$inc Logo , Nosize , "lcd.bin"
$inc Colortable , Nosize , "color.bin"
$include Glcd21_display3000.bas
$include Glcd21_fonts.bas