Bascom Bausatz - Programmteile - Codeschnipsel

Fragen oder Tipps & Tricks über Software

Moderatoren: Tim Sasdrich, Sebi

goto gosub - weitere Verzweigungen

Beitragvon dussel07 » 03.09.2012, 14:29

Weiter Oben habe ich kurz Goto erwähnt.
Goto (gehe zu) ist einfach zu handhaben, sollte aber nicht ausschließlich verwendet werden!
Der Nachteil von goto ist: Wird ein Programm zu komplex läßt sich im Fehlerfall nur schwer fest feststellen an welcher Stelle der Programmlauf momentan ist, bzw. steckenbleibt / Fehler verursacht.
Besser ist der Befehl "gosub"!
Zu Gosub gehört immer auch ein return -
Beispiel
Code: Alles auswählen
goto Einsprung_1  'springe zur Einsprungadresse 1

Einsprung_1:  'hierher springt der Programmlauf und arbeitet alles was unter Einsprung_1 steht ab 
..............

besser ist
Code: Alles auswählen
if A = 100 then gosub Unterprogramm_1  'wenn die Variable A = 100 ist springe zum Unterprogramm 1

Unterprogramm_1:  'Ansprungadresse für das Unterprogramm 1 (sollte hinter END stehen)
A = 0  'setzt die Variable A auf den Wert 0
return  'bringt den Programmlauf zurück unter das gosub
Ja, - ich bin Zwilling
Benutzeravatar
dussel07
 
Beiträge: 1627
Registriert: 30.04.2009, 21:04
Wohnort: Goslar

Re: Bascom Bausatz - Programmteile - Codeschnipsel

Beitragvon Anse » 03.09.2012, 17:49

Software UART:
Für µC ohne harware UART kann auch ein Software UART verwendet werden. dafür ist nur eine Zeile Code notwendig:
Code: Alles auswählen
Open "comb.2:9600,8,n,1" For Output As #1 

comb.2: an Portb.2 werden die Daten ausgegeben. Jeder ander I/O ist auch geeignet.
9600: Baud Rate.
8: Bits
n: Parität
1: Stoppbit

Um die Ausgabe zu starten wird auch Print verwendet, aber mit Angabe des Kanals:
Code: Alles auswählen
Print #1 , A
#1 ist der Kanal, der oben Angegeben wurde. A ist in diesem Fall eine Variable .
Anse
 
Beiträge: 1442
Registriert: 09.06.2011, 14:18

Re: Bascom Bausatz - Programmteile - Codeschnipsel

Beitragvon Tim Sasdrich » 03.09.2012, 18:24

Manchmal möchte man etwas auf dem PC-Bildschirm ausgeben und auch die PC-Tastatur nutzen. Dazu muss man den µC mit dem PC verbinden (z.B. wie hier) am Programm-Anfang neben der Taktgeschwindigkeit auch die gewünschte Baudrate angeben. Diese muss mit der des Terminal-Programmes übereinstimmen. Z.B.:
Code: Alles auswählen
$baud = 19200                                               'Baudrate
Natürlich braucht man auch ein Terminal-Programm, ich nutze dafür TK Term 1.3 (download) vom Chef. Nun muss man dem Terminal-Programm noch angeben, an welchem COM-Port der µC hängt, das geht meist irgendwo in den Einstellungen, wie es bei TK Term geht, ist in der Beschreibung (LINK) erklärt. Nun kann der µC mit dem PC kommunizieren.

Mit
Code: Alles auswählen
Print "Text"
Wird der Inhalt zwischen den Anführungszeichen ausgegeben (in diesem Fall: Text) und der Cursor auf den Anfang der nächsten Zeile gesetzt.

Mit
Code: Alles auswählen
Print A
wird der Wert der Variable A ausgegeben und der Cursor auf den Anfang der nächsten Zeile gesetzt.

Mit
Code: Alles auswählen
Print chr(129)
Wird das Zeichen Nummer 129 ausgegeben und der Cursor auf den Anfang der nächsten Zeile gesetzt. Bei TK Term 1.3 entspricht dies dem ü.
Häufig verwendete Sonderzeichen bei TK Term 1.3:
Ä = 142
Ö = 153
Ü = 154
ä = 132
ö = 148
ü = 129
ß = 225
ø = 155
± = 241

Mit ";" kann man mehre Dinge zusammen ausgeben. Z.B. den Text "Messwert: " den Wert der Variable A, sowie die in Variable B gespeicherte Messtoleranz.
Code: Alles auswählen
Print "Messwert: " ; A ; " " ; chr(241) ; " " ; B
Angenommen Variable A hat den Wert 58 und Variable B den Wert 3, so erscheint als Ausgabe "Messwert: 58 ± 3" und der Cursor auf den Anfang der nächsten Zeile gesetzt.

Gibt man ein ";" am Ende der Ausgabe aus, so wird der Cursor nach der Ausgabe nicht auf den Anfang der nächsten Zeile gesetzt. Dies ist z.B. nützlich, wenn man als Ausgabe "Taster ist gedrückt!" bzw. "Taster ist nicht gedrückt!" haben möchte. Variable "Taster" hat hier den Wert 1, wenn der Taster gedrückt ist und den Wert 0, wenn er nicht gedrückt ist.
Code: Alles auswählen
Print "Taster ist " ;
If Taster = 0 Then
  Print "nicht " ;
End If
Print "gedr" ; chr(129) ; "ckt!"
Hier wird der Cursor erst nach der letzten Ausgabe auf den Anfang der nächsten Zeile gesetzt, da bei dieser kein ";" am Ende steht.

Wenn Ischarwaiting() den Wert 1 hat, bedeutet dies, dass ein Zeichen Empfangen wurde, das man nun unter Inkey() abfragen kann. Hier bekommt die Variable "Key" den Wert des empfangenen Zeichens:
Code: Alles auswählen
If Ischarwaiting() = 1 Then                               'Wenn Zeichen empfangen
  Key = Inkey()                                           'Key = Empfangenes Zeichen
endif


TK Term 1.3 kann natürlich noch mehr, als einfach nur einen Text auszugeben.
Es stehen 16 Textfarben sowie 16 Hintergrundfarben zur Verfügung und man kann auch die Position wählen, bei der man den Text ausgeben will. Zudem kann man den Bildschirm löschen und auch Den Cursor Sichtbar bzw. Unsichtbar machen. Es gibt auch noch die Möglichkeit, Normal oder Fett zu schreiben. Wie das genau geht, hat der Chef hier erklärt.
Da ich nicht ständig schauen wollte, was ich eingeben muss, damit ich z.B. Hellgelb auf Dunkelrot schreibe, habe ich die Farben mal laut Chefs Tabelle in Konstanten übersetzt, wobei ich "Hell" durch "H", "Dunkel" durch "D" und "ü" durch "ue" ersetzt habe.
Zudem habe ich das Unterprogramm "Einstellen" erstellt, damit ich nur noch ein paar Variablen zuweisen muss. Dort müssen auch nur die Variablen verwenden, die sich im Gegensatz zur vorherigen Ausgabe geändert haben.
Tf = Textfarbe
Hf = Hintergrundfarbe
Cl = Clear = Löschen (Lö ging wegen dem ö nicht)
Cs = Cursor sichtbar
Xpos = X-Posotion
Ypos = Y-Posotion
Fettdruck ist immer aktiviert, da sich das meines Empfindens besser lesen lässt.

Hier mal ein Beispielprogramm:
Spoiler: show
Code: Alles auswählen
$regfile "m16def.dat"                                       'Contorller
$crystal = 14745600                                         'Taktfrequenz
$baud = 19200                                               'Baudrate

'Variablen
Dim Key As Byte                                             'gedrückte Taste
Dim Tf As Byte                                              'Textfarbe
Dim Hf As Byte                                              'Hintergrundfarbe
Dim Tfe As Byte                                             'Textfarbe einstellen
Dim Hfe As Byte                                             'Hintergrundfarbe einstellen
Dim Cl As Bit                                               'Clear = Löschen
Dim Cs As Bit                                               'Cursor sichtbar
Dim Xpos As Byte                                            'X-Position
Dim Ypos As Byte                                            'Y-Position

'Konstanten
Const Schwarz = 0
Const Drot = 1
Const Dgruen = 2
Const Gelb = 3
Const Dblau = 4
Const Lila = 5
Const Tuerkis = 6
Const Hgrau = 7
Const Dgrau = 8
Const Hrot = 9
Const Hgruen = 10
Const Hgelb = 11
Const Hblau = 12
Const Rosa = 13
Const Zyan = 14
Const Weiss = 15

Hf = Zyan                                                   'Hintergrundfarbe = Zyan
Cl = 1                                                      'Anzeige Löschen
Gosub Einstellen                                            'Einstellen

Tf = Schwarz                                                'Textfarbe = Schwaz
Hf = Hrot                                                   'Hintergrundfarbe = Hellrot
Xpos = 32                                                   'X-Position = 32
Ypos = 12                                                   'Y-Position = 12
Gosub Einstellen                                            'Einstellen
Print "Es funktioniert" ;                                   'Ausgabe
Hf = Hgelb                                                  'Hintergrundfarbe nun Hellgelb
Gosub Einstellen                                            'Einstellen
Print "!"                                                   'Ausgabe

Do
  If Ischarwaiting() = 1 Then                               'Wenn Zeichen empfangen
    Key = Inkey()                                           'Key = Empfangenes Zeichen
    Tf = Weiss                                              'Textfarbe = Weiß
    Hf = Hblau                                              'Hintergrundfarbe = Hellblau
    Xpos = 4                                                'X-Position = 4
    Ypos = 2                                                'Y-Position = 2
    Gosub Einstellen                                        'Einstellen
    Print "Gedr" ; Chr(129) ; "ckte Taste: " ;              'Ausgabe
    Hf = Gelb                                               'Hintergrundfarbe nun Gelb
    Gosub Einstellen                                        'Einstellen
    Print "Hexadezimal: " ;                                 'Ausgabe
    Hf = Drot                                               'Hintergrundfarbe nun Dunkelrot
    Gosub Einstellen                                        'Einstellen
    Print Hex(key) ;                                        'Ausgabe
    Hf = Gelb                                               'Hintergrundfarbe nun Gelb
    Gosub Einstellen                                        'Einstellen
    Print " Zeichen: " ;                                    'Ausgabe
    Hf = Drot                                               'Hintergrundfarbe nun Dunkelrot
    Gosub Einstellen                                        'Einstellen
    Print Chr(key)
  End If
Loop

Einstellen:
  Print Chr(27) ; "[0m" ;                                   'Einstelungen zurücksetzten
  Print Chr(27) ; "[3m" ;                                   'Fettdruck

  'Textfarbe einstellen
  If Tf > 7 Then
    Print Chr(27) ; "[1m" ;                                 'helle Vordergrundfarben
    Tfe = Tf + 22
  Else
    Print Chr(27) ; "[2m" ;                                 'dunkle Vordergrundfarben
    Tfe = Tf + 30
  End If

  'Hintergrundfarbe einstellen
  If Hf > 7 Then
    Print Chr(27) ; "[4m" ;                                 'helle Hintergrundfarben
    Hfe = Hf + 32
  Else
    Print Chr(27) ; "[6m" ;                                 'dunkle Hintergrundfarben
    Hfe = Hf + 40
  End If

  Print Chr(27) ; "[" ; Tfe ; "m" ;                         'Textfarbe senden
  Print Chr(27) ; "[" ; Hfe ; "m" ;                         'Hintergrundfarbe senden

  If Cl = 1 Then
    Print Chr(27) ; "[2J" ;                                 'Bildschirm löschen, wenn gewünscht
    Print " "                                               '1. Zeichen überschreiben, da sonst dauerhaft Cursor sichtbar
  End If

  'Cursor On/Off
  If Cs = 1 Then
    Print Chr(27) ; "[25h" ;                                'Cursor Sichtbar
  Else
    Print Chr(27) ; "[25l" ;                                'Cursor unsichtbar
  End If

  If Xpos < 255 And Ypos < 255 Then
    Print Chr(27) ; "[" ; Ypos ; ";" ; Xpos ; "H" ;         'Textposition
  Elseif Cl = 1 Then
    Print Chr(27) ; "[" ; 0 ; ";" ; 0 ; "H" ;               'obere linke Ecke, falls dort überschrieben wurde
  End If

  Xpos = 255
  Ypos = 255
  Cl = 0
Return
Und die Ausgabe des Beispielprogramms:
Dateianhänge
RS232.PNG
"Der Kluge lernt aus allem und von jedem, der Normale aus seinen Erfahrungen und der Dumme weiß alles besser." - Sokrates (470 - 399 v. Chr.), griechischer Philosoph
Tim Sasdrich
 
Beiträge: 2961
Registriert: 07.01.2009, 14:15
Wohnort: Villingen-Schwenningen

Re: Bascom Bausatz - Programmteile - Codeschnipsel

Beitragvon Anse » 03.09.2012, 18:35

Ich nutze für die Komunikation zwischen µC und PC Terminal.exe
Anse
 
Beiträge: 1442
Registriert: 09.06.2011, 14:18

Vorherige

Zurück zu Software

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast