Mikrocontroller programmieren mit Bascom Basic ... - Science-Shop
Mikrocontroller programmieren mit Bascom Basic ... - Science-Shop
Mikrocontroller programmieren mit Bascom Basic ... - Science-Shop
Erfolgreiche ePaper selbst erstellen
Machen Sie aus Ihren PDF Publikationen ein blätterbares Flipbook mit unserer einzigartigen Google optimierten e-Paper Software.
Ulli Sommer<br />
PC & ELEKTRONIK<br />
<strong>Mikrocontroller</strong><br />
<strong>programmieren</strong> <strong>mit</strong><br />
<strong>Bascom</strong> <strong>Basic</strong><br />
Messen, Steuern, Regeln und Robotertechnik<br />
<strong>mit</strong> den AVR-Controllern<br />
Auf CD-ROM:<br />
Komplette Software für den Einstieg<br />
Über 100 Quellcodes zu den Experimenten<br />
Open-Source-VB.NET-Programme zum Messen und Steuern
Ulli Sommer<br />
<strong>Mikrocontroller</strong> <strong>programmieren</strong><br />
<strong>mit</strong> <strong>Bascom</strong> <strong>Basic</strong>
Mit 161 Abbildungen<br />
PC & ELEKTRONIK<br />
Ulli Sommer<br />
<strong>Mikrocontroller</strong><br />
<strong>programmieren</strong> <strong>mit</strong><br />
<strong>Bascom</strong> <strong>Basic</strong><br />
Messen, Steuern, Regeln und Robotertechnik<br />
<strong>mit</strong> den AVR-Controllern
Bibliografische Information der Deutschen Bibliothek<br />
Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;<br />
detaillierte Daten sind im Internet über http://dnb.ddb.de abrufbar.<br />
Alle in diesem Buch vorgestellten Schaltungen und Programme wurden <strong>mit</strong> der größtmöglichen Sorgfalt entwickelt, geprüft und<br />
getestet. Trotzdem können Fehler im Buch und in der Software nicht vollständig ausgeschlossen werden. Verlag und Autor haften in<br />
Fällen des Vorsatzes oder der groben Fahrlässigkeit nach den gesetzlichen Bestimmungen. Im Übrigen haften Verlag und Autor nur<br />
nach dem Produkthaftungsgesetz wegen der Verletzung des Lebens, des Körpers oder der Gesundheit oder wegen der schuldhaften<br />
Verletzung wesentlicher Vertragspflichten. Der Schadensersatzanspruch für die Verletzung wesentlicher Vertragspflichten ist auf den<br />
vertragstypischen, vorhersehbaren Schaden begrenzt, soweit nicht ein Fall der zwingenden Haftung nach dem Produkthaftungsgesetz<br />
gegeben ist. Für die Mitteilung etwaiger Fehler sind Verlag und Autor jederzeit dankbar. Internetadressen oder Versionsnummern<br />
stellen den bei Redaktionsschluss verfügbaren Informationsstand dar. Verlag und Autor übernehmen keinerlei Verantwortung<br />
oder Haftung für Veränderungen, die sich aus nicht von ihnen zu vertretenden Umständen ergeben. Evtl. beigefügte oder zum<br />
Download angebotene Dateien und Informationen dienen ausschließlich der nicht gewerblichen Nutzung. Eine gewerbliche Nutzung<br />
ist nur <strong>mit</strong> Zustimmung des Lizenzinhabers möglich.<br />
© 2011 Franzis Verlag GmbH, 85540 Haar bei München, www.franzis.de<br />
Alle Rechte vorbehalten, auch die der fotomechanischen Wiedergabe und der Speicherung in elektronischen Medien. Das Erstellen<br />
und Verbreiten von Kopien auf Papier, auf Datenträgern oder im Internet, insbesondere als PDF, ist nur <strong>mit</strong> ausdrücklicher Genehmigung<br />
des Verlags gestattet und wird widrigenfalls strafrechtlich verfolgt.<br />
Die meisten Produktbezeichnungen von Hard- und Software sowie Firmennamen und Firmenlogos, die in diesem Werk genannt<br />
werden, sind in der Regel gleichzeitig auch eingetragene Warenzeichen und sollten als solche betrachtet werden. Der Verlag folgt bei<br />
den Produktbezeichnungen im Wesentlichen den Schreibweisen der Hersteller.<br />
Satz: DTP-Satz A. Kugge, München<br />
art & design: www.ideehoch2.de<br />
Druck: Bercker, 47623 Kevelaer<br />
Printed in Germany<br />
ISBN 978-3-645-65041-0
Vorwort<br />
<strong>Mikrocontroller</strong> zu <strong>programmieren</strong> wird, wie man in den verschiedensten Foren<br />
und Fachzeitschriften beobachten kann, immer populärer. Das liegt daran, dass<br />
<strong>Mikrocontroller</strong> und zusätzliche Peripheriebausteine immer günstiger angeboten<br />
werden und an Schulen zunehmend in <strong>Mikrocontroller</strong> und Computertechnik<br />
unterrichtet wird. Schaltungen, die man früher <strong>mit</strong> mehreren ICs aufbauen<br />
musste, können nun in einem einzigen <strong>Mikrocontroller</strong> untergebracht werden.<br />
Das spart Zeit, Geld und Platz auf der Leiterplatte. Dieses Buch baut auf dem<br />
beliebten <strong>Basic</strong>-Compiler BASCOM-AVR <strong>mit</strong> integrierter Entwicklungsumgebung<br />
auf. Er ist für fast alle 8-Bit-AVR- und XMega-<strong>Mikrocontroller</strong> der<br />
Firma Atmel geeignet. BASCOM erfreut sich nicht nur bei Einsteigern, sondern<br />
auch bei Entwicklungsprofis, immer größerer Beliebtheit und stellt inzwischen<br />
schon fast einen <strong>Basic</strong>-Standard bei AVRs dar.<br />
Viele Problemstellungen, die früher zeitaufwendig in Assembler oder C gelöst<br />
werden mussten, können durch diesen modernen Compiler blitzschnell <strong>mit</strong><br />
wenigen Befehlen erledigt werden. Beispielsweise genügt ein einziger Befehl, um<br />
aus einem I/O-Port eine RS232-Schnittstelle, einen I²C-Bus oder einen<br />
Servoanschluss zu machen. Solche Dinge erfordern in anderen Programmiersprachen<br />
oft einen enormen Aufwand.<br />
BASCOM erzeugt optimierten Maschinen-Code. Es werden alle AVR-RISC-<br />
Controller <strong>mit</strong> internem RAM der Serien AT90S, ATmega und ATTiny unterstützt.<br />
Mit einigen Einschränkungen sind jetzt auch ATTiny-Controller ohne<br />
SRAM <strong>mit</strong> BASCOM-AVR programmierbar. Dazu steht die $TINY-Funktion zur<br />
Verfügung.<br />
Aus diesen Gründen ist der BASCOM <strong>Basic</strong>-Compiler ideal für den Einstieg in<br />
die <strong>Mikrocontroller</strong>-Programmierung geeignet. Er ist trotzdem sehr leistungsfähig<br />
und ermöglicht auch optimierte komplexe Software-Entwicklungen <strong>mit</strong><br />
Profianforderungen. Ein weiterer großer Vorteil ist, dass diese Entwicklungsumgebung<br />
in hohem Tempo weiterentwickelt wird und die Updates kostenlos<br />
sind. So war BASCOM auch eine der ersten AVR-Entwicklungsumgebungen, die<br />
unter Vista und Windows 7 liefen.<br />
Ich wünsche Ihnen viel Spaß beim Lesen und Experimentieren <strong>mit</strong> diesem Buch!<br />
Waidhaus, Juli 2011<br />
Ulli Sommer<br />
5
Inhaltsverzeichnis<br />
1 Die CD-ROM zum Buch....................................................................... 13<br />
1.1 Inhalt der CD-ROM .............................................................. 13<br />
1.2 GPL (General Public License)............................................... 13<br />
1.3 Systemvoraussetzungen..................................................... 13<br />
1.4 Updates und Support ......................................................... 13<br />
2 <strong>Mikrocontroller</strong>-Grundlagen .............................................................. 15<br />
2.1 Aufbau und Funktionsweise................................................ 16<br />
2.2 Die CPU .............................................................................. 16<br />
2.3 Arbeits- und Programmspeicher.......................................... 17<br />
2.4 Peripherie........................................................................... 17<br />
3 <strong>Mikrocontroller</strong>-Programmierung im Allgemeinen.............................. 19<br />
3.1 Was ist ein Programm?........................................................ 19<br />
3.2 Programmierung in <strong>Basic</strong> .................................................... 19<br />
3.3 Konzept von <strong>Basic</strong> .............................................................. 20<br />
3.4 Vor- und Nachteile von <strong>Basic</strong> .............................................. 20<br />
3.5 Programmierung in Assembler ............................................ 20<br />
4 Übersicht über die Atmel-8-Bit-<strong>Mikrocontroller</strong> ................................. 23<br />
4.1 AT90Sxxx............................................................................ 23<br />
4.2 ATmega .............................................................................. 23<br />
4.3 ATTiny ................................................................................ 24<br />
4.4 XMega................................................................................ 24<br />
5 Der ATmega88 für die Experimente und seine<br />
Grundbeschaltung für den Betrieb ..................................................... 25<br />
5.1 Speicher............................................................................. 25<br />
5.2 Die interessantesten Pins des ATmega88 auf<br />
einen Blick ......................................................................... 26<br />
5.3 Grundschaltung für den Betrieb .......................................... 27<br />
5.4 ADC (Analog Digital Converter)............................................ 28<br />
5.5 PWM (Pulse Width Modulation)........................................... 28<br />
5.6 UART (Universal Asynchronous Receiver<br />
Trans<strong>mit</strong>ter)........................................................................ 28<br />
5.7 IRQ (Interrupt)..................................................................... 28<br />
5.8 Stromversorgung des Controllers ........................................ 29<br />
5.9 Resetbeschaltung............................................................... 29<br />
7
8 Inhaltsverzeichnis<br />
5.10 Oszillator............................................................................ 30<br />
5.11 ISP-Anschluss zur Programmierung..................................... 30<br />
6 Programmiergeräte............................................................................ 33<br />
7 Interessante AVR-Boards für den Einstieg .......................................... 37<br />
7.1 RN-CONTROL ...................................................................... 37<br />
7.2 RN-Mega8PLUS................................................................... 38<br />
7.3 RN-MINICONTROL ............................................................... 40<br />
8 BASCOM installieren ......................................................................... 41<br />
9 Der <strong>Basic</strong>-Compiler – BASCOM .......................................................... 47<br />
9.1 Landessprache auswählen ................................................. 47<br />
9.2 Die BASCOM-IDE................................................................. 48<br />
9.3 BASCOM-Hilfe .................................................................... 49<br />
9.4 BASCOM-Einstellungen....................................................... 50<br />
10 Der erste Hardware-Test »Es blinkt« .................................................. 55<br />
10.1 Was haben wir getan?......................................................... 60<br />
11 Grundlagen des Programmierens....................................................... 61<br />
11.1 Bits und Bytes .................................................................... 61<br />
11.2 Grundsätzlicher Aufbau eines Programms........................... 62<br />
11.3 Sequenzieller Programmablauf ........................................... 62<br />
11.4 Interrupt-gesteuerter Programmablauf ................................ 63<br />
12 BASCOM-AVR <strong>Basic</strong> – Programmierkurs............................................. 65<br />
12.1 Der Aufbau eines BASCOM-Programms ............................... 65<br />
12.2 Testaufbau <strong>mit</strong> MAX232...................................................... 65<br />
12.3 Testaufbau <strong>mit</strong> FTDI FT232RL .............................................. 68<br />
12.4 Test der seriellen Ausgabe.................................................. 69<br />
12.5 Der Simulator ..................................................................... 71<br />
12.6 Die Hardware-Simulation.................................................... 73<br />
12.7 Kommentare im Quelltext ................................................... 74<br />
12.8 Datentypen und Variablen .................................................. 74<br />
12.9 Lokale und globale Variablen.............................................. 75<br />
12.10 Variablen-Zuweisung.......................................................... 75<br />
12.11 Arrays................................................................................. 76<br />
12.12 Operatoren......................................................................... 77<br />
12.13 Kontrollstrukturen .............................................................. 77<br />
12.13.1 If Then – End if ................................................................... 77<br />
12.13.2 If Then – Else – End if ......................................................... 78<br />
12.13.3 If und ElseIf ........................................................................ 79
Inhaltsverzeichnis 9<br />
12.13.4 Select Case......................................................................... 80<br />
12.14 Schleifen ............................................................................ 81<br />
12.14.1 For Next.............................................................................. 81<br />
12.14.2 Do Loop und Do Until.......................................................... 82<br />
12.14.3 While Wend ........................................................................ 84<br />
12.15 Funktionen, Prozeduren und Labels .................................... 84<br />
12.15.1 Subroutinen ....................................................................... 85<br />
12.15.2 Funktionen ......................................................................... 86<br />
12.15.3 Gosub ................................................................................ 87<br />
12.15.4 Goto ................................................................................... 87<br />
12.15.5 On...................................................................................... 88<br />
12.16 String und String-Bearbeitung............................................. 89<br />
12.16.1 Strings................................................................................ 89<br />
12.16.2 Ucase ................................................................................. 90<br />
12.16.3 Lcase.................................................................................. 90<br />
12.16.4 Bin ..................................................................................... 91<br />
12.16.5 Hex..................................................................................... 91<br />
12.16.6 Hexval ................................................................................ 91<br />
12.16.7 Val ..................................................................................... 92<br />
12.16.8 Str ...................................................................................... 92<br />
12.16.9 String ................................................................................. 93<br />
12.16.10 Space................................................................................. 93<br />
12.16.11 Fusing ................................................................................ 93<br />
12.16.12 Format................................................................................ 94<br />
12.16.13 Len..................................................................................... 95<br />
12.16.14 Instr ................................................................................... 95<br />
12.16.15 Mid .................................................................................... 96<br />
12.16.16 Split ................................................................................... 96<br />
12.16.17 Left..................................................................................... 97<br />
12.16.18 Right .................................................................................. 97<br />
12.16.19 Ltrim................................................................................... 98<br />
12.16.20 Rtrim .................................................................................. 98<br />
12.16.21 Trim.................................................................................... 98<br />
13 Input/Output-Konfiguration und Port-Setzen ................................... 101<br />
14 Timer als Timer verwenden .............................................................. 109<br />
15 Timer als Counter verwenden........................................................... 115<br />
16 Der Analog-Digital-Wandler (ADC) .................................................... 119<br />
16.1 Verwendung des ADC........................................................ 122
10 Inhaltsverzeichnis<br />
17 Externe Interrupts............................................................................ 125<br />
18 Die UART-Schnittstelle..................................................................... 129<br />
18.1 Ein- und Ausgeben von Daten (Input, Inkey,<br />
Print) ................................................................................ 131<br />
18.2 Software-UART.................................................................. 133<br />
19 Sleep Modes.................................................................................... 135<br />
20 Weitere Experimente und praktische Anwendungen......................... 139<br />
20.1 Taster entprellen .............................................................. 139<br />
20.2 Einschaltverzögerung ....................................................... 142<br />
20.3 Ausschaltverzögerung ...................................................... 144<br />
20.4 LEDs an den Pins des <strong>Mikrocontroller</strong>s.............................. 145<br />
20.5 Größere Verbraucher <strong>mit</strong> Transistoren schalten................. 148<br />
20.6 Tonerzeugung <strong>mit</strong> dem Befehl Sound................................ 150<br />
20.7 Töne über den 8-Bit-Timer0 erzeugen................................ 152<br />
20.8 Morsecode-Generator ....................................................... 154<br />
20.9 Impulszähler <strong>mit</strong> dem 8-Bit-Timer0 ................................... 157<br />
20.10 Impulslängenmessung ..................................................... 159<br />
20.11 PWM (Pulse Width Modulation)......................................... 161<br />
20.12 DAC <strong>mit</strong> PWM-Ports........................................................... 165<br />
20.13 Transistor-LED-Dimmer ..................................................... 168<br />
20.14 LED-Dimmer <strong>mit</strong> dem 8-Bit-Timer0 .................................... 170<br />
20.15 Softer Blinker ................................................................... 171<br />
20.16 Zufallszahlen <strong>mit</strong> BASCOM ............................................... 173<br />
20.17 Überwachung des Personalausgangs................................ 174<br />
20.18 RTC (Real Time Clock) ....................................................... 177<br />
20.19 Lüftersteuerung ................................................................ 178<br />
20.20 Dämmerungsschalter........................................................ 182<br />
20.21 Alarmanlage ..................................................................... 185<br />
20.22 Digitales Codeschloss ...................................................... 187<br />
20.23 Kapazitätsmesser <strong>mit</strong> Autorange....................................... 190<br />
20.24 Potenziometer professionell auslesen .............................. 193<br />
20.25 State Machine .................................................................. 194<br />
20.26 6-Kanal-Voltmeter............................................................. 196<br />
20.27 Spannungs-Plotter selbst programmiert............................ 199<br />
20.28 StampPlot – der Profi-Datenlogger zum Nulltarif ............... 201<br />
20.29 Steuern über VB.NET......................................................... 205<br />
20.30 Leuchtdiodentester .......................................................... 207<br />
20.31 GPS-Mäuse auslesen........................................................ 208<br />
20.32 Temperaturschalter .......................................................... 216<br />
20.33 Temperaturmessung <strong>mit</strong> dem LM335 ................................ 218<br />
20.34 MIN/MAX-Thermometer .................................................... 221
Inhaltsverzeichnis 11<br />
20.35 Temperatur-Logger............................................................ 223<br />
20.36 LCDs und ihre Verwendung ............................................... 229<br />
20.36.1 LC-Display – Grundlagen................................................... 230<br />
20.36.2 Polarisation von Displays.................................................. 230<br />
20.36.3 Statische Ansteuerung, Multiplexbetrieb .......................... 231<br />
20.36.4 Blickwinkel 6 Uhr/12 Uhr.................................................. 231<br />
20.36.5 Reflektiv, transflektiv, transmissiv .................................... 231<br />
20.36.6 Der Controller des LC-Displays .......................................... 232<br />
20.36.7 Display vom Displaycontroller ansteuern .......................... 233<br />
20.36.8 Kontrasteinstellung des Displays ...................................... 234<br />
20.36.9 Der Befehlssatz der HD44780- und KS0066-<br />
Controller und kompatibler Typen ..................................... 236<br />
20.36.10 Der Zeichensatz................................................................ 237<br />
20.36.11 Pin-Belegung der gängigen LCDs....................................... 238<br />
20.36.12 So wird das Display <strong>mit</strong> dem <strong>Mikrocontroller</strong><br />
angesteuert ...................................................................... 240<br />
20.36.13 Initialisierung der Displays ............................................... 241<br />
20.36.14 Der Anschluss am <strong>Mikrocontroller</strong>..................................... 243<br />
20.36.15 Der erste Test <strong>mit</strong> BASCOM ............................................... 244<br />
20.36.16 Die LCD-Routinen von BASCOM......................................... 245<br />
20.36.17 Eigene Zeichen <strong>mit</strong> BASCOM erstellen............................... 250<br />
20.37 Der I²C-Bus ....................................................................... 255<br />
20.38 LCDs über den I²C-Bus verbinden...................................... 258<br />
20.39 I²C-Temperatursensor LM75.............................................. 260<br />
20.40 Temperatursensor DS1621 ............................................... 262<br />
20.41 I²C-Portexpander <strong>mit</strong> PCF8574 .......................................... 264<br />
20.42 Ultraschallsensoren zur Entfernungsbestimmung.............. 267<br />
20.42.1 Der SRF02-Ultraschallsensor............................................. 267<br />
20.42.2 Auslesen der Entfernungsdaten ........................................ 268<br />
20.42.3 Die I²C-Adresse des SRF02 ändern .................................... 271<br />
20.42.4 Ultraschallsensor SRF08 ................................................... 272<br />
20.43 Servos .............................................................................. 273<br />
20.44 Schrittmotoransteuerung.................................................. 277<br />
20.45 Impulsgeber <strong>mit</strong> der Lichtschranke CNY70 ........................ 284<br />
20.46 Impulsgeber <strong>mit</strong> Reflexlichtschranke SFH-9102................. 286<br />
20.47 Ein GPS-Navigationssystem für Roboter ............................ 290<br />
20.47.1 ATmega32 als Navigator ................................................... 291<br />
20.47.2 Motoransteuerung ............................................................ 292<br />
20.47.3 Track-Points <strong>programmieren</strong> ............................................. 294<br />
20.48 <strong>Mikrocontroller</strong>gesteuerter Rasenmähroboter ................... 296<br />
20.48.1 Das Chassis...................................................................... 299<br />
20.48.2 Das Mähwerk.................................................................... 301<br />
20.48.3 Sensoren.......................................................................... 304<br />
20.48.4 Der elektronische Gartenzaun........................................... 305
12 Inhaltsverzeichnis<br />
20.49 RC5-4-Kanal-Relaiskarte ................................................... 310<br />
20.49.1 Wie funktioniert die IR-Fernbedienung?............................. 310<br />
20.49.2 Der Aufbau des RC5-Codes ............................................... 311<br />
20.49.3 So werden die einzelnen Bits übertragen .......................... 312<br />
20.49.4 RC5-Code <strong>mit</strong> BASCOM einlesen ....................................... 315<br />
20.49.5 Verwirklichung der IR-Relaisplatine................................... 316<br />
20.50 Telemetriesystem für eine Modellflugdrohne..................... 319<br />
Schlusswort..................................................................................... 330<br />
A Anhang............................................................................................ 333<br />
A.1 Schaltzeichen................................................................... 333<br />
A.2 Escape-Sequenzen ........................................................... 334<br />
A.2.1 Terminal-Ausgaben........................................................... 334<br />
A.2.2 Terminal-Befehle .............................................................. 334<br />
A.3 ASCII-Tabelle .................................................................... 335<br />
A.4 Reservierte Worte in BASCOM ........................................... 339<br />
A.5 Bezugsquellen.................................................................. 342<br />
A.6 Links ................................................................................ 343
6 Programmiergeräte<br />
33<br />
Wenn Sie hauptsächlich <strong>mit</strong> BASCOM und 8-Bit-Atmel-Controllern arbeiten<br />
möchten, empfehle ich, den BASCOM USB-ISP-Programmer zu verwenden. Er<br />
kann direkt <strong>mit</strong> BASCOM verwendet werden und man kann zudem auch die Fuse-<br />
und Lock-Bits unter BASCOM einstellen. Mit der USB-Schnittstelle ist er nicht nur<br />
sehr schnell bei der Programmierung, sondern erlaubt auch den Betrieb an neueren<br />
Rechnern, die meist nur noch über USB-Schnittstellen verfügen.<br />
Bild 6.1: BASCOM USB-ISP-Programmer.<br />
Beziehen lässt sich der Programmer direkt vom BASCOM-Hersteller oder in<br />
Deutschland über www.Robotikhardware.de.<br />
Weit verbreitet ist auch der Atmel USB-ISP-Programmer MKII. Er wird nicht<br />
direkt unter BASCOM unterstützt, lässt sich aber auch dafür einrichten – jedoch<br />
nicht so komfortabel wie der BASCOM-eigene Programmer. Eine Aufstellung der<br />
unter BASCOM verwendbaren Programmiergeräte finden Sie unter http://avrhelp.<br />
mcselec.com/index.html?supported_programmers.htm.
34 Kapitel 6: Programmiergeräte<br />
In diesem Buch wird der BASCOM USB-ISP-Programmer verwendet. Die Art, wie<br />
bei der Programmierung vorgegangen wird, ist bei anderen Programmiergeräten<br />
ähnlich.<br />
Eine kostengünstige Alternative zu käuflich erwerbbaren Programmiergeräten ist<br />
der Eigenbau. Es werden nicht allzu viele Bauteile benötigt, womöglich finden<br />
sich die Teile sogar in Ihrer Bastelkiste. Der zu verwendende Computer muss<br />
jedoch eine parallele Schnittstelle besitzen. Der folgende Schaltplan zeigt, wie es<br />
geht.<br />
Bild 6.2: Parallel-Port ISP-Programmer. (Quelle: BASCOM-Hilfe)<br />
Diese Version ist auch bei verschiedenen Elektronikversendern für meist unter<br />
20 € käuflich zu erwerben.<br />
Es gibt noch eine Sparversion eines Parallel-Port-ISP-Programmers. Sie ist aber<br />
<strong>mit</strong> Vorsicht zu genießen, da ein Kurzschluss der I/Os des Parallelports zu einem<br />
Defekt der Schnittstelle führen kann. Die 330-Ohm-Widerstände schützen den<br />
Port nur geringfügig. Es ist also immer ratsamer, die Version <strong>mit</strong> dem Puffer-IC<br />
74HC244 aufzubauen.
Kapitel 6: Programmiergeräte 35<br />
Bild 6.3: Der »Lowcost«-ISP-Programmer für die parallele Schnittstelle.
7 Interessante AVR-Boards<br />
für den Einstieg<br />
37<br />
Es gibt natürlich auch einige kostengünstige AVR-Boards zu kaufen, die den<br />
Einstieg in die AVR-Welt vereinfachen. Eine breite Palette diverser AVR-Platinen<br />
bietet die Firma Robotikhardware an. Die Module besitzen meist schon diverse<br />
Zusatzhardware wie DC-Motortreiber, Schrittmotortreiber, Funkmodule, Schaltausgänge<br />
<strong>mit</strong> Transistoren oder Relais. Programmiert werden die Boards wie die<br />
Eigenbauschaltung. Es folgt ein kleiner Überblick verschiedenster <strong>Mikrocontroller</strong>-Platinen<br />
aus dem Angebot der Firmen Robotikhardware und Atmel.<br />
7.1 RN-CONTROL<br />
Für den Einstieg, erste <strong>Mikrocontroller</strong>-Experimente aber auch für konkrete<br />
Projekte wie autonome Roboter, Steuerungen und vieles mehr gibt es das Board<br />
RN-CONTROL. Bei der Entwicklung wurde besonders auf ein gutes Preis-<br />
Leistungs-Verhältnis geachtet. Trotz günstigen Preises ist ein sehr flexibles Board<br />
für unzählige Anwendungsmöglichkeiten entstanden. Über den I²C-Bus stehen<br />
zahlreiche Erweiterungs-Boards zur Verfügung. So können beispielsweise die<br />
gleichen I²C-Erweiterungen kombiniert werden wie beim großen RNBFRA-<br />
Board (Relaiskarte, Sprachausgabe usw.).
38 Kapitel 7: Interessante AVR-Boards für den Einstieg<br />
Bild 7.1: RN-Control 1.4. (Quelle: Robotikhardware)<br />
Besonders viel Wert wurde auch auf den einfachen Aufbau und viele Experimentier-<br />
und Einsatzmöglichkeiten gelegt. Mit diesem Board lässt sich schon ein<br />
recht ausgereifter Roboter konstruieren. Ultraschallsensoren, Infrarot-Entfernungssensoren,<br />
Motoren u. v. m. können direkt angeschlossen werden. Da das<br />
Board auch in der Community Roboternetz recht beliebt ist, findet man dort<br />
viele Tipps und Programme.<br />
7.2 RN-Mega8PLUS<br />
Der Nachfolger des RN-Mega8-Boards, jetzt <strong>mit</strong> Funkmodulsteckplatz und<br />
weiteren Optimierungen. Dieses Nachfolge-Board wurde speziell zum Experimentieren<br />
<strong>mit</strong> den <strong>Mikrocontroller</strong>n Mega8 und Mega168 entworfen.
Bild 7.2: RN-Mega8PLUS. (Quelle: Robotikhardware)<br />
7.2 RN-Mega8PLUS 39<br />
Die Controller Mega8 und Mega168 eignen sich wegen ihres günstigen Preises<br />
und ihrer geringen Baugröße für zahlreiche Aufgaben, bei denen ein Mega16<br />
oder ein Mega32 überdimensioniert wäre. Im Bereich Robotik kann dieser Controller<br />
ideal auch als Co-Controller für Servosteuerung, Motorsteuerung, Display-Ausgabe,<br />
Sensorüberwachung und vieles mehr eingesetzt werden. Oft sind<br />
kaum externe Bauteile notwendig. Um den Controller jedoch für eine spezielle<br />
Aufgabe <strong>programmieren</strong> zu können, bedarf es einer Entwicklungsumgebung die<br />
quasi alle Ports steckbar zugänglich macht, also auch die visuelle Überwachung<br />
der Port-Zustände erlaubt.<br />
Für diese Aufgabe ist RN-Mega8PLUS ideal. Ganze 20 Ports können gleichzeitig<br />
visuell über Leuchtbalken überwacht werden. Nahezu alle Ports sind über einfache<br />
Steckklemmen erreichbar. Zudem verfügt das Board über jeweils einen<br />
genormten LCD-Display-, I²C-Bus-, RS-232-, Servo- und ISP-Anschluss.<br />
Eine Besonderheit von RN-Mega8PLUS ist der Steckplatz für ein EasyRadio-<br />
Funkmodul. Dadurch wird das Board funkkompatibel zu RN-Mega128Funk,<br />
RN-Steuerung und RN-Funk. So können Daten <strong>mit</strong> anderen Boards oder<br />
PCs per Funk ausgetauscht werden. Das Funkmodul ist optional über<br />
www.robotikhardware.de beziehbar – es wird nur eingesteckt und man kann loslegen.
40 Kapitel 7: Interessante AVR-Boards für den Einstieg<br />
7.3 RN-MINICONTROL<br />
Dieses Controllerboard zeichnet sich durch seine kompakte Größe (nur 5 cm x<br />
7,8 cm) und sehr geringen Strombedarf aus. Besonders viel Wert wurde auch auf<br />
die vielseitigen Anschlüsse gelegt. Nahezu alle Ports stehen dem Anwender so<strong>mit</strong><br />
zur Verfügung. Besonders günstig sind die wichtigen AD-, Interrupt-, Timer-<br />
und PWM-Ports auf die Stecker verteilt worden. So lassen sich Servos, Drehgeber<br />
und RC-Empfänger, aber auch Motortreiber (Doppel-H-Brücken wie RN-<br />
VN2Dualmotor) oder LCDs direkt anschließen. Natürlich steht auch der I²C-Bus<br />
zur Verfügung. Alle Stecker sind zudem kompatibel zu den Roboternetz-Definitionen.<br />
Bild 7.3: RN-MINICONTROL. (Quelle: Robotikhardware)<br />
Obwohl das Board, wie auch der »große Bruder« RN-Control, zum Experimentieren<br />
als Haupt-Board verwendet werden kann, ist es in erster Linie als praktisch<br />
einsetzbares Zusatz-Board für echte Projekte gedacht.<br />
RN-MINICONTROL ist als kostengünstiges Co-Controllerboard ideal als Zweit-<br />
oder Dritt-Board in Projekten (Roboter etc.). Ein besonderes Feature sind zwei<br />
Stiftleisten auf der Unterseite. Dadurch kann das Board auf ein anderes Board<br />
wie RN-VNH2Dualmotor oder Lochrasterplatinen aufgesteckt werden. Das<br />
Board ist <strong>mit</strong> dem leistungsstarken Controller ATmega168 ausgestattet. Er ist<br />
weitgehend kompatibel zum ATmega8, daher kann wahlweise auch ein ATmega8<br />
bestückt werden. Der Mega168 bietet jedoch weit mehr Features: 6x PWM, drei<br />
Timer, 16 KB Speicher und Interrupt an jedem Pin.
12 BASCOM-AVR <strong>Basic</strong> –<br />
Programmierkurs<br />
65<br />
Wer <strong>mit</strong> BASCOM seine ersten Programmierschritte wagt, sollte diese Kapitel<br />
genauer studieren und die Beispiele ausprobieren, bis er sie versteht. Dieser<br />
Grundlagenkurs der BASCOM-Programmierung legt den Grundstein für weitere<br />
Programme. Lassen Sie nicht gleich den Kopf hängen, wenn etwas nicht auf<br />
Anhieb klappt. Auch im Profibereich funktioniert nicht immer alles beim ersten<br />
Mal. Die Freude ist umso größer, wenn ein Versuch nach mehreren Anläufen<br />
endlich klappt, und man kann dabei nur lernen.<br />
12.1 Der Aufbau eines BASCOM-Programms<br />
Infotexte und Programmbeschreibung (Header)<br />
Prozessorangaben und Konfiguration<br />
Konfiguration der seriellen Schnittstelle<br />
Port, ADC, Timer, PWM-Konfiguration<br />
Variable anlegen, Alias für Ports<br />
Interrupts aktivieren<br />
Hauptschleife<br />
Eigene Prozeduren, Routinen und IRQ-Routinen<br />
Daten für LCD-Character oder Tabellen<br />
Include Files<br />
12.2 Testaufbau <strong>mit</strong> MAX232<br />
An dieser Stelle schreiben wir gleich das nächste BASCOM-<strong>Basic</strong>-Programm.<br />
Tippen Sie zur Übung den Quelltext einfach ab oder entnehmen Sie den Quellcode<br />
der CD-ROM unter Beispiele. Das Programm benötigt das interne Terminalprogramm<br />
von BASCOM und einen passenden Schnittstellenwandler (z. B.<br />
MAX232) oder einen USB-zu-UART-Brückenchip (z. B. FT232RL oder CP2102).<br />
Eine Beispielschaltung dazu zeigt der folgende Schaltplan.
66 Kapitel 12: BASCOM-AVR <strong>Basic</strong> – Programmierkurs<br />
Bild 12.1: Der Schaltplan zeigt eine serielle Verbindung zum PC über einen Schnittstellenwandler MAX232.
12.2 Testaufbau <strong>mit</strong> MAX232 67<br />
Es gibt verschiedene MAX232-Typen. Neuere Typen benötigen nur noch kleine<br />
Kondensatoren wie hier 100 nF. Im Datenblatt zu Ihren verwendeten Schnittstellenwandlern<br />
finden Sie die passenden Werte.<br />
Der Schnittstellenwandler setzt das RS-232-Signal vom PC (+/-12 V) in ein 0/5-<br />
V-Signal für den <strong>Mikrocontroller</strong> um.<br />
Wichtig zu wissen ist, dass die Sender-/Empfängerleitungen gedreht sind (dem<br />
Nullmodemkabel ähnlich). Der Sender muss <strong>mit</strong> dem Empfänger (TxD -> RxD)<br />
verbunden werden.
68 Kapitel 12: BASCOM-AVR <strong>Basic</strong> – Programmierkurs<br />
12.3 Testaufbau <strong>mit</strong> FTDI FT232RL<br />
Bild 12.2: Dieser Schaltplan zeigt die Verwendung eines USB-zu-UART-Brückenchips FT232RL der Firma FTDI.
12.4 Test der seriellen Ausgabe 69<br />
Alternativ gibt es diverse Konverter wie den Mini-USB-zu-UART-Converter der<br />
Firma Conrad zu kaufen. Diesen Konverter kann man einfach in eine Lochrasterplatine<br />
löten und <strong>mit</strong> dem Controller verbinden.<br />
Bild 12.3: USB-zu-UART-Konverter<br />
der Firma Conrad Electronic SE;<br />
Bestellnummer: 197326.<br />
(Quelle: Conrad Electronic SE)<br />
Mehr Informationen zur seriellen Schnittstelle (UART) folgen im Kapitel 18.<br />
12.4 Test der seriellen Ausgabe<br />
Nachdem Sie die Schaltung um einen Schnittstellenkonverter ergänzt haben,<br />
starten Sie nach dem Übertragen auf den Controller das Terminal unter Werkzeuge<br />
oder <strong>mit</strong> STRG+T und klicken zur Sicherheit noch mal auf Reset oder<br />
drücken Sie die Tastenkombination SHIFT+F4. Jetzt werden Sie aufgefordert, die<br />
erste Zahl (0 bis 255) einzugeben. Drücken Sie nach der Eingabe Return. Geben<br />
Sie nun die zweite Zahl ein und bestätigen Sie diese Eingabe erneut <strong>mit</strong> Return.<br />
BASCOM gibt das Ergebnis der Addition der beiden Zahlen aus. Nach der<br />
Ausgabe beginnt die LED an Portb.1 zu blinken. Durch Drücken des Tasters S2<br />
beginnt das Programm erneut.<br />
Beispiel: erstes Programm.bas<br />
' Das ist das erste Programm <strong>mit</strong> <strong>Bascom</strong> <strong>Basic</strong><br />
$regfile = "m88def.dat"<br />
$crystal = 16000000<br />
$baud = 19200<br />
Led Alias Portb.1<br />
Config Led = Output<br />
Led = 0<br />
S2 Alias Pind.2<br />
Config S2 = Input
70 Kapitel 12: BASCOM-AVR <strong>Basic</strong> – Programmierkurs<br />
Portd.2 = 1<br />
Const Pi = 3.14<br />
Dim Byte1 As Byte<br />
Dim Byte2 As Byte<br />
Dim Ich_bin_eine_variable As Word<br />
Declare Function Testfunktion(byval A As Byte , Byval B As Byte)<br />
As Word<br />
Declare Sub Led_toggle()<br />
' Hauptprogramm<br />
Do<br />
Loop<br />
End<br />
' Hier steht das eigentliche Programm<br />
' In der Funktion wird der Wert berechnet und<br />
' an "ich bin eine Variable" übergeben.<br />
Print "Zwei Zahlen <strong>mit</strong> <strong>Bascom</strong> addieren"<br />
Print<br />
Input "Ersten Wert eingeben: " , Byte1<br />
Input "Zeiten Wert eingeben: " , Byte2<br />
Ich_bin_eine_variable = Testfunktion(byte1 , Byte2)<br />
Print "Ergebnis = " ; Ich_bin_eine_variable ; Chr(10) ; Chr(13)<br />
Print "Taste S2 druecken um fortzufahren!" ; Chr(10) ; Chr(13)<br />
Do<br />
Led_toggle<br />
Loop Until S2 = 0<br />
Function Testfunktion(a As Byte , B As Byte) As Word<br />
Testfunktion = A + B<br />
End Function<br />
Sub Led_toggle()<br />
Toggle Led<br />
Waitms 250<br />
End Sub<br />
Das Programm enthält bereits die wichtigsten Grundzüge eines sequenziellen<br />
Programms. Zuerst wird BASCOM <strong>mit</strong>geteilt, welcher Controller verwendet wird.
12.5 Der Simulator 71<br />
Danach wird die Taktfrequenz auf 16 MHz festgelegt und die Geschwindigkeit<br />
der UART-Schnittstelle eingestellt.<br />
Mit dem Befehl Alias wird den I/O-Pins ein Name zugeteilt (z. B. »LED«). Verwenden<br />
Sie auch in Ihren Programmen den Alias-Befehl. Das macht den Quellcode<br />
lesbarer.<br />
Mit Config = Input oder Output teilt man BASCOM <strong>mit</strong>, ob wir den Pin<br />
als Aus- oder Eingang verwenden möchten. Wird der Pin als Ausgang verwendet,<br />
muss man ihn als PORT benennen. Möchte man den Pin als Eingang verwenden,<br />
muss man bei der Zuweisung PIN schreiben. Wird der I/O als Eingang benutzt,<br />
muss man (in unserem Fall) noch den internen Pull-up-Widerstand aktivieren,<br />
da die Taster gegen Masse schalten. Dies geschieht <strong>mit</strong> Portd.2 = 1. Hier darf man<br />
nicht PIN schreiben, auch wenn der Pin eigentlich ein Eingang ist.<br />
Jetzt werden die Konstanten und Variablen angelegt und die Funktionen und<br />
Subroutinen bekannt gegeben.<br />
Nun beginnt das eigentliche Programm. Es läuft in einer Do-Loop-Schleife, die<br />
nie verlassen wird. Der Befehl Print gibt zuerst eine Information über die UART-<br />
Schnittstelle aus, das zweite Print generiert eine Leerzeile. Bei den danach<br />
folgenden Prints ist ein chr(10) ; chr(13) angefügt. Das erfüllt den gleichen Zweck<br />
wie ein zusätzliches Print.<br />
Der Befehl Input wartet nun so lange, bis eine Eingabe erfolgt ist und diese <strong>mit</strong><br />
Return abgeschlossen wurde. Der eingegebene Wert wird in die Variable hinter<br />
dem String Byte1 und Byte2 abgelegt. Nun wird das Ergebnis berechnet, indem<br />
die beiden Werte von Byte1 und Byte2 in die Funktion <strong>mit</strong> dem Namen Testfunktion<br />
übergeben werden. Das Ergebnis steht nun in der Variablen <strong>mit</strong> dem<br />
Namen Ich_bin_eine_Variable.<br />
Das errechnete Ergebnis wird nun <strong>mit</strong> Print über die serielle Schnittstelle ausgegeben.<br />
Jetzt springt das Programm in eine Do-Loop-Until-Schleife. In dieser<br />
Schleife wird so lange die Subroutine Led_toggle aufgerufen, bis der Taster S2<br />
gedrückt wird. Erst wenn die Bedingung S2 = 0 (Taster gegen Masse geschaltet)<br />
erfüllt ist, wird diese Schleife wieder verlassen. In der Subroutine Led_toggle wird<br />
<strong>mit</strong>hilfe des Toggle-Befehls die LED zum Blinken gebracht.<br />
12.5 Der Simulator<br />
BASCOM besitzt einen sehr guten und vor allem einen sehr komfortablen<br />
Simulator, der es ermöglicht, die Programme auch ohne Hardware zu testen und<br />
zu simulieren.
72 Kapitel 12: BASCOM-AVR <strong>Basic</strong> – Programmierkurs<br />
Um in den Simulator zu gelangen, drücken Sie die Taste F2 oder gehen Sie unter<br />
Programmieren auf Simulator. Ein kleines Beispiel wird Ihnen nun den Umgang<br />
<strong>mit</strong> dem BASCOM-Simulator erklären.<br />
Bild 12.4: Der BASCOM-Simulator.<br />
Beispiel: Simulator.bas<br />
‘ <strong>Bascom</strong> Simulator<br />
$regfile = "m88def.dat"<br />
$crystal = 16000000<br />
$baud = 19200<br />
Config Portb.1 = Output<br />
Cls<br />
Locate 1 , 1<br />
Lcd "<strong>Bascom</strong> ist"<br />
Locate 2 , 2<br />
Lcd "super!"<br />
Dim X As Byte<br />
For X = 1 To 10
Print X<br />
Next<br />
X = 0<br />
Input "Eine Zahl eingeben: " , X<br />
Print "Die Zahl war: " ; X<br />
End<br />
12.6 Die Hardware-Simulation 73<br />
Wenn Sie das Programm nun kompilieren und den Simulator aufrufen, sehen Sie<br />
bereits, ob es funktioniert. Drücken Sie dazu auf Play oder F5, wird links im Programmcode<br />
Fenster ein kleiner Pfeil angezeigt, der die Stelle zeigt, an dem sich<br />
das Programm derzeit befindet.<br />
Bild 12.5: Die Hardware-Simulation.<br />
12.6 Die Hardware-Simulation<br />
Alle Variablen und Registerinhalte können im Simulator überwacht und simuliert<br />
werden. Spielen Sie ruhig ein wenig <strong>mit</strong> dem Simulator herum. Es kann auch<br />
die Hardware wie das LCD, ADC usw. simuliert werden. Probieren Sie hin und<br />
wieder die Beispiele auch im Simulator aus, um sich <strong>mit</strong> ihm vertraut zu machen.<br />
Im <strong>mit</strong>tleren Teil des Simulators sehen Sie ein kleines Terminal. Hier werden die<br />
Werte ausgegeben und auch die Eingaben können darüber erfolgen.
74 Kapitel 12: BASCOM-AVR <strong>Basic</strong> – Programmierkurs<br />
12.7 Kommentare im Quelltext<br />
Wer sein Programm auch später noch richtig lesen und verstehen möchte, sollte<br />
seinen Quelltext exakt dokumentieren. Die Dokumentation kann man übersichtlich<br />
im Quellcode selbst erstellen. Dazu gibt es unterschiedliche Kommentarzeichen,<br />
die man dazu verwenden kann, normale Texte auszuklammern. In den<br />
Standardeinstellungen von BASCOM erscheint ein auskommentierter Text in<br />
Grün.<br />
Beispiel: Kommentar.bas<br />
' Ich bin ein einzeiliger Kommentar<br />
REM Auch ich bin ein einzeiliger Kommentar<br />
' (<br />
' )<br />
Ich bin ein<br />
mehrzeiliger Kommentar,<br />
der immer länger und länger wird …<br />
12.8 Datentypen und Variablen<br />
Jedes Programm besteht aus verschieden Variablen – externen, die entweder von<br />
der Außenwelt wie von einem ADC oder I/O-Port stammen, oder internen, die<br />
man zur Verrechnung im Programm benötigt, um daraus wieder eine Ausgabe<br />
über ein LCD, einen Port, eine RS-232 etc. zu machen. Für die Programmierung<br />
stehen verschiedene Variablen-Typen wie Byte, Word, Integer usw. (siehe<br />
BASCOM-Hilfe) zur Verfügung. Diese müssen vor der Verwendung immer definiert<br />
werden. Das kann als Konstante oder als Variable geschehen.<br />
Variablen-Namen=<br />
In BASCOM-<strong>Basic</strong>-Variablen-Namen wird nicht zwischen Groß- und Kleinschreibung<br />
unterschieden. Außerdem ist der Unterstrich _ zugelassen. Dieser wird oft<br />
benutzt, um lange Variablen-Namen lesbarer zu machen. Schlüsselwörter wie If,<br />
While usw. dürfen als Variablen-Namen nicht verwendet werden. Globale Variablen<br />
und Funktionen dürfen nicht denselben Namen besitzen. Außerdem<br />
können Funktionen innerhalb des Bezugsrahmens einer lokalen Variablen nicht<br />
benutzt werden, wenn sie denselben Namen wie die Variablen besitzen.
12.9 Lokale und globale Variablen<br />
12.9 Lokale und globale Variablen 75<br />
Wenn eine Variable innerhalb einer Funktion, einer Prozedur, oder als Argument<br />
einer Funktion deklariert wird, ist sie lokal eingebunden. Dies geschieht dann<br />
nicht <strong>mit</strong> Dim, sondern <strong>mit</strong> der Anweisung Local. Das bedeutet für uns, dass die<br />
Variable nur innerhalb dieser Funktionsdefinition existiert. Eine außerhalb einer<br />
Funktion deklarierte Variable wird als globale Variable bezeichnet. Sie ist für alle<br />
Funktionen innerhalb unseres Programms definiert, einschließlich der Funktionen,<br />
die in anderen Dateien definiert sind (Include Files).<br />
12.10 Variablen-Zuweisung<br />
Eine Variable in BASCOM kann als Hex-, Dezimal- oder Binärzahl, als String<br />
oder als String Array angegeben werden. In der folgenden Auflistung sehen Sie,<br />
welche Variablen-Typen möglich sind und wie viel Speicher dabei belegt wird.<br />
Bit (1/8 Byte) kann den Zustand 1 oder 0 speichern.<br />
Byte (1 Byte) kann Werte von 0 bis 255 aufnehmen.<br />
Integer (zwei Bytes) kann Werte von –32.768 bis +32.768 aufnehmen (16 Bit<br />
Integer).<br />
Word (zwei Bytes) kann Werte von 0 bis 65.535 annehmen.<br />
Long (4 Bytes) kann Werte von –2.147.483.648 bis 2.147.483.647 annehmen<br />
(32 Bit Long).<br />
Single-Variablen können Werte <strong>mit</strong> 32 Bit und Vorzeichen speichern. Der<br />
Bereich liegt zwischen 1,5 x 10 –45 und 3,4 x 10 38 .<br />
Double können Werte <strong>mit</strong> 64 Bit speichern. Der Bereich liegt zwischen 5,0 x<br />
10 –324 und 1,7 x 10 308<br />
String(bis zu 254 Bytes)-Variablen speichern Bytes <strong>mit</strong> einer 0 Terminierung<br />
ab. Wenn man 10 Zeichen in einen String schreiben möchte, muss man das<br />
String-Array <strong>mit</strong> einer Länge von 11 spezifizieren.<br />
Beispiel: Variablen Zuweisung.bas<br />
Const PI = 3.14 ' Konstante PI<br />
Dim Variable As Byte ' Byte-Variable, Sie kann Werte von 0 bis<br />
' 255 annehmen<br />
Dim Var(9) As Byte ' Byte Array, hat eine ähnliche Bedeutung<br />
' wie 10x ein Byte
76 Kapitel 12: BASCOM-AVR <strong>Basic</strong> – Programmierkurs<br />
12.11 Arrays<br />
' <strong>mit</strong> Dim Var X As Byte zu erstellen.<br />
' Das jeweilige Byte<br />
' wird über den Index angesprochen: Var( x)<br />
' Die Arrays der Pro werden von 0 aus gezählt!<br />
Ein Array (Feld) ist eine Anordnung von Variablen. Array bezeichnet in der<br />
Informatik eine Datenstruktur. Mithilfe eines Arrays können Daten eines<br />
üblicherweise einheitlichen Datentyps (Byte, Word usw.) geordnet so im<br />
Speicher eines Computers abgelegt werden, dass ein Zugriff auf die Daten über<br />
einen Index möglich wird. Der Index für ein Array startet bei BASCOM <strong>mit</strong> 1, bei<br />
anderen Compilern beginnt der Index <strong>mit</strong> 0. Zudem unterstützt BASCOM<br />
derzeit nur eindimensionale Arrays.<br />
Bild 12.6: So kann man sich die Anordnung der Variablen im Speicher vorstellen.<br />
Beispiel: Arrays.bas<br />
' <strong>Bascom</strong> Arrays<br />
$regfile = "m88def.dat"<br />
$crystal = 16000000<br />
$baud = 19200<br />
Dim X(10) As Byte<br />
Dim Y As Byte<br />
For Y = 1 To 10<br />
X(y) = Y<br />
Next<br />
For Y = 1 To 10<br />
Print X(y)<br />
Next<br />
End
12.12 Operatoren 77<br />
Das obige Beispiel verdeutlicht die Verwendung von Arrays. Erst werden dem<br />
Array über den Index die Werte der For-Next-Zählschleife zugewiesen (1 bis 10),<br />
danach werden die gespeicherten Werte ausgegeben.<br />
12.12 Operatoren<br />
Jeder Datentyp verfügt über einige spezifische Operatoren, die angeben, welche<br />
Operationen auf den Typ angewendet werden können. Die folgende Auflistung<br />
zeigt eine Auswahl der BASCOM-Operatoren.<br />
Arithmetik: Grundrechenarten<br />
Vergleich: größer/kleiner usw.<br />
Bitweise Arithmetik: And, Or, Xor, usw.<br />
Boolesche Arithmetik: logische And-, Or-, Xor-Verknüpfung, usw.,<br />
(wahr/falsch)<br />
Ganze Zahlen: Char, Byte, Word, Integer, Long<br />
Fließkommazahlen: Single, Double<br />
Arithmetische Funktionen: Sin, Cos, Tan, usw.<br />
Sehen Sie dazu auch in der Hilfe von BASCOM nach.<br />
12.13 Kontrollstrukturen<br />
Jedes Programm benötigt, um auf Ereignisse reagieren zu können, Bedingungen,<br />
sogenannte Kontrollstrukturen. Diese werden <strong>mit</strong> If … Then … Else … End If<br />
angegeben. Die Ausgaben der Beispielprogramme erfolgen über das BASCOM-<br />
Terminalprogramm. Laden Sie die Beispiele auf das <strong>Mikrocontroller</strong>-Board und<br />
starten Sie danach das Terminalprogramm.<br />
12.13.1 If Then – End if<br />
If [Variable A] = [Variable B] Then<br />
' Hier steht der Code, der bei der Bedingung A=B ausgeführt<br />
' wird<br />
End If
78 Kapitel 12: BASCOM-AVR <strong>Basic</strong> – Programmierkurs<br />
Beispiel: If Then.bas<br />
$regfile = "m88def.dat"<br />
$crystal = 16000000<br />
$baud = 19200<br />
Dim X As Byte<br />
Main:<br />
X = X + 1<br />
If X = 10 Then<br />
Print "X ist jetzt 10!"<br />
Goto Ende<br />
End If<br />
Goto Main<br />
Ende:<br />
Print "fertig!"<br />
End<br />
Der Programmcode durchläuft so lange die Goto-Main-Schleife, bis X gleich 10<br />
ist. Erst dann wird der Programmteil zwischen If und End If ausgeführt. Sie<br />
sehen: Mit If Then kann man einfach Programmverzweigungen realisieren.<br />
12.13.2 If Then – Else – End if<br />
If [Variable A] > [Variable B] Then<br />
' Code, der ausgeführt werden soll<br />
Else ' Oder wenn A nicht größer B<br />
' Code, der ausgeführt werden soll<br />
End If<br />
Beispiel: Else.bas<br />
$regfile = "m88def.dat"<br />
$crystal = 16000000<br />
$baud = 19200<br />
Dim X As Byte<br />
Main:<br />
X = X + 1<br />
If X
End<br />
Else<br />
Print "X ist bereits 10, Juhu!"<br />
End If<br />
12.13 Kontrollstrukturen 79<br />
Mit der Else-Anweisung kann man eine Alternative anbieten. Das Programm gibt<br />
so lange den Wert von X aus, bis X den Wert 10 erreicht hat. Erst wenn X<br />
größer/gleich 10 ist, wird der Programmteil zwischen Else und End if ausgeführt.<br />
12.13.3 If und ElseIf<br />
Eine weitere Möglichkeit der mehrfachen Verschachtelung von If-Anweisungen<br />
ist ElseIf. Hier können unterschiedliche Zustände der Variablen abgefragt werden.<br />
Je nach Wahrheit (true oder false) wird der entsprechende Abschnitt in der<br />
ElseIf-Anweisung ausgeführt.<br />
If [Variable A] [Variable B] Then<br />
' Code, der ausgeführt werden soll<br />
ElseIf [Variable A] > [Variable B] Then<br />
' Code, der ausgeführt werden soll<br />
ElseIf [Variable A] < [Variable B] Then<br />
' Code, der ausgeführt werden soll<br />
End If<br />
Beispiel: ElseIf.bas<br />
$regfile = "m88def.dat"<br />
$crystal = 16000000<br />
$baud = 19200<br />
Dim X As Byte<br />
Main:<br />
X = X + 1<br />
If X = 1 Then<br />
Print "X = 1"<br />
Elseif X = 2 Then<br />
Print "X = 2"<br />
Elseif X = 3 Then<br />
Print "X = 3"<br />
Else<br />
Print "X = 4, Fertig!"<br />
Goto Ende<br />
End If
80 Kapitel 12: BASCOM-AVR <strong>Basic</strong> – Programmierkurs<br />
Goto Main<br />
Ende:<br />
End<br />
Je nach Wert der Variablen X ist der ausgegebene Text anders.<br />
12.13.4 Select Case<br />
Ähnlich der ElseIf-Anweisung verhält sich der Befehl Select Case. Auch hier wird,<br />
je nachdem, welcher Wert true ist (also der Wahrheit entspricht), der entsprechende<br />
Codeabschnitt ausgeführt. Alternativ kann <strong>mit</strong> Case Else eine Alternative<br />
angeboten werden, sollte nichts innerhalb von Case zutreffen.<br />
Select Case [Variable]<br />
Case 1<br />
' Code, der ausgeführt werden soll, Variable = 1<br />
Case Is > 10<br />
' Code, der ausgeführt werden soll, Variable >10<br />
Case Else<br />
' Alternativ-Code, wenn alle anderen Bedingungen nicht<br />
' zutreffen<br />
End Select<br />
Beispiel: Select Case.bas<br />
$regfile = "m88def.dat"<br />
$crystal = 16000000<br />
$baud = 19200<br />
Dim Zahl As Byte<br />
Main:<br />
Input "Geben Sie eine Zahl ein: " , Zahl<br />
Select Case Zahl<br />
Case 1<br />
Print "Zahl ist 1"<br />
Case 2 To 10<br />
Print "Die Zahl liegt zwischen 2 und 10"<br />
Case Is > 10
Print "Die Zahl ist groesser 10"<br />
Case Else<br />
Print "Die Zahl ist Null"<br />
End Select<br />
Goto Main<br />
12.14 Schleifen 81<br />
Geben Sie in diesem Programm eine Zahl zwischen 0 und 255 ein. Über Select<br />
Case wird Ihnen BASCOM eine Antwort darauf geben, in welchem Bereich sich<br />
die Zahl befindet. Der zusätzliche Befehl Input dient zur Eingabe über das<br />
Terminalprogramm. Er gibt den Textstring Geben Sie eine Zahl aus: aus und<br />
übergibt Ihre Eingabe der Variablen <strong>mit</strong> dem Namen Zahl.<br />
12.14 Schleifen<br />
Bei der Programmierung werden häufig Programmschleifen benötigt, z. B. um<br />
Dezimal- oder Binärzähler oder eine Hauptschleife zu realisieren. Es wird vielleicht<br />
auch die serielle Schnittstelle so lange ausgelesen, wie Zeichen im Puffer<br />
sind – um nur einige zu nennen. Es gibt dafür verschieden Schleifentypen. Jede<br />
von ihnen hat ihre Eigenheiten.<br />
12.14.1 For Next<br />
Die For-Next-Schleife zählt innerhalb eines angegeben Wertebereichs die<br />
Variable X hoch oder herunter. Dabei können bestimmte Schrittweiten (Steps)<br />
vorgegeben werden.<br />
' Diese Schleife zählt von Var1 bis Var2 <strong>mit</strong> einer Schrittweite<br />
' von 1<br />
For X = [Var1] To [Var2]<br />
'Code, der 10-mal durchlaufen werden soll<br />
Next<br />
' Die Variable X wird jetzt immer um 2 erhöht<br />
For X = [Var1] To [Var2] Step 2<br />
' Code, der durchlaufen werden soll<br />
Next<br />
' Variable X wird von Var1 auf Var2 heruntergezählt<br />
' (Schrittweite 1)<br />
For X = Var1 To Var2 Step -1<br />
' Code, der durchlaufen werden soll<br />
Next
82 Kapitel 12: BASCOM-AVR <strong>Basic</strong> – Programmierkurs<br />
Beispiel: For Next.bas<br />
$regfile = "m88def.dat"<br />
$crystal = 16000000<br />
$baud = 19200<br />
Dim Zahl As Byte<br />
Dim X As Byte<br />
Input "Wie weit soll ich zaehlen? " , Zahl<br />
Print "Ich zaehle bis " ; Zahl<br />
For X = 1 To Zahl<br />
Print X<br />
Next<br />
Input "Wie weit soll ich zaehlen? " , Zahl<br />
Print "Ich zaehle bis " ; Zahl ; " Schrittweite = 2"<br />
For X = 1 To Zahl Step 2<br />
Print X<br />
Next<br />
Input "Mit welcher Zahl soll ich beginnen? " , Zahl<br />
Print "Ich beginne <strong>mit</strong> " ; Zahl<br />
For X = Zahl To 1 Step -1<br />
Print X<br />
Next<br />
Print "fertig!"<br />
End<br />
Übertragen Sie das Beispiel auf den Controller und starten Sie wieder das Terminalprogramm.<br />
Das Programm wird Sie nach einer Zahl fragen. Geben Sie einen<br />
Wert zwischen 1 und 255 ein. Die Variable X wird bei jedem Durchlauf ausgegeben<br />
und zeigt Ihnen, was bei der For-Next-Schleife genau passiert. Sie werden<br />
sehen, dass wir bei einer For-Next-Schleife eine definierte Anzahl von n Durchläufen<br />
<strong>mit</strong> einer gewünschten Schrittweite realisieren können. Mit dem Befehl<br />
Exit For können Sie die Schleife auch vorzeitig verlassen.<br />
12.14.2 Do Loop und Do Until<br />
Weitere Varianten einer Schleife sind die Do-Loop- und die Do-Loop-Until-Version.<br />
Die Do-Loop-Until-Version wird einmal durchlaufen und prüft erst nach<br />
einem Durchlauf, ob die Bedingung erfüllt ist. D h., diese Schleife wird mindestens<br />
einmal durchlaufen. Die reine Do-Loop-Schleife wird gern für Endlosschleifen<br />
eingesetzt. Auch die Do-Loop-Schleife kann <strong>mit</strong> Exit-Do-Anweisung abgebrochen<br />
werden.
' Endlosschleife<br />
Do<br />
' Was auch immer wir hier tun wollen<br />
Loop<br />
' Endlosschleife <strong>mit</strong> bedingtem Abbruch<br />
Do<br />
Variable = Variable + 1<br />
If Variable > 10 Then Exit Do<br />
Loop<br />
' Do Loop Until<br />
Do<br />
Variable = Variable + 1<br />
Loop Until Variable > X<br />
Beispiel: Do Loop.bas<br />
' <strong>Bascom</strong> Do Loop<br />
$regfile = "m88def.dat"<br />
$crystal = 16000000<br />
$baud = 19200<br />
Dim X As Byte<br />
X = 0<br />
Do<br />
X = X + 1<br />
Print X<br />
If X > 9 Then Exit Do<br />
Loop<br />
X = 0<br />
Do<br />
X = X + 1<br />
Print X<br />
Loop Until X > 9<br />
Print "fertig!"<br />
End<br />
12.14 Schleifen 83<br />
Endlosschleifen werden z. B. für das Hauptprogramm verwendet, da sonst das<br />
Programm nach einem Durchlauf beendet wäre.
84 Kapitel 12: BASCOM-AVR <strong>Basic</strong> – Programmierkurs<br />
12.14.3 While Wend<br />
Eine Schleifenvariante, die nur durchlaufen wird, wenn die Bedingung erfüllt ist<br />
(true), ist die While-Wend-Schleife. Sie prüft zu Beginn, ob die Bedingung erfüllt<br />
ist.<br />
Beispiel: While Wend.bas<br />
' <strong>Bascom</strong> While Wend<br />
$regfile = "m88def.dat"<br />
$crystal = 16000000<br />
$baud = 19200<br />
Dim X As Byte<br />
X = 0<br />
While X < 10<br />
X = X + 1<br />
Print X<br />
If X > 5 Then Exit While<br />
Wend<br />
While X < 3<br />
X = X + 1<br />
Print X<br />
Wend<br />
Print "fertig!"<br />
End<br />
Hier wird nur die erste While-Wend-Schleife durchlaufen. Die zweite Schleife<br />
wird nicht durchlaufen, weil X bereits größer 3 ist. Auch dieser Schleifentyp kann<br />
vorzeitig <strong>mit</strong> einer Exit-Anweisung beendet werden. In unserem Beispiel dann,<br />
wenn X größer 5 ist.<br />
12.15 Funktionen, Prozeduren und Labels<br />
Funktionen benötigt man immer wieder. Sie machen das Programm wesentlich<br />
übersichtlicher, und auch eigene Befehle können da<strong>mit</strong> verwirklicht werden. Man<br />
kann eigene Funktionen und Prozeduren (Unterprogramme ohne Rückgabewert),<br />
die man immer wieder benötigt, selbst schreiben und in kommenden Projekten<br />
wiederverwenden (Modularität). Der Unterschied zwischen Funktion und<br />
Prozedur, oder allgemein Routine (Sub Routine) genannt, ist, dass eine Funktion<br />
im Gegensatz zu einer Prozedur einen Rückgabewert besitzt. In einer Funktion<br />
kann man z. B. eine mathematische Berechnung durchführen, die das Ergebnis<br />
an eine Variable zurückgibt.
12.15 Funktionen, Prozeduren und Labels 85<br />
' Am Programmanfang muss die Prozedur bekanntgegeben werden.<br />
Declare Sub Unterroutine_xyz(Variablen, die Sie übergeben<br />
möchten)<br />
' Die eigentliche Prozedur<br />
Sub Unterroutine_xyz(Variablen, die Sie übergeben möchten)<br />
' Hier könnten wir z. B. einen Port setzen<br />
End Sub<br />
Der Aufruf in BASCOM geschieht nur durch die Eingabe des Prozedurnamens,<br />
in unserem Fall Unterroutine_xyz oder, wenn man Variablen übergeben möchte:<br />
Unterroutine(Variablen die übergeben werden sollen).<br />
Achtung: Hier muss man auf den HW Stack, Soft Stack und die Frame Size<br />
achten!<br />
Werden diese zu klein ausgelegt, können Funktionen und Routinen nicht<br />
richtig behandelt werden.<br />
In der BASCOM-Hilfe findet man mehr darüber.<br />
Original Konfiguration<br />
$hwstack = 32 '<br />
default use 32 for the hardware stack<br />
$swstack = 10<br />
'default use 10 for the SW stack<br />
$framesize = 40<br />
'default use 40 for the frame space<br />
besser…<br />
$hwstack = 64<br />
$swstack = 20<br />
$framesize = 80<br />
12.15.1 Subroutinen<br />
Beispiel: Sub.bas<br />
' <strong>Bascom</strong> Unterprogramme Subs<br />
$regfile = "m88def.dat"<br />
$crystal = 16000000<br />
$baud = 19200<br />
Dim X As Byte
86 Kapitel 12: BASCOM-AVR <strong>Basic</strong> – Programmierkurs<br />
Declare Sub Ausgabe_1()<br />
Declare Sub Ausgabe_2()<br />
Ausgabe_1<br />
Ausgabe_2<br />
End<br />
Sub Ausgabe_1()<br />
Print "Ausagbe 1"<br />
End Sub<br />
Sub Ausgabe_2()<br />
Print "Ausgabe 2"<br />
End Sub<br />
12.15.2 Funktionen<br />
' Am Programmanfang muss die Funktion bekanntgegeben werden.<br />
Declare Function Funktion_xyz(Variablen die übergeben werden)<br />
Rückgabe Variable<br />
' Die eigentliche Funktion<br />
Function Funktion_xyz(Variablen die übergeben werden) Rückgabe<br />
Variable<br />
' Hier könnten wir z. B. eine Berechnung durchführen<br />
End Function<br />
Beispiel: Function.bas<br />
‘ <strong>Bascom</strong> Funktionen<br />
$regfile = "m88def.dat"<br />
$crystal = 16000000<br />
$baud = 19200<br />
Dim X As Word<br />
Declare Function Addiere(byval A As Byte , Byval B As Byte) As<br />
Word<br />
X = Addiere(10 , 13)<br />
Print "Das Ergebnis = " ; X<br />
End<br />
Function Addiere(byval A As Byte , Byval B As Byte) As Word<br />
Addiere = A + B<br />
End Function
12.15 Funktionen, Prozeduren und Labels 87<br />
Innerhalb der Klammer stehen die Übergabeparameter, nach der Klammer wird<br />
definiert, um welchen Variablen-Typ die Rückgabe erfolgen soll.<br />
Je nachdem, wie eine Variable in einer Prozedur oder Funktion übergeben werden<br />
soll, muss die Zuweisung als Byval oder Byref erfolgen. Dazu finden Sie noch<br />
mehr Informationen in der Hilfe zu BASCOM.<br />
12.15.3 Gosub<br />
Eine weitere Möglichkeit ist es, die Unterprogramme ohne Übergabe- oder<br />
Rückgabewert über Gosub anzuspringen. Hier muss die Prozedur nicht zuvor am<br />
Anfang des Programms bekannt gegeben werden.<br />
' Der Aufruf der Routine<br />
Gosub Test_Routine<br />
' Die Routine<br />
Test_Routine:<br />
' auszuführender Programmcode<br />
Return<br />
Beispiel: Gosub.bas<br />
' <strong>Bascom</strong> Gosub<br />
$regfile = "m88def.dat"<br />
$crystal = 16000000<br />
$baud = 19200<br />
Dim X As Byte<br />
Gosub Zaehlen<br />
End<br />
Zaehlen:<br />
For X = 1 To 10<br />
Print X<br />
Next<br />
Return<br />
12.15.4 Goto<br />
Eine weitere praktische aber <strong>mit</strong>tlerweile veraltete Anweisung ist Goto (= gehe<br />
zur Markierung xxx). Dieser Befehl stammt aus Zeiten, in denen <strong>Basic</strong>-Programme<br />
noch <strong>mit</strong> Zeilennummern und Sprüngen geschrieben wurden. Es gibt<br />
zwar in unserem <strong>Basic</strong> noch die Möglichkeit, Zeilennummern anzuzeigen, aber<br />
sie dienen nur noch zur Orientierung und haben <strong>mit</strong> dem Programmablauf
88 Kapitel 12: BASCOM-AVR <strong>Basic</strong> – Programmierkurs<br />
nichts zu tun. Doch kann es hin und wieder sinnvoll sein, den Goto-Befehl zu<br />
verwenden. Er benötigt nur sehr wenig Ausführungszeit, da er in Assembler<br />
direkt ausgeführt werden kann. In den obigen Beispielen haben wir den Befehl<br />
Goto immer wieder für Endlosschleifen und zum Beenden des Programms verwendet.<br />
Wenn Sie im Besitz eines Oszilloskops sind, können Sie <strong>mit</strong> dem folgenden<br />
Beispiel sehen, wie schnell der BASCOM und der kleine ATmega88 <strong>mit</strong> dem<br />
16-MHz-Oszillator ist. Über eine Goto-Schleife wird der Portb.1 ein- und ausgeschaltet.<br />
Dabei wird eine Frequenz von knapp 3 MHz erreicht, was ein sehr guter<br />
Wert für ein <strong>Basic</strong>-Programm ist.<br />
Start: ' Label anstatt Zeilennummer<br />
' Code, der ausgeführt werden soll<br />
Goto Start ' Sprung zum Label Start<br />
Beispiel: Goto.bas<br />
' <strong>Bascom</strong> Goto<br />
$regfile = "m88def.dat"<br />
$crystal = 16000000<br />
Config Portb.1 = Output<br />
Portb.1 = 0<br />
Main:<br />
Portb.1 = 1<br />
Portb.1 = 0<br />
Goto Main<br />
TIPP: Goto kann man sehr gut zum Abbrechen, für einen Programmneustart<br />
oder zur Fehlerbehandlung nutzen.<br />
12.15.5 On<br />
Eine weitere Verzweigung zu den bereits aufgeführten Varianten ist die On-Verzweigung.<br />
Je nachdem, welchen Wert die Variable angenommen hat, wird das<br />
dementsprechende Label angesprungen. Der Index der Variablen beginnt <strong>mit</strong> 0.<br />
' Wenn eine Variable dem Wert entspricht (true), springe zu Label x.<br />
On [Var] Goto [Label 0], [Label 2],... [Label n]<br />
End if<br />
Beispiel: On.bas<br />
' <strong>Bascom</strong> On<br />
$regfile = "m88def.dat"<br />
$crystal = 16000000
$baud = 19200<br />
Dim X As Byte<br />
Do<br />
Loop<br />
End<br />
Input "Welches Label (0 bis 2): " , X<br />
On X Gosub Label0 , Label1 , Label2<br />
Label0:<br />
Print "Label 0"<br />
Return<br />
Label1:<br />
Print "Label 1"<br />
Return<br />
Label2:<br />
Print "Label 2"<br />
Return<br />
12.16 String und String-Bearbeitung<br />
12.16 String und String-Bearbeitung 89<br />
Unter Strings versteht man eine Zeichenkette <strong>mit</strong> einem Character als Variableninhalt.<br />
In einem String können ASCII-Zeichen oder ganze ASCII-Zeichenketten<br />
abgespeichert werden. Kurz gesagt: Strings sind Character-Arrays.<br />
12.16.1 Strings<br />
' String <strong>mit</strong> der Länge 1, er kann nur 1 Zeichen enthalten<br />
Dim Text as string * 1<br />
' String <strong>mit</strong> der Länge 10, er kann 10 Zeichen enthalten<br />
Dim Text as string * 10<br />
Beispiel: Strings.bas<br />
' <strong>Bascom</strong> Strings<br />
$regfile = "m88def.dat"<br />
$crystal = 16000000<br />
$baud = 19200<br />
Dim Text1 As String * 1
90 Kapitel 12: BASCOM-AVR <strong>Basic</strong> – Programmierkurs<br />
Dim Text2 As String * 10<br />
Text1 = "A"<br />
Text2 = "1234567890"<br />
Print Text1<br />
Print Text2<br />
End<br />
12.16.2 Ucase<br />
Mit Ucase konvertiert man einen String von Klein- in Großbuchstaben.<br />
Beispiel: Ucase.bas<br />
' <strong>Bascom</strong> Strings (Ucase)<br />
$regfile = "m88def.dat"<br />
$crystal = 16000000<br />
$baud = 19200<br />
Dim A As String * 10<br />
Dim B As String * 10<br />
A = "franzis"<br />
B = Ucase(a)<br />
Print B<br />
End<br />
12.16.3 Lcase<br />
Mit Lcase konvertiert man einen String von Groß- in Kleinbuchstaben.<br />
Beispiel: Lcase.bas<br />
' <strong>Bascom</strong> Strings (Lcase)<br />
$regfile = "m88def.dat"<br />
$crystal = 16000000<br />
$baud = 19200<br />
Dim A As String * 10<br />
Dim B As String * 10<br />
A = "FRANZIS"<br />
B = Lcase(a)<br />
Print B<br />
End
12.16.4 Bin<br />
Mit Bin wandelt man ein Byte in einen binären String um.<br />
Beispiel: Bin.bas<br />
' <strong>Bascom</strong> Strings (Bin)<br />
$regfile = "m88def.dat"<br />
$crystal = 16000000<br />
$baud = 19200<br />
Dim A As String * 10<br />
Dim B As Byte<br />
B = 42<br />
A = Bin(b)<br />
Print A<br />
End<br />
12.16.5 Hex<br />
Mit Hex konvertiert man ein Byte in einen Hex-String.<br />
Beispiel: Hex.bas<br />
' <strong>Bascom</strong> Strings (Hex)<br />
$regfile = "m88def.dat"<br />
$crystal = 16000000<br />
$baud = 19200<br />
Dim A As Integer<br />
Dim B As String * 4<br />
A = 1023<br />
B = Hex(a)<br />
Print B<br />
End<br />
12.16.6 Hexval<br />
12.16 String und String-Bearbeitung 91<br />
Mit Hexval wandelt man einen Hex-String in eine Zahl um.<br />
Beispiel: Hexval.bas<br />
' <strong>Bascom</strong> Strings (Hexval)<br />
$regfile = "m88def.dat"<br />
$crystal = 16000000<br />
$baud = 19200
92 Kapitel 12: BASCOM-AVR <strong>Basic</strong> – Programmierkurs<br />
Dim A As Integer<br />
Dim B As String * 2<br />
B = "42"<br />
A = Hexval(b)<br />
Print A<br />
End<br />
12.16.7 Val<br />
Mit Val wandelt man eine String-Zahl in eine Zahl um.<br />
Beispiel: Val.bas<br />
' <strong>Bascom</strong> Strings (Val)<br />
$regfile = "m88def.dat"<br />
$crystal = 16000000<br />
$baud = 19200<br />
Dim A As String * 10<br />
Dim B As Byte<br />
A = "42"<br />
B = Val(a)<br />
Print B<br />
End<br />
12.16.8 Str<br />
Mit Str konvertiert man eine Zahl in einen String (also das Gegenteil von Val).<br />
Beispiel: Str.bas<br />
' <strong>Bascom</strong> Strings (Str)<br />
$regfile = "m88def.dat"<br />
$crystal = 16000000<br />
$baud = 19200<br />
Dim A As String * 10<br />
Dim B As Word<br />
B = 65535<br />
A = Str(b)<br />
Print A<br />
End
12.16.9 String<br />
12.16 String und String-Bearbeitung 93<br />
Mit String erzeugt man eine bestimmte Anzahl von einem ASCII-Zeichen.<br />
Beispiel: StringConv.bas<br />
' <strong>Bascom</strong> Strings (String)<br />
$regfile = "m88def.dat"<br />
$crystal = 16000000<br />
$baud = 19200<br />
Dim A As String * 10<br />
A = String(3 , 65)<br />
Print A<br />
End<br />
12.16.10 Space<br />
Mit Space erzeugt man eine bestimmte Anzahl von Leerzeichen.<br />
Beispiel: Space.bas<br />
' <strong>Bascom</strong> Strings (Space)<br />
$regfile = "m88def.dat"<br />
$crystal = 16000000<br />
$baud = 19200<br />
Dim A As String * 10<br />
Dim B As Byte<br />
B = 10<br />
A = Space(b)<br />
Print ""<br />
End<br />
12.16.11 Fusing<br />
Mit Fusing wird eine Single-Variable in einen String gewandelt. Diese Funktion<br />
rundet das Ergebnis dabei gegebenenfalls.<br />
Beispiel: Fusing.bas<br />
' <strong>Bascom</strong> Strings (Fusing)<br />
$regfile = "m88def.dat"<br />
$crystal = 16000000<br />
$baud = 19200
94 Kapitel 12: BASCOM-AVR <strong>Basic</strong> – Programmierkurs<br />
Dim A As Single<br />
Dim B As String * 10<br />
A = 128.1234567<br />
B = Fusing(a , "#.###")<br />
Print B<br />
End<br />
12.16.12 Format<br />
Mit Format formatiert man den Ursprungsstring. Dabei kann auch ein mathematisches<br />
Vorzeichen (+ oder -) <strong>mit</strong> angegeben werden.<br />
Beispiel: Format.bas<br />
' <strong>Bascom</strong> Strings (Format)<br />
$regfile = "m88def.dat"<br />
$crystal = 16000000<br />
$baud = 19200<br />
Dim A As String * 6<br />
Dim B As String * 6<br />
A = "12345"<br />
B = Format(a , "+")<br />
Print B<br />
A = "123"<br />
B = Format(a , "00000")<br />
Print B<br />
A = "12345"<br />
B = Format(a , "000.00")<br />
Print B<br />
A = "12345"<br />
B = Format(a , " +000.00")<br />
Print B<br />
End
12.16.13 Len<br />
Mit Len bestimmt man die Länge eines Strings.<br />
Beispiel: Len.bas<br />
' <strong>Bascom</strong> Strings (Len)<br />
$regfile = "m88def.dat"<br />
$crystal = 16000000<br />
$baud = 19200<br />
Dim A As String * 10<br />
Dim B As Byte<br />
A = "Franzis"<br />
B = Len(a)<br />
Print B<br />
End<br />
12.16.14 Instr<br />
12.16 String und String-Bearbeitung 95<br />
Mit Instr sucht man in einem String eine bestimmte Reihenfolge von Zeichen<br />
und gibt deren Position zurück. Es wird immer die zuerst gefundene Zeichenkette<br />
zurückgegeben.<br />
Beispiel: Instr.bas<br />
' <strong>Bascom</strong> Strings (Instr)<br />
$regfile = "m88def.dat"<br />
$crystal = 16000000<br />
$baud = 19200<br />
Dim A As String * 14<br />
Dim B As String * 2<br />
Dim C As Integer<br />
A = "www.franzis.de"<br />
B = "de"<br />
C = Instr(a , B)<br />
Print C<br />
End
96 Kapitel 12: BASCOM-AVR <strong>Basic</strong> – Programmierkurs<br />
12.16.15 Mid<br />
Mit Mid er<strong>mit</strong>telt man den <strong>mit</strong>tleren Teil eines Strings.<br />
Beispiel: Mid.bas<br />
' <strong>Bascom</strong> Strings (Mid)<br />
$regfile = "m88def.dat"<br />
$crystal = 16000000<br />
$baud = 19200<br />
Dim A As String * 20<br />
Dim B As String * 10<br />
Dim C As Byte<br />
Dim D As Byte<br />
A = "Franzis ist super!"<br />
C = 9<br />
D = 3<br />
B = Mid(a , C , D)<br />
Print B<br />
End<br />
12.16.16 Split<br />
Mithilfe von Split teilt man einen String in einzelne kleine Blöcke auf. So kann<br />
man z. B. die einzelnen Wörter eines Satzes herausfiltern.<br />
Beispiel: Split.bas<br />
' <strong>Bascom</strong> Strings (Split)<br />
$regfile = "m88def.dat"<br />
$crystal = 16000000<br />
$baud = 19200<br />
Dim A(5) As String * 10<br />
Dim B As Byte<br />
Dim C As Byte<br />
B = Split( "Franzis ist super!" , A(1) , " ")<br />
For C = 1 To B<br />
Print A(c)<br />
Next<br />
End
12.16.17 Left<br />
12.16 String und String-Bearbeitung 97<br />
Mit Left schneidet man einen bestimmten Ausschnitt des Strings von links aus<br />
heraus.<br />
Beispiel: Left.bas<br />
' <strong>Bascom</strong> Strings (Left)<br />
$regfile = "m88def.dat"<br />
$crystal = 16000000<br />
$baud = 19200<br />
Dim A As String * 10<br />
Dim B As String * 3<br />
Dim C As Integer<br />
A = "Franzis"<br />
C = 5<br />
B = Left(a , C)<br />
Print B<br />
End<br />
12.16.18 Right<br />
Mit Right schneidet man einen bestimmten Ausschnitt des Strings von rechts aus<br />
heraus.<br />
Beispiel: Right.bas<br />
' <strong>Bascom</strong> Strings (Right)<br />
$regfile = "m88def.dat"<br />
$crystal = 16000000<br />
$baud = 19200<br />
Dim A As String * 10<br />
Dim B As String * 3<br />
Dim C As Integer<br />
A = "Franzis"<br />
C = 3<br />
B = Right(a , C)<br />
Print B<br />
End
98 Kapitel 12: BASCOM-AVR <strong>Basic</strong> – Programmierkurs<br />
12.16.19 Ltrim<br />
Mit Ltrim entfernt man die Leerzeichen von der linken Seite eines Strings.<br />
Beispiel: Ltrim.bas<br />
' <strong>Bascom</strong> Strings (Ltrim)<br />
$regfile = "m88def.dat"<br />
$crystal = 16000000<br />
$baud = 19200<br />
Dim A As String * 10<br />
Dim B As String * 10<br />
A = " Franzis"<br />
B = Ltrim(a)<br />
Print B<br />
End<br />
12.16.20 Rtrim<br />
Mit Rtrim entfernt man die Leerzeichen von der rechten Seite eines Strings.<br />
Beispiel: Rtrim.bas<br />
' <strong>Bascom</strong> Strings (Rtrim)<br />
$regfile = "m88def.dat"<br />
$crystal = 16000000<br />
$baud = 19200<br />
Dim A As String * 10<br />
Dim B As String * 10<br />
A = "Franzis "<br />
B = Rtrim(a)<br />
Print B<br />
End<br />
12.16.21 Trim<br />
Mit Trim entfernt man die Leerzeichen (Space) auf beiden Seiten eines Strings.<br />
Beispiel: Trim.bas<br />
' <strong>Bascom</strong> Strings (Trim)<br />
$regfile = "m88def.dat"<br />
$crystal = 16000000<br />
$baud = 19200
Dim A As String * 15<br />
Dim B As String * 15<br />
A = " Franzis "<br />
B = Trim(a)<br />
Print B<br />
End<br />
12.16 String und String-Bearbeitung 99
Ulli Sommer<br />
<strong>Mikrocontroller</strong><br />
<strong>programmieren</strong> <strong>mit</strong><br />
<strong>Bascom</strong> <strong>Basic</strong> Aus dem Inhalt:<br />
<strong>Mikrocontroller</strong> steuern, messen und regeln die<br />
unterschiedlichsten Geräte, und jeder Controller ist für<br />
seine spezielle Aufgabe programmiert.<br />
Wie Sie einen <strong>Mikrocontroller</strong> <strong>programmieren</strong> und was Sie<br />
alles benötigen, um Ihre eigenen Spezial-ICs zu erstellen,<br />
erfahren Sie in diesem Buch. Es zeigt Ihnen Schritt für<br />
Schritt auf verständliche Weise, was Sie für den Einstieg<br />
in die ATMEL-AVR-<strong>Mikrocontroller</strong>welt benötigen. Sie<br />
erfahren, wie Sie bei der Hardware vorgehen müssen und<br />
wie man das Programmieren erlernt, um später seine<br />
eigene Software zu entwickeln.<br />
Dieses Buch baut auf dem <strong>Basic</strong>-Compiler <strong>Bascom</strong> und<br />
den ATMEL-AVRs auf. <strong>Bascom</strong> ist ein moderner <strong>Basic</strong>-<br />
Compiler <strong>mit</strong> integrierter Entwicklungsumgebung und<br />
eignet sich für fast alle 8-Bit-AVR- und XMega-<strong>Mikrocontroller</strong><br />
der Firma ATMEL.<br />
Viele Problemstellungen, die früher zeitaufwendig in<br />
Assembler oder C gelöst werden mussten, können durch<br />
diesen modernen Compiler blitzschnell <strong>mit</strong> wenigen<br />
Befehlen erledigt werden, und sollte dies einmal nicht<br />
ausreichen, so stellt <strong>Bascom</strong> noch die Möglichkeit des<br />
Inline-Assemblers zur Verfügung.<br />
Die ersten Kapitel des Buches ver<strong>mit</strong>teln Ihnen die<br />
Programmierung <strong>mit</strong> <strong>Bascom</strong> in einem ausführlichen<br />
Programmierlehrgang. Hier werden die Befehle anhand<br />
kleiner Beispiele verdeutlicht. Hard- und Software werden<br />
detailliert erklärt, und am Ende macht Ihnen keiner mehr<br />
ein Byte für ein Bit vor. Das erlernte Wissen aus dem<br />
Programmierkurs wird in den darauf folgenden Experimenten<br />
kreativ und spielerisch in Mess-, Steuer- und<br />
Regelanwendungen eingesetzt. Das Buch wird Ihnen<br />
auch danach als Referenz und Nachschlagewerk nützliche<br />
Dienste erweisen.<br />
AVR: Grundlagen und<br />
Programmierung<br />
Ausführlicher <strong>Bascom</strong>-<br />
Programmier-Einsteigerkurs<br />
Schaltplan und Erklärung zu jedem<br />
Experiment<br />
Sensoren und Aktoren anschließen<br />
und anwenden<br />
Von den Grundlagen bis zur eigenen<br />
Applikation<br />
Über 100 praktische Experimente,<br />
z. B. Ein-/Ausschaltverzögerung,<br />
Temperaturschalter, Kapazitätsmessgerät,<br />
GPS-Maus auslesen,<br />
Digitalvoltmeter <strong>mit</strong> AVR und<br />
VB.NET, Rasenmäh-Roboter, Steuern<br />
<strong>mit</strong> VB.NET, Ultraschallsensoren,<br />
Drehzahlmesser, Transistor-LED-<br />
Dimmer, Lüftersteuerung, Digitales<br />
Codeschloss, Daten aufzeichnen <strong>mit</strong><br />
Stamp PLOT, Digitaler Datenplotter<br />
<strong>mit</strong> VB.NET selbst gemacht,<br />
Bewegungsmelder, Alarmanlage,<br />
Dämmerungsschalter, Morsezeichen-<br />
Encoder, Morsezeichen-Decoder,<br />
Modellflug: Drohnen-Telemetriesystem<br />
u. v. m.<br />
ISBN ISBN 978-3-645-65041-0<br />
978-3-645-65041-0<br />
39,95 EUR [D]<br />
Besuchen Sie uns im Internet: www.franzis.de