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

AVR Bascom Basic

Bascom ist eine komplette Basic-Entwicklungsumgebung für die verschiedensten AVR Controller bzw. Controllerboards. Er bietet ein ungeheuer großes Leistungsvermögen und besonders anwenderfreundliche Entwicklungsumgebung. Eine kostenlose Version, die bis zu 4 KB (das ist schon einiges bei einem Controller) keinerlei Einschränkungen besitzt, findet man auf der Seite des Herstellers

Bascom-Download

Nach dem Download müssen alle Dateien entpackt und das SETUP-Programm aufgerufen werden. Danach steht ein Basic-Entwicklungssystem zur Verfügung, das alles beinhaltet was für die AVR-Programmierung notwendig ist. Zum Beispiel: Editor mit Befehlsvorschlag, Simulator, Terminalprogramm, Avr-FuseBit Einstellung, integrierter Assembler, eingebauter Programmer zur Übertragung des Programmcodes usw.

Als erstes solltet ihr unter dem Menü Options / Compiler den Zielprozessor angeben. Fast alle gängigen AVR Controller können programmiert werden. In diesem Dialog können auch noch viele weitere Einstellungen vorgenommen werden. Eigentlich ist das alles selbsterklärend.


http://www.shop.robotikhardware.de/shop/catalog/images/artikelbilder/bascom/bascom.gif

Befehlsübersicht von Bascom

Verzweigungen und Strukturbefehle

IF, THEN, ELSE, ELSEIF, END IF, DO, LOOP, WHILE, WEND, UNTIL,
EXIT DO, EXIT WHILE, FOR, NEXT, TO,  STEP, EXIT FOR,
ON .. GOTO/GOSUB, SELECT, CASE.

Ein- und Ausgabebefehle

PRINT, INPUT, INKEY, PRINT, INPUTHEX, LCD, UPPERLINE, LOWERLINE,
DISPLAY ON/OFF, CURSOR ON/OFF/BLINK/NOBLINK, HOME, LOCATE, 
SHIFTLCD LEFT/RIGHT, SHIFTCURSOR LEFT/RIGHT, CLS, DEFLCDCHAR, WAITKEY,
INPUTBIN, PRINTBIN,  OPEN, CLOSE, DEBOUNCE, SHIFTIN, SHIFTOUT,
GETATKBD, SPC, SERIN, SEROUT

Mathematische Funktionen

AND, OR, XOR, INC, DEC, MOD, NOT, ABS, BCD, LOG, EXP, SQR, SIN,COS,
TAN, ATN, ATN2, ASIN, ACOS, FIX, ROUND, MOD, SGN, POWER, RAD2DEG,
DEG2RAD, LOG10, TANH, SINH, COSH.

I2C-Bus

I2CSTART, I2CSTOP, I2CWBYTE, I2CRBYTE, I2CSEND, I2CRECEIVE.

1WIRE Bus

1WWRITE, 1WREAD, 1WRESET, 1WIRECOUNT, 1WSEARCHFIRST, 1WSEARCHNEXT.

SPI-Bus

SPIINIT, SPIIN, SPIOUT, SPIMOVE.

Datum und Zeitfunktionen

DayOfWeek, DayOfYear, SecOfDay, SecElapsed, SysDay, SysSec, SysSecElapsed,
Time, Date, Time$, Date$

Disk/Drive

DriveReadSector, DriveWriteSector, DriveInit, DriveGetIdentity, 
DriveReset, DriveCheck.

Dateisystem Befehle

InitFileSystem, DiskSize, DiskFree, Kill, Dir, Name, ChDir, MkDir, RmDir
FileLen, FileDateTime, FileDate, FileTime, GetAttr
FreeFile, Open, Close, Flush, Print, Write, Input, Line Input, Get, Put, Seek
EOF, LOC, LOF, FileAttr
BLoad, BSave

Interrupt Programmierung

ON INT0/INT1/TIMER0/TIMER1/SERIAL, RETURN, ENABLE, DISABLE, 
COUNTERx, CAPTUREx, INTERRUPTS, CONFIG, START, LOAD.

Bit Manipulation

SET, RESET, ROTATE, SHIFT, BITWAIT, TOGGLE.

Variablen

DIM, BIT , BYTE , INTEGER , WORD, LONG, SINGLE, DOUBLE, STRING , DEFBIT,
DEFBYTE, DEFINT, DEFWORD.

Sonstiges

REM, ' , SWAP, END, STOP, CONST, DELAY, WAIT, WAITMS, GOTO, GOSUB, 
POWERDOWN, IDLE, DECLARE, CALL, SUB, END SUB, MAKEDEC, MAKEBCD, 
INP,OUT, ALIAS, DIM , ERASE, DATA, READ, RESTORE, INCR, DECR, PEEK,
POKE, CPEEK, FUNCTION, READMAGCARD, BIN2GRAY, GRAY2BIN, CRC8, CRC16,
CHECKSUM, DTMFOUT, DTMFCODE.

Compiler Direktiven

$INCLUDE, $BAUD and $CRYSTAL,  $SERIALINPUT, $SERIALOUTPUT, $RAMSIZE,
$RAMSTART,   $DEFAULT XRAM, $ASM-$END ASM, $LCD, $EXTERNAL, $LIB.

String Manipulationen

STRING, SPACE, LEFT, RIGHT, MID, VAL, HEXVAL, LEN, STR, HEX, 
LTRIM, RTRIM, TRIM, LCASE, UCASE, FORMAT, FUSING, INSTR. 

Erläuterung grundlegender Bascom-Funktionen

Hier einige kleine Programme, welche die grundlegende Funktionen und Syntax zeigen. Es wird immer ein komplettes Programm gezeigt, so dass man dieses einfach kopieren und austesten kann. Bascom Programme bestehen in der Regel fast immer nur aus einer Sourcecode-Datei (obwohl es auch anders geht), also nicht wie bei der Programmiersprache C üblich aus mehreren Dateien (Header-Dateien etc.). Auch das macht Bascom besonders einsteigerfreundlich.


Das berühmte Hello World Programm in Bascom

Da bei einem Controllerboard gewöhnlich kein Bildschirm zur Verfügung steht, verbindet man das Board über einfaches RS232-Kabel (nur 3 Drähte sind notwendig) mit dem PC. Ein Terminalprogramm (Bascom hat bereits eines in der Entwicklungsumgebung integriert) zeigt nun auf dem Bildschirm alle Ausgaben des Boards (z.B. des Print-Befehles) an. Eine Methode, die zum Debuggen von Programmen oft genutzt wird.

 $regfile = "m32def.dat" 'Die Anweisung bestimmt Controllertyp, hier AVR Mega 32
 $framesize = 32         'Stackanweisungen, die eigentlich nur bei größeren Programmen 
 $swstack = 32           'wirklich nötig werden
 $hwstack = 32
 $crystal = 16000000     'Die Frequenz des verwendeten Quarzes

 $baud = 9600            'Die Baudrate für RS232 Ausgabe. 
                         'Sie muss auch bei PC Terminalprogramm identisch sein
  do
    Print "**** RN-CONTROL sagt Hello World *****"
    wait 1
  loop

Einen I/O Port umschalten

Die wohl wichtigste Aufgabe beim Controller ist die Programmierung der Ports. Also das Bestimmen des Ausgangspegels eines Controllerpins. Bascom verfügt über zwei Möglichkeiten die Ports zu beeinflussen, die sogenannten High-Level Befehle und die Registerzuweisungen wie sie in C üblich sind. Zuerst ein Programm mit High-Level Anweisung. Ein Pin wird als Ausgang definiert und dann fortlaufend ein- und ausgeschaltet. Ist über einen Widerstand eine LED an diesem Controllerpin angeschlossen (so im Falle von RN-Control), so ergibt sich ein Blinken.

 $regfile = "m32def.dat"  'Die Anweisung bestimmt Controllertyp, hier AVR Mega 32
 $framesize = 32          'Stackanweisungen, die eigentlich nur bei größeren Programmen 
 $swstack = 32            'wirklich nötig werden
 $hwstack = 32
 $crystal = 16000000      'Die Frequenz des verwendeten Quarzes

 $baud = 9600             'Die Baudrate für RS232 Ausgabe. 
                          'Sie muss auch bei PC Terminalprogramm identisch sein

 Config Pinc.0 = Output  'Ein Pin wird als Ausgang konfiguriert PC0 (also Pin0 von Port C)

  do
     Portc.0 = 1          'Pin wird auf High, also 5V geschaltet
     Waitms 100
     Portc.0 = 0          'Pin wird auf Low, also 0V geschaltet
     Waitms 100
  loop

Man kann das Ganze noch etwas übersichtlicher gestalten, indem man dem Port-Pin im Programmcode eine andere Bezeichnung gibt, z.B. LED, wie in dem folgenden Beispiel. Durch den Alias-Befehl wird das ganze Programm wesentlich klarer, so dass einige Kommentarzeilen durchaus entfallen könnten. Man sollte sich daher angewöhnen, den Alias-Befehl auch zu nutzen

 $regfile = "m32def.dat"  'Die Anweisung bestimmt Controllertyp, hier AVR Mega 32
 $framesize = 32          'Stackanweisungen, die eigentlich nur bei größeren Programmen 
 $swstack = 32            'wirklich nötig werden
 $hwstack = 32
 $crystal = 16000000      'Die Frequenz des verwendeten Quarzes

 $baud = 9600             'Die Baudrate für RS232 Ausgabe. 
                          'Sie muss auch beim PC Terminalprogramm identisch sein

 Config Pinc.0 = Output  'Ein Pin wird als Ausgang konfiguriert PC0 (also Pin0 von Port C)
 Led Alias Portc.0       

  do
     Led = 1              'Pin wird auf High, also 5V geschaltet
     Waitms 100
     Led = 0              'Pin wird auf Low, also 0V geschaltet
     Waitms 100
  loop


Das nachfolgende Beispiel kommt ohne den High-Level Befehl CONFIG aus, indem direkt in das Datenrichtungsregister des Controllers geschrieben wird. In diesem Register steht jedes Bit für den Betriebsmodus eines Pins. Die 1 bedeutet, der Pin ist auf Ausgang geschaltet, 0 bedeutet Eingang. Diese Schreibweise hat den Nachteil, dass sie ein wenig unübersichtlicher ist, man kann sehr schnell Pins verwechseln. Vorteil ist allerdings, dass alle 8 Pins eines Ports gleichzeitig mit einer Zuweisung definiert werden können. Es gibt daher Programmierer, die diese Methode bevorzugen, insbesondere wenn sie auch Controller in C programmieren. Das Ergebnis ist in jedem Fall gleich: ein Blinklicht

 $regfile = "m32def.dat"  'Die Anweisung bestimmt Controllertyp, hier [[AVR]] Mega 32
 $framesize = 32          'Stackanweisungen, die eigentlich nur bei größeren Programmen 
 $swstack = 32            'wirklich nötig werden
 $hwstack = 32
 $crystal = 16000000      'Die Frequenz des verwendeten Quarzes

 $baud = 9600             'Die Baudrate für RS232 Ausgabe. 
                          'Sie muss auch bei PC Terminalprogramm identisch sein

 DDRC = &b00000001        'Port PC0 wird als Ausgang definiert, man hätte hier auch
                          'DDRC =1 schreiben können. Man verwendet aber oft die Bitdarstellung
                          'um alle 8 Bit besser überschauen zu können

  do
     Portc.0 = 1          'Pin wird auf High, also 5V geschaltet
     Waitms 100
     Portc.0 = 0          'Pin wird auf Low, also 0V geschaltet
     Waitms 100
  loop

I/O-Port als Eingang

Im nachfolgenden Beispiel möchten wir ein PIN als Eingang verwenden und den Zustand eines Tasters abfragen. Dazu werden die Pole eines Tasters einmal mit GND (Masse) und einmal mit einem Port PA0 verbunden. Wir hätten auch jeden anderen Port nehmen können, da beim Avr-Controller nahezu alle Pins auch auf Eingang geschaltet werden können. Der Übersichtlichkeit halber verwenden wir wieder den Config- und den Alias-Befehl, um den Port in Taster umzutaufen. Etwas gewöhnungsbedürftig ist in Bascom, dass man bei der Definition von Eingangsports nicht PORT sondern PIN beim Config-Befehl angibt. Eine weitere Besonderheit dieses Beispiels ist der Befehl Porta.0=1 beim Eingabeport. Dieser Befehl sorgt dafür, dass im Controller der Eingangsport über einen hohen Widerstand (ca. 100k) mit High (5V) verbunden wird. Dadurch erreicht man, dass bei unbelegtem Port, in unserem Fall ungedrückte Taste, immer ein High Signal gelesen wird. Erst wenn der Taster gedrückt wird, wird diese Spannung quasi kurzgeschlossen und so ein LOW angelegt. Das ganze Beispiel bewirkt nun, dass bei gedrückter Taste die LED leuchtet und beim Loslassen wieder aus geht.

 $regfile = "m32def.dat"  'Die Anweisung bestimmt Controllertyp, hier AVR Mega 32
 $framesize = 32          'Stackanweisungen, die eigentlich nur bei größeren Programmen 
 $swstack = 32            'wirklich nötig werden
 $hwstack = 32
 $crystal = 16000000      'Die Frequenz des verwendeten Quarzes

 $baud = 9600             'Die Baudrate für RS232 Ausgabe. 
                          'Sie muss auch bei PC Terminalprogramm identisch sein


 Config Portc.0 = Output  'Ein Pin wird aus Ausgang konfiguriert PC0 (also Pin0 von Port C)
 Led Alias Portc.0       
 Config Pina.0 = Input    'Ein Pin (PA0) wird als Eingang definiert
 Taster Alias Pina.0
 Porta.0=1                'Interner Pullup Widerstand ein
 
  do
     if taster=0 then
       Led=1            'Pin wird auf High, also 5V geschaltet
     else
       Led = 0          'Pin wird auf Low, also 0V geschaltet
     endif
     Waitms 100
  loop

Tipps und Tricks

Syntax für Rechenoperationen

BASCOM kann nur eine Rechenoperation pro Zeile verarbeiten!

a = b * 2 + c
funktioniert nicht. Stattdessen müssen die Operationen aufgeteilt werden:
a = b * 2
a = a + c

Wie man besonders kompakten Code erzeugt

  • Beachte, dass 32Byte HW-Stack-Minimum für ISR.
  • Vermeide LOCAL Variable
  • Vermeide SUB / FUNCTION mit Parameterübergabe
  • Vermeide Bit-Variable
  • Vermeide a>b, verwende a>=c oder b<a (RISC-Prozessor kennt kein größer als)
  • Vermeide Double/Single/Long etc. und dazugehörige Matheoperationen (am besten nur Byte und Word)
  • Verwende CONST für Ausdrücke die schon beim compilieren berechnet werden können.

Bit-Schreibweise mit Trennzeichen &B110_0111

Da sich die Verwendung des Unterstriches schwer erklären lässt hier ein Beispiel

Dim I As Byte , J As Byte
Const A = &B110_0111

I = A
Print I ; "  " ; A

Restore Test
Read I
Read J
Print I ; "   " ; J

End

Test:
Data &B1100111
Data &B110_0111

und hier die Ausgabe im Simulator:

103 &B1100111
103 6

man beachte den entfallenen Unterstrich von Print A

Bit-Schreibweise in ASM

im Handbuch steht:

To refer to the bit number you must precede the variable name by BIT.
Sbrs R16 , BIT.B
es geht auch
ldi R24, 2^7+2^4+3

Siehe auch

Literatur

Weblinks


LiFePO4 Speicher Test