10.11.2012 Aufrufe

Mikrocontroller programmieren mit Bascom Basic ... - Science-Shop

Mikrocontroller programmieren mit Bascom Basic ... - Science-Shop

Mikrocontroller programmieren mit Bascom Basic ... - Science-Shop

MEHR ANZEIGEN
WENIGER ANZEIGEN

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

Hurra! Ihre Datei wurde hochgeladen und ist bereit für die Veröffentlichung.

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!