Aus RN-Wissen.de
Wechseln zu: Navigation, Suche
LiFePO4 Speicher Test

(Ein kleines Spiel mit BasCom)
K (Weblinks)
 
(19 dazwischenliegende Versionen von 9 Benutzern werden nicht angezeigt)
Zeile 1: Zeile 1:
 
==Allgemeines zu Terminals==
 
==Allgemeines zu Terminals==
Was hat ein Terminal mit Robotik zu tun ? Eigentlich nix. Aber wer nicht ein LCD-Display und eine Tastatur auf seinem Board eingebaut hat, ist darauf angewiesen, mit einer Terminal-Emulation Kontakt mit seinem Controllerboard aufzunehmen.  
+
Ein Terminal dient dazu, Daten, die z.B. an einen COM-Port geschickt wurden, zu empfangen, oder Daten zu versenden. Die Daten sind meist in Textform (ASCII). Es gibt Terminals ohne GUI, diese laufen dann z.B. in einer Konsole, oder welche mit GUI. Siehe dazu
  
Gleich vorweg: da kaum ein Bastler mit einem richtigen "physischen" Terminal was zu tun hat, werde ich den Zusatz "Emulation" in Zukunft streichen, das verwirrt nur und bringt nix.
+
Man kann ein Terminal u.a. für folgendes verwenden (neben dem simplen Senden und Empfangen):
Bei so einem Terminal sind ein paar Dinge einzustellen, und auf die sollte man auch achten. Häufig verwendet werden
+
* Debugginginformationen protokollieren
 +
* Daten aufzeichnen (loggen)
 +
* Daten auswerten
  
''Artikel von PicNick''
+
Es sind einige Terminalprogramme für die unterschiedlichsten Betriebsysteme vorhanden (siehe [[Terminalprogramm|Terminalprogramme]]).
 +
 
 +
Was hat ein Terminal mit Robotik zu tun? Eigentlich nichts. Aber wer nicht ein LCD-Display und eine Tastatur auf seinem Board eingebaut hat, ist darauf angewiesen, mit einer Terminal-Emulation Kontakt mit seinem Controllerboard aufzunehmen.
 +
 
 +
Gleich vorweg: Da kaum ein Bastler mit einem richtigen "physischen" Terminal zu tun hat, werde ich den Zusatz "Emulation" in Zukunft streichen. Das verwirrt nur und bringt nichts.
 +
Bei so einem Terminal sind ein paar Dinge einzustellen und auf die sollte man auch achten. Häufig verwendet werden
 +
 
 +
==Terminalprogramme==
 +
Es gibt einige bekannte Terminals mit einer GUI. Solche Programme für das Betriebssystem Windows sind u.a.:
 +
* [[Terminals#Hyperterm Terminal|Hyperterm Terminal]]
 +
* TTY
 +
* [http://www.der-hammer.info/terminal/ HTerm]
 +
 
 +
Entwicklungsumgebungen wie z.B. Bascom haben oft bereits ein Terminalprogramm (siehe [[Terminals#BasCom Terminal|BasCom Terminal]]) integriert. Dies erleichtert das Debuggen (Fehlersuche in eigenen Programmen) erheblich. Links sind im [[Terminals#Weblinks|Weblinks]] Bereich.
  
 
==BasCom Terminal==
 
==BasCom Terminal==
Die Möglichkeiten beschränken sich auf das Wichtigste
+
Die Entwicklungsumgebung Bascom bringt ein eigenes, in die Entwicklungsumgebung integriertes, Terminalprogramm mit - Bascom Terminal. Die Möglichkeiten des Programms beschränken sich auf das Wichtigste.
  
Options-->Communications
+
Options » Communications
  
 
http://www.roboternetz.de/wiki/uploads/Main/basterm1.jpg
 
http://www.roboternetz.de/wiki/uploads/Main/basterm1.jpg
  
Es ist nicht viel einzustellen, die gezeigten Werte sind der Normalfall
+
Es ist nicht viel einzustellen, die gezeigten Werte sind der Normalfall.
  
===Hyperterm Terminal===
+
==Hyperterm Terminal==
 +
Das Hyperterm Terminal wird standardgemäß mit jeder Windowsversion bis Windows XP mitgeliefert. In Vista und Win7 müssen die Dateien "hypertrm.dll" und "hypertrm.exe" von einer XP-Installation kopiert bzw. downgeloadet werden. Es bietet auch nur Grundfunktionen, ist aber als einfaches Terminalprogramm mit GUI gut zu gebrauchen.
  
Nach dem Programmstart erscheint
+
Nach dem Programmstart erscheint:
  
 
'''Neue Verbindung'''
 
'''Neue Verbindung'''
  
http://www.roboternetz.de/wiki/uploads/Main/hyper1.jpg
+
[[Bild:Hyper1_v2.png]]
  
Da gibt man irgendeinen Namen für die Verbindung ein, z.B. "Roboternetz"
+
Da gibt man irgendeinen Namen für die Verbindung ein, z.B. "Roboternetz".
  
Es erscheint  
+
Es erscheint:
 
'''Verbinden mit'''  
 
'''Verbinden mit'''  
  
http://www.roboternetz.de/wiki/uploads/Main/hyper2.jpg
+
[[Bild:Hyper2_v2.png]]
  
Wir geben das COM-Port ein, wo das Kabel zum Controller angesteckt ist
+
Wir geben den COM-Port ein (der Port also, über den die Daten gesendet/empfangen werden sollen):
  
Jetzt kommt's drauf an, was im Controller eingestellt wurde.
+
Nun können wir einige COM-Port Einstellungen wählen. Damit es zu einer Verbindung kommt müssen die gewählten Einstellungen mit den Einstellungen des Endgeräts (das über eine COM-Port Schnittstelle am Computer hängt) übereinstimmen. Sonst empfängt man nur Datenmüll oder gar nichts.
  
'''Anschlußeinstellungen'''
+
'''Anschlusseinstellungen'''
  
http://www.roboternetz.de/wiki/uploads/Main/hyper3.jpg
+
[[Bild:Hyper3_v2.png]]
  
* Baudrate (Bits pro Sekunde) - Beliebt ist 9600, das muß aber mit dem übereinstimmen, was wir dem Controller gesagt haben
+
* Baudrate (Bits pro Sekunde) - Beliebt ist 9600, dass muss aber mit den Einstellungen des Controllers übereinstimmen
* Datenbits - Normalerweise "8"  
+
* Datenbits - Normalerweise "8"
 
* Parität - Normalerweise "keine"
 
* Parität - Normalerweise "keine"
 
* Stoppbits - Normalerweise "1"
 
* Stoppbits - Normalerweise "1"
* Flußsteuerung - Normalerweise "kein"
+
* Flusssteuerung - Normalerweise "kein"
  
Jetzt ist das Hyperterm soweit zufrieden, wir aber nicht.
+
Jetzt ist das Hyperterm soweit zufrieden, wir aber nicht.
  
http://www.roboternetz.de/wiki/uploads/Main/hyper4.jpg
+
[[Bild:Hyper4_v2.png]]
  
Es geht weiter bei  
+
Es geht weiter bei:
  
 
===Einstellungen===
 
===Einstellungen===
  
Datei-->Eigenschaften-->Einstellungen
+
Datei » Eigenschaften » Einstellungen
  
http://www.roboternetz.de/wiki/uploads/Main/hyper5.jpg
+
[[Bild:Hyper5_v2.png]]
  
  
Interessant sind
+
Interessant sind:
*Rücktaste sendet*
+
* Rücktaste sendet*
 
** CAN (Ctrl-H) --> Terminalsteuerung
 
** CAN (Ctrl-H) --> Terminalsteuerung
**DEL --> Terminalsteuerung
+
** DEL --> Terminalsteuerung
  
 
'''Emulation'''  
 
'''Emulation'''  
Zeile 67: Zeile 83:
 
* Auto Detect
 
* Auto Detect
 
* TTY
 
* TTY
Solange man nur "print" und "input" sagt, reicht das allemal
+
Solange man nur "print" und "input" sagt, ist dies völlig ausreichend.
  
* VT100 / VT220 und ev. andere
+
* VT100 / VT220 und evtl. andere
diese Typen verstehen die normalen "ANSII-Steuersequenzen" und einige mehr ANSII-Sequenzen
+
Diese Typen verstehen die normalen "ANSI-Steuersequenzen" und einige mehr ANSII-Sequenzen.
  
Das reicht, um mit dem Robby eine Unterhaltung führen zu können
+
Das reicht, um mit dem Roboter (oder einem anderen Endgerät) kommunizieren zu können.
  
 
===ASCII-Konfiguration===
 
===ASCII-Konfiguration===
  
Um das Interesse zu wecken, einmal ein Bild der Einstellungen. Beim Thema "Terminalsteuerung" gibt's dazu mehr Information
+
Um das Interesse zu wecken, einmal ein Bild der Einstellungen. Beim Thema "Terminalsteuerung" gibt es dazu mehr Information.
  
http://www.roboternetz.de/wiki/uploads/Main/hyper6.jpg
+
[[Bild:Hyper6_v2.png]]
  
==Terminalsteuerung ANSII==
+
==Terminalsteuerung ANSI==
  
 
Ein Terminal bietet aber auch einiges mehr als das, was bei der allgemeinen Terminalsteuerung besprochen wurde.  
 
Ein Terminal bietet aber auch einiges mehr als das, was bei der allgemeinen Terminalsteuerung besprochen wurde.  
Zeile 87: Zeile 103:
 
* Alle Tasten können verwendet werden
 
* Alle Tasten können verwendet werden
  
Dazu werden ANSII-Sequenzen verwendet,das sind Zeichenfolgen mit ganz bestimmtem Aufbau. Und auch die werden noch von verschiedenen Herstellern um zusätzliche Funktionen erweitert. Besonders hervorgetan hat sich hier DEC (digital equipment corporation) mit seinen VTxxx Terminals. Viele Terminal-Emulationen bieten solche Typen an, wobei besonders die VT220 und aufwärts interessant sind. Aber auch schon VT100 ist ganz nett.  
+
Dazu werden ANSI-Sequenzen verwendet (dass sind Zeichenfolgen mit ganz bestimmtem Aufbau). Und auch die werden noch von verschiedenen Herstellern um zusätzliche Funktionen erweitert. Besonders hervorgetan hat sich hier DEC (Digital Equipment Corporation) mit seinen VTxxx-Terminals. Viele Terminal-Emulationen bieten solche Typen an, wobei besonders die VT220 und aufwärts interessant sind. Aber auch schon VT100 ist ganz nett.
  
Die ganzen Steuersequenzen sind auch im Internet zu finden und Power-User sind gebeten, sich dort über alle Feinheiten zu informieren.  
+
Die ganzen Steuersequenzen sind auch im Internet zu finden und Power-User sind gebeten, sich dort über alle Feinheiten zu informieren.
  
Für Microcontroller ist wohl einiges zu aufwendig, aber einige Möglichkeiten möchte ich hier darstellen, da man damit doch von den unleserlich schnell durchlaufenden Einzelzeilen wegkommen kann.
+
Für Mikrocontroller ist wohl einiges zu aufwendig, aber einige Möglichkeiten möchte ich hier darstellen, da man damit doch von den unleserlich schnell durchlaufenden Einzelzeilen wegkommen kann.
  
Nicht jeder hat die Möglichkeit, und manchmal zahlt es sich auch garnicht aus, eigens ein graphikfähiges PC-Programm zu schreiben, um mit seinem Microcontroller Dialog zu führen, oder ein bißchen Balkengraphik zu zeigen.  
+
Nicht jeder hat die Möglichkeit, und manchmal zahlt es sich auch gar nicht aus, eigens ein graphikfähiges PC-Programm zu schreiben, um mit seinem Microcontroller Dialog zu führen, oder ein bisschen Balkengraphik zu zeigen.  
  
 
Den Typ VT100 bieten BasCom und Hyperterm an, wollen wir mal sehen
 
Den Typ VT100 bieten BasCom und Hyperterm an, wollen wir mal sehen
  
 
===VT100===
 
===VT100===
'''Was wird gesendet ? (Auszug)'''
+
====Was sendet das Terminal? (Auszug)====
Bei der normalen Schreibmaschinen-Tastatur ändert sich nix. Aber die anderen Blöcke werden nun lebendig
+
Bei der normalen Schreibmaschinen-Tastatur ändert sich nichts. Aber die anderen Blöcke werden nun lebendig.
  
Nur das erste Zeichen eine Sequenz ist ein Kontrollzeichen, und zwar  
+
Nur das erste Zeichen eine Sequenz ist ein Kontrollzeichen, und zwar:
 
  <ESC>, Code 27, die anderen sind normal lesbare ASCII Zeichen
 
  <ESC>, Code 27, die anderen sind normal lesbare ASCII Zeichen
  
 
'''Pfeiltasten'''
 
'''Pfeiltasten'''
* Pfeil rauf   
+
* Pfeil oben
 
  <ESC>[A
 
  <ESC>[A
* Pfeil runter
+
* Pfeil unten
 
  <ESC>[B
 
  <ESC>[B
 
* Pfeil rechts
 
* Pfeil rechts
Zeile 122: Zeile 138:
 
  <ESC>[6~
 
  <ESC>[6~
  
'''Was kann man senden ? (Auszug)'''
+
====Was kann man senden? (Auszug)====
Wie beim Empfangen, bei den "normalen" Zeichen ändert sich nichts. Ich will auch nur einige Beispiele bringen, die auf den Geschmack bringen sollen.  
+
Wie beim Empfangen. Bei den "normalen" Zeichen ändert sich nichts. Ich will auch nur einige Beispiele aufzeigen, die einen auf den Geschmack bringen sollen.  
  
!!! Freie Positionierung des Cursors irgendwo am Schirm  
+
Freie Positionierung des Cursors irgendwo am Schirm:
  <ESC>[''nn'';''mm''f
+
  <ESC>[''nn'';''mm''H
 
dabei ist  
 
dabei ist  
 
* nn die Zeilennummer  1-24
 
* nn die Zeilennummer  1-24
 
* mm die Spalternummer 1-80 oder 1-132
 
* mm die Spalternummer 1-80 oder 1-132
  
BasCom Beispiel, das auch der C-Programmierer versteht
+
BasCom Beispiel, das auch der C-Programmierer versteht:
  PRINT chr(27);"[01;40f";
+
  PRINT chr(27);"[01;40H";
stellt den Cursor in die oberste Zeile, genau in die Mitte.'- (führende Nullen können sein, müssen aber nicht)-'
+
Stellt den Cursor in die oberste Zeile, genau in die Mitte.'- (führende Nullen können sein, müssen aber nicht)-'
  
'''Zeichen-Attribute'''
+
'''Zeichen-Attribute:'''
 
  <ESC>[''param''m    '-(das ist ein kleines "m" am Schluß)-'
 
  <ESC>[''param''m    '-(das ist ein kleines "m" am Schluß)-'
Mögliche "param" sind
+
Mögliche "param" sind:
* 0 = normal
+
* 0 = Normal
* 1 = heller (bold)
+
* 1 = Heller (bold)
* 4 = unterstrichen
+
* 4 = Unterstrichen
* 5 = blinkend
+
* 5 = Blinkend
* 7 = reverse (dunkel auf hell bzw. umgekehrt)  
+
* 7 = Reverse (dunkel auf hell bzw. umgekehrt)  
dabei können mehrere Attribute angegeben werden, dann aber mit semikolon getrennt
+
Dabei können mehrere Attribute angegeben werden, dann aber mit Semikolon getrennt:
 
  <ESC>[''param1'';''param2'';''param3''m  
 
  <ESC>[''param1'';''param2'';''param3''m  
  
Zeile 154: Zeile 170:
 
http://www.roboternetz.de/wiki/uploads/Main/Ansii_2.jpg
 
http://www.roboternetz.de/wiki/uploads/Main/Ansii_2.jpg
  
(das geht natürlich auch in einem Print-Befehl auf einmal)
+
(Das geht natürlich auch in einem Print-Befehl auf einmal.)
  
  
'''Lösch-Befehle'''
+
'''Lösch-Befehle:'''
* rechts vom Cursor die Zeile löschen  
+
* Rechts vom Cursor die Zeile löschen  
 
  <ESC>[K
 
  <ESC>[K
 
* Links vom Cursor die Zeile löschen  
 
* Links vom Cursor die Zeile löschen  
 
  <ESC>[1K
 
  <ESC>[1K
* Vom Cursor abwärst den ganzen Schirm löschen  
+
* Vom Cursor abwärts den ganzen Schirm löschen  
  <ESC>[J
+
  <ESC>[2J
 
* Oberhalb des Cursors den ganzen Schirm löschen  
 
* Oberhalb des Cursors den ganzen Schirm löschen  
 
  <ESC>[J
 
  <ESC>[J
  
 
'''Beispiel:'''  
 
'''Beispiel:'''  
Beim Programmstart erstmal den gesamten Schirm löschen und eine Überschrift in der Mitte   
+
Beim Programmstart als Erstes den gesamten Schirm löschen und eine Überschrift in der Mitte   
 
  PRINT chr(27);"[1;1f";    ' Cursor ganz rauf
 
  PRINT chr(27);"[1;1f";    ' Cursor ganz rauf
 
  PRINT chr(27);"[J";      ' den ganzen Schirm löschen
 
  PRINT chr(27);"[J";      ' den ganzen Schirm löschen
Zeile 179: Zeile 195:
  
 
'''Anmerkung:'''
 
'''Anmerkung:'''
Man kann mit diesen Sequenzen einiges tun, auch einige Spiele aus der Urzeit lassen sich damit programmieren, vor allem aber kann man z.B. Sensorwerte übersichtlich an verschiedenen Stellen des Schirme so plazieren, daß man mehrere im Auge behalten kann.  
+
Man kann mit diesen Sequenzen einiges tun. Auch einige [[Terminal_Game_mit_BasCom|Spiele aus der Urzeit]] lassen sich damit programmieren, vor allem aber kann man z.B. Sensorwerte übersichtlich an verschiedenen Stellen des Schirms so platzieren, dass man mehrere im Auge behalten kann.
 
+
 
+
 
+
==Ein kleines Spiel mit BasCom==
+
Das folgende Programm ist für einen ATmega32 geschrieben, sollte aber auch auf den meisten anderen AVRs zum Laufen zu bringen sein. Leider ist beim BasCom-Terminal die VT100-Emulation nicht ganz umfassend, es konnten z.B. beim Testen keine Codes für die Pfeil-Tasten empfangen werden. Für das Spiel müßte also das [[Main.TermHyper|Hyperterm]] oder etwas ähnliches verwendet werden.
+
Das Spiel ist in keiner Weise beeindruckend, anspruchsvoll oder ausgereift, es soll nur demonstrieren, wie man Terminal-Steuersequenzen anwenden kann.
+
 
+
http://www.roboternetz.de/wiki/uploads/Main/game.jpg
+
 
+
Der Ball bewegt sich kreuz und quer über den Schirm. Der Spieler kann mit den Pfeiltasten Rechts / Links  den "Schläger" verschieben, und so versuchen, den Ball zu treffen. Klappt das, gibt's rechts oben einen Punkt. (Mit "C" wird ein neues Spiel gestartet)
+
 
+
<pre>
+
'=======================================================================================
+
'  ANSII  Demo
+
'  Author  R.Toegel
+
'========================================================================================
+
$crystal = 8000000                                          ' Quarzfrequenz
+
$baud = 9600                                                'Baudrate für RS232
+
</pre>
+
 
+
 
+
Das sind die obligaten Definitionen. Es wäre durchaus günstig, die Baudrate zu erhöhen, das Beispiel verwendet mit Absicht die Standard-Definition.
+
 
+
<pre>
+
Config Timer0 = Timer , Prescale = 1024                    'Timer 10mS
+
Const Tmr_c_preload = 178
+
Const Tmr_c_divisor = 10                                    ' gives 100ms flag
+
 
+
On Timer0 Interrupt_ticker                              ' Timer
+
+
Dim Irptflag As Byte                                        ' Timer Interrupt occurred
+
Const Irpt_0 = 0                                            'Timer 0
+
 
+
Dim Divis As Byte                                          ' timer divisor
+
</pre>
+
 
+
Es wird nur der Timer0 verwendet, der auf 10 mS eingestellt ist. Mit einem weiteren Zähler wird letztlich alle 100 mS ein Flag gesetzt, der eine Ballbewegung auslöst. Das erzeugt ein moderates Spiel. Um schneller werden zu können, müßte man die Baudrate hinaufsetzen.
+
 
+
<pre>
+
Const Escape = &H1B
+
 
+
Dim Hit As Integer                                          ' current horz-position
+
+
Dim X_pos As Integer                                        ' current horz-position
+
Dim Y_pos As Integer                                        ' current vert-position
+
Dim X_dir As Integer                                        ' horz movement
+
Dim Y_dir As Integer                                        ' vert movement
+
Dim Block As Byte                                          ' Objekt
+
</pre>
+
 
+
 
+
Das sind die Felder zur Ballkontrolle. Um problemlos mit Vorzeichen rechnen zu können, sind sie als "integer" definiert.
+
* x_pos ist die horizontale Position am Schirm, Bereich ist 1 - 80
+
* y_pos ist die vertikale Position am Schirm, Bereich ist 1 - 24
+
* .-dir sind +1, wenn die Bewegung nach rechts / unten gehen soll, und -1, wenn umgekehrt.
+
* Block ist der Ascii-Code des "Balles". Im Beispiel wird einfach "blank" (=32) verwendet, das ergibt in der reversen Darstellung einen weißen/schwarzen Würfel.
+
 
+
<pre>
+
Dim X_bar As Byte                                          ' current Bar-pos left
+
Dim X_bar2 As Byte                                          ' current Bar-pos right
+
Dim X_barold As Byte                                        ' previous
+
</pre>
+
 
+
Diese Felder sind für den "Schläger", der sich immer in Zeile 24 befindet. 
+
* x_bar ist die neue Schlägerposition 1 - 75
+
* x_bar2 ist dessen rechtes Ende
+
* x_barold ist vorhergegangene Position
+
 
+
Dim Rxchar As Byte                                          ' Keyboard data
+
Dim Rxflag As Byte                                          ' Escape-State
+
+
Rxchar ist das gerade von der Tastatur empfangene Zeichen. Rxflag wird zu Interpretation der PfeilTasten Sequenz verwendet
+
* <ESC>[C  Pfeil rechts
+
* <ESC>[D  Pfeil links
+
 
+
<pre>
+
  Timer0 = Tmr_c_preload
+
  Enable Timer0
+
  Enable Interrupts                                        'General enable
+
  Start Timer0                                            ' timer starten
+
+
  Gosub Re_set
+
  Rxflag = 0
+
</pre>
+
 
+
 
+
Start & Initialisierung
+
 
+
<pre>
+
'==============================================================================
+
'  M A I N    L O O P
+
'==============================================================================
+
Do
+
  If Irptflag.irpt_0 = 1 Then    ' dieser Flag wir alle 10 mS von TIM0 ISR gesetzt
+
      Irptflag.irpt_0 = 0          ' löschen
+
 
+
      Gosub Set_cursor                        ' Ballposition
+
      Print " ";                              ' Ball loeschen
+
      Print Chr(8);
+
 
+
      X_pos = X_pos + X_dir                                ' ein Schritt horizontal +/-
+
 
+
      If X_pos >= 80 Or X_pos <= 1 Then                    ' limit ?
+
        X_dir = X_dir * -1                                ' ja, richtungwechsel
+
        Print Chr(7) ;                                    ' click or beep
+
      End If
+
 
+
      If Y_pos = 1 And X_pos >= 70 Then      ' wenn der "score"-Text gelöscht wird,
+
        Gosub Show_score                    ' dann neu schreiben
+
      End If
+
 
+
      Y_pos = Y_pos + Y_dir                                ' ein Schritt vertial +/-
+
 
+
      If Y_pos = 23 Then                                    ' collision ?
+
        If X_pos >= X_bar And X_pos <= X_bar2 Then        ' schlaeger flaeche ?
+
            Y_dir = Y_dir * -1                              ' ja, richtungwechsel
+
            Print Chr(7) ;                                  ' click or beep
+
            Incr Hit                                        ' erhöhen Score
+
            Gosub Show_score                                ' und zeigen
+
        End If
+
      End If
+
 
+
      If Y_pos >= 24 Or Y_pos <= 1 Then                    'limit vertikal ?
+
        Y_dir = Y_dir * -1                                'ja, richtungwechsel
+
        Print Chr(7) ;                                    ' click or beep
+
      End If
+
 
+
      Gosub Set_cursor                                      ' zeichnen block neu
+
      Gosub Set_reverse                                    ' reverse
+
      Print Chr(block);                                    ' der "Ball"
+
      Print Chr(8);                                       
+
      Gosub Set_normal
+
 
+
  End If
+
 
+
  Rxchar = Inkey()                  ' Keyboard ?
+
  If Rxchar > 0 Then
+
      Gosub Keyboard                  ' Yes
+
    End If
+
Loop
+
 
+
End
+
</pre>
+
 
+
 
+
Ein Hinweis: daß nach dem Ball ein "Backspace" chr(8)gesendet wird, hat den Grund, den blinkenden Cursor gewissermaßen "hinter" dem Ball zu verstecken.
+
 
+
<pre>
+
'==============================================================================
+
' Timer 0  interrupt
+
'==============================================================================
+
Interrupt_ticker:
+
Timer0 = Tmr_c_preload                                      ' refresh
+
      Incr Divis                            ' inkrementieren /10 Teiler
+
      If Divis > Tmr_c_divisor Then
+
        Divis = 0
+
        Irptflag.irpt_0 = 1                ' setzen 10mS Flag
+
      End If
+
Return
+
</pre>
+
 
+
 
+
Die Timer-Interrupt-Routine braucht nicht näher erklärt zu werden.
+
 
+
'''Keyboard-Routine'''
+
 
+
Je nach RxFlag hat diese Routine 3 Zustände:
+
* 0  Im Normalfall, für alle Einzeltasten. Bei "C" wird ein Spiel-Reset durchgeführt
+
Wird aber das Zeichen <ESC> ( 27 , &H1B) empfangen, wechselt der Zustand auf "1"
+
* 1  Nach einem Escape-Zeichen darf in unserm Spiel nur "[" kommen, was den Zustand auf "2" setzt, jedes andere Zeichen geht wieder auf "0", ein Klicken wird ausgelöst.
+
* 2  Jetzt kann "C" für Pfeil rechts oder "D" für Pfeil links kommen. darauf reagiert das Spiel, indem es die "Schläger" -Position verändert.
+
Auf jeden Fall ist die Sequenz aber beendet, wir gehen wieder auf Zustand "0" = normal
+
 
+
<pre>
+
Keyboard:
+
  Select Case Rxflag
+
 
+
  Case 0:
+
      Select Case Rxchar
+
      Case Escape:
+
        Rxflag = 1
+
      Case "C":
+
        Gosub Re_set
+
      Case "c":
+
        Gosub Re_set
+
      Case Else:
+
        Print Chr(7) ;                                    ' click or beep
+
      End Select
+
 
+
  Case 1:
+
      If Rxchar = "[" Then
+
        Rxflag = 2                                        ' <ESC>[
+
      Else
+
        Rxflag = 0
+
      End If
+
 
+
  Case 2:
+
      Select Case Rxchar
+
      Case "C":                                            ' Arr RIGHT
+
        If X_bar < 75 Then
+
            Incr X_bar
+
            Gosub Draw_bar
+
        End If
+
      Case "D":                                            ' Arr LEFT
+
        If X_bar > 2 Then
+
            Decr X_bar
+
            Gosub Draw_bar
+
        End If
+
      End Select
+
      Rxflag = 0                                            ' anyhow
+
  End Select
+
  Return
+
 
+
Die folgenden Routinen sind "gosubs", um das Programm übersichtlicher zu machen. 
+
 
+
Re_set:
+
  Gosub Clear_screen
+
  X_pos = 31
+
  Y_pos = 1
+
  Gosub Set_cursor
+
  Gosub Set_reverse
+
  Print " S T A R T VT100 ";                              ' text
+
  Gosub Set_normal
+
 
+
  X_pos = 1
+
  X_dir = 1
+
  Y_pos = 1
+
  Y_dir = 1
+
  Block = 32
+
  
  Hit = 0
+
==Siehe auch==
  X_bar = 38
+
* [[Terminal_Game_mit_BasCom]]
  X_barold = X_bar
+
* [[UART]]
  Gosub Draw_bar
+
  Gosub Show_score
+
  Return
+
'-------------------------------------------------------------------
+
Draw_bar:
+
  Print Chr(escape) ; "[24;" ; Str(x_barold) ; "H    ";
+
  Print Chr(escape) ; "[24;" ; Str(x_bar) ; "Hxxxxx";
+
  X_bar2 = X_bar + 4
+
  X_barold = X_bar
+
  Return
+
'-------------------------------------------------------------------
+
Show_score:
+
  Print Chr(escape) ; "[1;70" ; "HScore:" ; Str(hit) ;
+
  Return
+
'-------------------------------------------------------------------
+
Clear_screen:
+
  Print Chr(escape) ; "[1;1H";                            'Home
+
  Print Chr(escape) ; "[2J";                              'clear terminal screen
+
  Return
+
'-------------------------------------------------------------------
+
Set_cursor:
+
  Print Chr(escape) ; "[" ; Str(y_pos) ; ";" ; Str(x_pos) ; "H";
+
  Return
+
'-------------------------------------------------------------------
+
Set_reverse:
+
  Print Chr(escape) ; "[7m" ;
+
  Return
+
'-------------------------------------------------------------------
+
Set_normal:
+
  Print Chr(escape) ; "[0m";
+
  Return
+
</pre>
+
  
 +
==Weblinks==
 +
* [http://www.der-hammer.info/terminal Terminalprogramm HTherm]
 +
* [http://www.emtec.com/zoc/index.htm ZOC Terminal - Terminalprogramm für Windows und Mac OS]
 +
* [http://www.roboternetz.de/community/threads/48073-VT100-Ansi-Terminal-für-den-RP6 VT100/Ansi-Beispiel in C]
 +
* [http://www.elektronik-labor.de/RS232/2010Terminal.html einfaches Terminal, unterstützt auch USB-seriell-Adapter]
  
Vielleicht konnte ich jemanden auf den Geschmack bringen, eigene Versuche weiterzuführen.
+
==Autoren==
 +
''Artikel von [[User:PicNick|PicNick]], bearbeitet von Luma''
  
[[Kategorie:Software]]
+
[[Kategorie:Software]]
 +
[[Kategorie:Praxis|Terminalsteuerung]]

Aktuelle Version vom 31. Oktober 2011, 09:38 Uhr

Allgemeines zu Terminals

Ein Terminal dient dazu, Daten, die z.B. an einen COM-Port geschickt wurden, zu empfangen, oder Daten zu versenden. Die Daten sind meist in Textform (ASCII). Es gibt Terminals ohne GUI, diese laufen dann z.B. in einer Konsole, oder welche mit GUI. Siehe dazu

Man kann ein Terminal u.a. für folgendes verwenden (neben dem simplen Senden und Empfangen):

  • Debugginginformationen protokollieren
  • Daten aufzeichnen (loggen)
  • Daten auswerten

Es sind einige Terminalprogramme für die unterschiedlichsten Betriebsysteme vorhanden (siehe Terminalprogramme).

Was hat ein Terminal mit Robotik zu tun? Eigentlich nichts. Aber wer nicht ein LCD-Display und eine Tastatur auf seinem Board eingebaut hat, ist darauf angewiesen, mit einer Terminal-Emulation Kontakt mit seinem Controllerboard aufzunehmen.

Gleich vorweg: Da kaum ein Bastler mit einem richtigen "physischen" Terminal zu tun hat, werde ich den Zusatz "Emulation" in Zukunft streichen. Das verwirrt nur und bringt nichts. Bei so einem Terminal sind ein paar Dinge einzustellen und auf die sollte man auch achten. Häufig verwendet werden

Terminalprogramme

Es gibt einige bekannte Terminals mit einer GUI. Solche Programme für das Betriebssystem Windows sind u.a.:

Entwicklungsumgebungen wie z.B. Bascom haben oft bereits ein Terminalprogramm (siehe BasCom Terminal) integriert. Dies erleichtert das Debuggen (Fehlersuche in eigenen Programmen) erheblich. Links sind im Weblinks Bereich.

BasCom Terminal

Die Entwicklungsumgebung Bascom bringt ein eigenes, in die Entwicklungsumgebung integriertes, Terminalprogramm mit - Bascom Terminal. Die Möglichkeiten des Programms beschränken sich auf das Wichtigste.

Options » Communications

http://www.roboternetz.de/wiki/uploads/Main/basterm1.jpg

Es ist nicht viel einzustellen, die gezeigten Werte sind der Normalfall.

Hyperterm Terminal

Das Hyperterm Terminal wird standardgemäß mit jeder Windowsversion bis Windows XP mitgeliefert. In Vista und Win7 müssen die Dateien "hypertrm.dll" und "hypertrm.exe" von einer XP-Installation kopiert bzw. downgeloadet werden. Es bietet auch nur Grundfunktionen, ist aber als einfaches Terminalprogramm mit GUI gut zu gebrauchen.

Nach dem Programmstart erscheint:

Neue Verbindung

Hyper1 v2.png

Da gibt man irgendeinen Namen für die Verbindung ein, z.B. "Roboternetz".

Es erscheint: Verbinden mit

Hyper2 v2.png

Wir geben den COM-Port ein (der Port also, über den die Daten gesendet/empfangen werden sollen):

Nun können wir einige COM-Port Einstellungen wählen. Damit es zu einer Verbindung kommt müssen die gewählten Einstellungen mit den Einstellungen des Endgeräts (das über eine COM-Port Schnittstelle am Computer hängt) übereinstimmen. Sonst empfängt man nur Datenmüll oder gar nichts.

Anschlusseinstellungen

Hyper3 v2.png

  • Baudrate (Bits pro Sekunde) - Beliebt ist 9600, dass muss aber mit den Einstellungen des Controllers übereinstimmen
  • Datenbits - Normalerweise "8"
  • Parität - Normalerweise "keine"
  • Stoppbits - Normalerweise "1"
  • Flusssteuerung - Normalerweise "kein"

Jetzt ist das Hyperterm soweit zufrieden, wir aber nicht.

Hyper4 v2.png

Es geht weiter bei:

Einstellungen

Datei » Eigenschaften » Einstellungen

Hyper5 v2.png


Interessant sind:

  • Rücktaste sendet*
    • CAN (Ctrl-H) --> Terminalsteuerung
    • DEL --> Terminalsteuerung

Emulation wird hier Verschiedenes angeboten

  • Auto Detect
  • TTY

Solange man nur "print" und "input" sagt, ist dies völlig ausreichend.

  • VT100 / VT220 und evtl. andere

Diese Typen verstehen die normalen "ANSI-Steuersequenzen" und einige mehr ANSII-Sequenzen.

Das reicht, um mit dem Roboter (oder einem anderen Endgerät) kommunizieren zu können.

ASCII-Konfiguration

Um das Interesse zu wecken, einmal ein Bild der Einstellungen. Beim Thema "Terminalsteuerung" gibt es dazu mehr Information.

Hyper6 v2.png

Terminalsteuerung ANSI

Ein Terminal bietet aber auch einiges mehr als das, was bei der allgemeinen Terminalsteuerung besprochen wurde.

  • Volle Kontrolle über den Bildschirm
  • Alle Tasten können verwendet werden

Dazu werden ANSI-Sequenzen verwendet (dass sind Zeichenfolgen mit ganz bestimmtem Aufbau). Und auch die werden noch von verschiedenen Herstellern um zusätzliche Funktionen erweitert. Besonders hervorgetan hat sich hier DEC (Digital Equipment Corporation) mit seinen VTxxx-Terminals. Viele Terminal-Emulationen bieten solche Typen an, wobei besonders die VT220 und aufwärts interessant sind. Aber auch schon VT100 ist ganz nett.

Die ganzen Steuersequenzen sind auch im Internet zu finden und Power-User sind gebeten, sich dort über alle Feinheiten zu informieren.

Für Mikrocontroller ist wohl einiges zu aufwendig, aber einige Möglichkeiten möchte ich hier darstellen, da man damit doch von den unleserlich schnell durchlaufenden Einzelzeilen wegkommen kann.

Nicht jeder hat die Möglichkeit, und manchmal zahlt es sich auch gar nicht aus, eigens ein graphikfähiges PC-Programm zu schreiben, um mit seinem Microcontroller Dialog zu führen, oder ein bisschen Balkengraphik zu zeigen.

Den Typ VT100 bieten BasCom und Hyperterm an, wollen wir mal sehen

VT100

Was sendet das Terminal? (Auszug)

Bei der normalen Schreibmaschinen-Tastatur ändert sich nichts. Aber die anderen Blöcke werden nun lebendig.

Nur das erste Zeichen eine Sequenz ist ein Kontrollzeichen, und zwar:

<ESC>, Code 27, die anderen sind normal lesbare ASCII Zeichen

Pfeiltasten

  • Pfeil oben
<ESC>[A
  • Pfeil unten
<ESC>[B
  • Pfeil rechts
<ESC>[C
  • Pfeil links
<ESC>[D

EDIT Keys

  • Pos 1 (Home)
<ESC>[1~
  • Bild rauf
<ESC>[5~
  • Bild runter
<ESC>[6~

Was kann man senden? (Auszug)

Wie beim Empfangen. Bei den "normalen" Zeichen ändert sich nichts. Ich will auch nur einige Beispiele aufzeigen, die einen auf den Geschmack bringen sollen.

Freie Positionierung des Cursors irgendwo am Schirm:

<ESC>[nn;mmH

dabei ist

  • nn die Zeilennummer 1-24
  • mm die Spalternummer 1-80 oder 1-132

BasCom Beispiel, das auch der C-Programmierer versteht:

PRINT chr(27);"[01;40H";

Stellt den Cursor in die oberste Zeile, genau in die Mitte.'- (führende Nullen können sein, müssen aber nicht)-'

Zeichen-Attribute:

<ESC>[paramm     '-(das ist ein kleines "m" am Schluß)-'

Mögliche "param" sind:

  • 0 = Normal
  • 1 = Heller (bold)
  • 4 = Unterstrichen
  • 5 = Blinkend
  • 7 = Reverse (dunkel auf hell bzw. umgekehrt)

Dabei können mehrere Attribute angegeben werden, dann aber mit Semikolon getrennt:

<ESC>[param1;param2;param3m 

Beispiel: will man bei einer Eingabe den Aufforderungstext verkehrt darstellen, sendet man

PRINT chr(27);"[7m";   ' setzt attribut "revers"
PRINT "VORNAME ?>";    ' der Text
PRINT chr(27);"[0m";   ' Attribut wieder normal

http://www.roboternetz.de/wiki/uploads/Main/Ansii_2.jpg

(Das geht natürlich auch in einem Print-Befehl auf einmal.)


Lösch-Befehle:

  • Rechts vom Cursor die Zeile löschen
<ESC>[K
  • Links vom Cursor die Zeile löschen
<ESC>[1K
  • Vom Cursor abwärts den ganzen Schirm löschen
<ESC>[2J
  • Oberhalb des Cursors den ganzen Schirm löschen
<ESC>[J

Beispiel: Beim Programmstart als Erstes den gesamten Schirm löschen und eine Überschrift in der Mitte

PRINT chr(27);"[1;1f";    ' Cursor ganz rauf
PRINT chr(27);"[J";       ' den ganzen Schirm löschen
PRINT chr(27);"[1;38f";   ' In die Mitte der ersten Zeile 
PRINT chr(27);"[7m";      ' setzt attribut "revers"
PRINT "START";            ' Überschrift
PRINT chr(27);"[0m";      ' setzt attribut normal
PRINT                     ' (=neue Zeile) Cursor am Anfang der zweiten Zeile


Anmerkung: Man kann mit diesen Sequenzen einiges tun. Auch einige Spiele aus der Urzeit lassen sich damit programmieren, vor allem aber kann man z.B. Sensorwerte übersichtlich an verschiedenen Stellen des Schirms so platzieren, dass man mehrere im Auge behalten kann.

Siehe auch

Weblinks

Autoren

Artikel von PicNick, bearbeitet von Luma


LiFePO4 Speicher Test