erstellt 20.01.2012
Bascom Befehle für den Atmega Mikrokontroller
Q W E R T Z U I O P Ü
H
J
Ö
Ä
Y
X
N




A  
  ABS

ADCSR Register zuständig für Analogeingänge

ADMUX Register
Analogeingang Testprogramm
B Baud
C

Call
CHR
Config DCF77
Crystal
 D

Data Direction Register
Debounce
Deflcdchar
DECR
E Exit
F

Format
For next
Fusing
G


Get RC5
GICR

GIFR
Gosub
Goto
 I



IF THEN
INCR
Input
InputBin
Interrupt
K
Kommentar
L
Lcd
Left
Len
Load
M
MCUR Register

MID
P
Ports
Print
Pulsein
Q
Quarz
R








Regfile
Register ACSR
Register ADCSR
Register ADMUX
Register GICR
Register GIFR
Register MCUR
Register SREG
Register TCCR1A
Register TCCR1B
Register TIMSK
S


Sfior
Sim
Sound
String Variable
Spc
 T Timer

TIMSK
Toggle
 V Val

Variable

Version
W 
Wait
Waitkey
While....Wend
Befehl
Syntax
Beispiel
Beschreibung
  Arithmetische Operationen +, -, *, /, ^   Volt = Adcd * 0.00085190
 
  Logische Operationen =, <, >, <=, >=, <>, NOT, AND, OR, XOR   
 
  Bit-Operationen NOT, AND, OR, XOR, ROTATE, SHIFT
  
 
1 $  Syntax   Beispiel  Beschreibung
  $Baud $Baud = 9600 Die Baudrate für RS232 ( Seriell- Schnittstelle )wird hier angegeben,
sie ist in der Hauptsache abhängig von der Taktfrequenz des Prozessors.
Sie muss auch im Terminalprogramm angegeben sein,
damit eine Synchrone Kommunikation über die Serielle Schnittstelle stattfinden kann.
Wenn diese Anweisung benutzt wird werden automatisch die Digitalen Pin's als  TXD und RDX eingestellt.
  $Crystal $Crystal=16000000 Die Frequenz des externen Quarz wird hier angegeben, sie ist wichtig für die internen
 Zeitabläufe und alle zeitkritischen Abläufe , wie Timer usw.
In dem hier angegebenen  Beispiel wird ein Quarz von 16 Mhz benutzt.
Die Quarzgeschwindigkeit ist in der Hauptsache vom verwendeten Prozessor abhängig.
  $Regfile $regfile = "m32def.dat" Die Anweisung bestimmt Controllertyp,hier (AVR) Mega 32Damit  wird eine Atmega
Spezifische Datei aufgerufen die sich im Verzeichnis  " Bascom " befindet. In der unter
 anderem  die Anzahl der Ports, usw  angegeben  ist.
  $SIM   $SIM Mit dieser Anweisung werden während der Simulation alle Pausen ignoriert also alle Anweisungen der Befehle Wait, bzw Waitms werden durch diese Anweisung missachtet um eine höhere Simulationsgeschwindigkeit zu erreichen.
Nicht vergessen anschließend das Programm neu zu Compilieren.
Sollte nach der Simulation allerdings vergessen werden diese Direktive zu entfernen,  kommt es zu sehr eigenartigen Effekte,
weil dann ja im Programm Code keine Pausen mehr enthalten sind.
Möglicherweise ist auf dem Display keine Anzeige mehr dargestellt, oder angeschlossene Leds leuchten nicht mehr , oder aber leuchten immer usw.

11
A
Syntax
Beispiel
Beschreibung
  ABS() Var= ABS(variable2) var : Eine Variable ( Integer , Long, oder Single), die den Absoluten Wert der Variable2 übernim

Dim A as integer
Dim B as Integer
A= -20
B= ABS(A)
Print B
End


Analogeingang
Testprogramm für Analogeingang am Atmega 8
Es wird am ADC.4 ein Spannung zwischen 0 und 5 Volt gemessen.
Allerdings kann der Analogeingang ADC4 nur 256 Bit ausgeben, hingegen die anderen Eingänge 1024 Bit
$regfile "m8def.dat"          'Definiert den Atmega als Atmega 8
$crystal = 3579545            'Gibt die Quarzfrequenz an in Herz
'---------------------- I/O Konfig --------------------------------------------
Ddrd.5 = 1 ' Ausgang für Led setzen
'-------------------------------------------------------------------------------
$baud = 9600                  ' für Funkempfang über UART Schnittstelle
'-------------------------------------------------------------------------------
Dim A As Word
Dim Ad As Word                ' Analogeingang
'---------------------------- Konfuguration für Analogeingan -------------------
Portc.1 = 1
Admux = &B01110100
Adcsra = &B11100100

Do
Wait 1
Toggle Portd.5
Print Adch
Loop
11
B
Syntax
Beispiel
Beschreibung


  Bits Dim Name As Bit Ein Bit kann entweder 0 oder 1 sein und ist somit die Variable mit dem kleinsten Wertebereich. 
  Byte Dim Name As Byte

Wertebereich: 0 bis 255 und alle Buchstaben des Alphabets (ausgenommen Umlaute + das ß)

Name = 100 'setzt die Variable auf 100
Name = "a" 'speichert den Buchstaben a in der Variable
Name = Name + 2 'addiert 2 zur Variablen, funktioniert logischerweise nur korrekt, wenn die Variable eine Zahl als Wert Name = Name + &B00000010 (auch wieder 2 Addieren allerdings in binärer (&B) Schreibweise)

Diese Bitfolge (Bitmuster) stellt die Zahl 100 dar. Ist das Bit unter

BIT Nr. 7 6 5 4 3 2 1 0
Bit Wertigkeit 128 64 32 16 8 4 2 1
Bit Muster 0 1 1 0 0 1 0 0
                 
                 

der entsprechenden Zahl gleich 1, wird die Zahl
addiert, ist das Bit 0 dann nicht. So kann man aus einsen und nullen ganze Zahlen machen. Die Menge der Bits
bestimmt den Wertebereich der Variablen, z.B. hat die gezeigte Tabelle 8 Bits (also ein 8-Bit Byte). Würde man
jetzt jedes Bit auf eins setzen, hätte man den maximalen Wertebereich, in unserem Fall 255. In Bascom werden
passenderweise auch 8-Bit Bytes verwendet.

111
C
Syntax
Beschreibung

Call
Call Test (Variable, Variable)
Ruft eine Unterroutine (Subroutine) Test auf mit der möglichkeit Variable zu übergeben, wobei der Aufruf der Rountine vorher deklariert werden muss.
  CHR()

Print CHR (var)

S= CHR (var)

Wandelt eine Nummerische bzw. eine Konstante Variable in einen String mit einer Länge von einem Zeichen. Bei diesem Zeichen handelt sich um einen nummerischen Wert, der zwischen 0 und 255 liegt und einen ASKII Zeichen Code repräsentiert  

Var ( Eine Nummerische Varable einer Nummerischen Konstante.

s ( Eine String Variable)

Wird eine Zeichen auf dem Bildschirm bzw. dem Lcd ausgegeben, muß dieses zuvor mit der Funktion CHR() umgewandelt werden
Wird (Print numvar) verwendet, wird der Wert ausgegeben.
Wird ( Print CHR (numvar) verwendet, wird das ASKII Zeichen ausgegeben.

1111 Cls Cls Löscht das Display
  Config ADC CONFIG ADC=single,prescaler=Auto,Reference=opt
oder
Config ADC=Single,Prescaler=Auto,Reference=Internal
ADC: Ausführungsmodus kann SINGLE bzw. FREE sein
PRESCALER: Eine Nummerische Konstante für den CLOCK Teiler.Wählen Sie AUTO, damit der Compiler den besten Wert, abhängig vom (XTAL)Quarz erzeugt.
REFERENCE: Einige Chips wie der M163 haben zusätzliche Rferenz Optionen.Der Wert kann auf OFF,AVCC bsw. INTERNAL gesetzt werden.Schauen Sie im Datenblatt nach den unterschiedlichen Zuständen. Siehe auch GETADC
11 Config DCF77

CONFIG DCF77 = pin , timer = timer

Beispiel:
Config Dcf77 = Pind.2 , Inverted = 1 , Timer = 1 , Debug = 0 , Check = 1 , Gosub = Sectic
Dient zum  Empfang des Radio Funksignals (Funkuhr).
Pin ist der Eingangspin an dem das Funksignal ankommt.
Als Timer kann nur Timer 1 benutzt werden.
Inverted=0 ist Standardwert und steht für ein nicht invertiertes Eingangssignal, somit steht 1 für ein invertiertes Eingangsignal.
Debug

Optional value to fill 2 variables with debug info. DEBUG is on when a value of 1 is specified. By default, DEBUG is off. This has nothing to do with other DEBUG options of the compiler, it is only for the DCF77 code!

When 1 is specified the compiler will create 2 internal variable named : bDCF_Pause and bDCF_Impuls. These values contain the DCF pulse length of the pause and the impulse. In the sample these values are printed.
Check

Check is 1 by default. The possible values are :

0 - The DCF-77 parity bits are checked. No other checks are performed.

Use it when you have exceptional signal strength

1 - The received minutes are compared with the previous received minutes. And the difference must be 1.

2 - All received values(minutes, hours, etc. ) are compared with their previous received values. Only the minutes must differ with 1, the other values must be exactly the same.

This value uses more internal ram but it gives the best check. Use this when you have bad signal reception.

Gosub

The Sectic option will call a label in the main program every second.

You have to insert this label yourself. You must also end it with a RETURN. The option is the same as used with

Optionen
[
INVERTED=inv, CHECK=check, UPDATE=upd, UPDATETIME=updtime , TIMER1SEC=tmr1sec, SWITCHPOWER=swpwr, POWERPIN=pin, POWERLEVEL = pwrlvl , SECONDTICKS=sectick ,DEBUG=dbg , GOSUB = Sectic ]
  Config Keyboard Config Keyboard=PinX.Y,Data.Y,
Keydata=Table
Konfiguriert die GETATKBD() Funktion und zeigt den genutzten Port Pin
Die AT Tastatur kann mit nur 4 Leitungen angeschlossen werden:Clock,Data,GND,VCC.
KeyBoard: Der Pin,der als Clock dient
Data: Der Pin der als Data Input dient
Keydata: Das Zeichen,das der Tastencode gefunden hat. Die AT Tastatur gibt den sogenannten Scasn-Code aus statt den üblichen ASCII Code, aus diesn Grund ist eine Übersetzungstabelle mit der Umsetzung erforderlich.
Bascom berücksichtigt auch die Nutzung der gedrückten Tasten. Spezialtasten wie die Funktionstasten werden nicht unterstützt.

  Config Lcd Config LCD = LcdType Config LCD=16*2
LCD"Hallo" '
 zeigt Hallo Konfiguriert das Lcd Display und überschreibt die Kompilereinstellungen, die z.B. in Bascom hinterlegt sind
LCD Type gibt den Type des genutztenLCD's an z.B. 16*2 für
16Zeichen mal 2 Zeilen oder auch 40*4 oder 20*4 usw Wird diese Einstellung nicht vorgenommen, wird als Standarwert der Typ 16*2 angenommen.

11111111111
D
Syntax
Beschreibung

DDR
Data Direction Register
Ddrd.5 = 1
Konfiguriert Pin d.5 als Ausgang

  Debounce   Entprellt Tasteneingaben   indem eine kleine Wartezeit integriert wird

DECR
Decr X
Subtrahiert den Wert 1 aus der Variable X ( siehe auch INCR )

Deflcdchar
Auf dem angeschlossenen Display am Atmega sind in der Regel nur Zeichen darstellbar die auch auf der Tastatur direkt eingebbar sind,
also außer das eine zusätzliche zweite Taste gehalten wird.
Das ist der sogenannte Standard Zeichensatz, hingegen gehören Zeichen die durch das festhalten einer zweite Taste darstellbar
sind zum erweiterten Zeichensatz, und diese erweiterten Zeichen sind auf dem Display nicht darstellbar.
Einige Atmegas , so auch der Atmega 8 unterstützen bis zu 8 selbst erstellte Sonderzeichen.
Diese Sonderzeichen können mit dem im Bascom Programm enthaltenen LCD Designer selbst gezeichnet und anschließend
auch auf dem Display angezeigt werden.
Die Vorgehensweise ist folgende:
  • Zuerst rufen wir in der Bascom Oberfläche unter der Rubrik "Tools" den Menüpunkt "LCD Designer" auf
  • Damit zeichnen wir unser gewolltes Zeichen und schließen dann mit der Taste "OK" ab
Damit fügt Bascom in der Programmierung unter dem Cursor eine in etwa folgende Zeile ab
Deflcdchar ?,14,17,17,14,32,32,32,32' replace ? with number (0-7)
Das in grüner  Schrift gehaltene dient nur als Kommentar und kann gelöscht werden
Das Fragezeichen wird durch eine Zahl zwischen 1und 8 ersetzt, dadurch werden die evtl. 8 Verschiedenen Zeichen differenziert.
So das die Zeile folgendermaßen aussieht:
Deflcdchar 1,14,17,17,14,32,32,32,32
anschließend  folgt noch das Zeichen CLS (Display löschen)
So das die ganze Programmierung folgendermaßen aussieht:
Deflcdchar 1,14,17,17,14,32,32,32,32
cls
Anschließend kann das so erstellte Zeichen im Programm wie folgt aufgerufen werden wobei die Zahl 1 angibt das es das erste von 8 möglichen  erstellte Zeichen ist.
LCD CHR(1)

  DIM DIM var As {XRAM/SRAM/ERAM} type [AT location] [OVERLAY]

DIM A as Byte
Dimensioniert eine Variable
Var: jede gültige Varable Name wie z.B. B1, A oder Test
Type: Bit, Byte, Word, Long, Single, String, Integer
XRAM: XRAM Angaben zum Speichern einer Varablen in einem externen Speicher
SRAM: SRAM Angaben zum Speichern einer Variablen in einem Internen Speicher ( Standard)
ERAM: ErAM Angaben zum Speichern einer Variablen im EEProm
OVERLAY: Angabe , dass die Variable den Speicher belegt.

Dimensioniert A als eine Variable mit einem Speicherplatz von 256 Byte.
Eine Stringvariable benötigt zusätzlich noch eine Längenangabe
DIM A as String * 10
In diesem Fall kann der String maximal 10 Zeichen lang sein. Bits können allerdings nur in den internen Speicher geladen werden.Die Optionale AT Angabe definiert wo die Variable im Speicher abgelegt werden soll. Wenn der Speicher schon belegt ist, wird der nächste freie Speicherplatz genutzt.
Die OVERLAY Angabe benutzt keinen Variablen Platz Sie erzeugt einen Pointer ( Zeiger) .
  Do ......Loop

Do

.....Anweisung

Loop (Until Bedingung)

Do

Print A ( gibt Variable A aus )

incr A ( erhöht Variable A um 1 )

Loop Until A=10 ( wenn Variable 10 erreicht hat verlasse Schleife)

Alles was zwischen diesen beiden Anweisungen steht, wird immer wieder ausgeführt. Im Prinzip also unendlich. Daher kann auch die 'Stop'-Anweisung entfallen, da der AVR aus dieser Schleife nie heraus kommt.

Die Schleife geht so lang zwischen DO und Loop, bis die Bedingung die hinter Until kommt richtig ist. Die Schleife kann vorzeitig mit dem Befehl "Exit Do " verlassen werden

DO ..Loop Scleifen können auch ineinander verschachtelt sein. Es wird also erst eine Anweisung ausgeführt, dann wird überprüft ob diese Anweisung noch einmal ausgeführt werden soll.

22 E
Syntax
Beschreibung
  Echo   Die Einstellung ECHO ON gibt an, dass vom Befehl INPUT sofort nach dem Empfang eines Zeichens, dieses Zeichen zurück geschickt werden soll. Das ist die Standardeinstellung! Die Einstellung ECHO OFF gibt an, dass nichts zurück geschickt werden soll.
  Exit Exit For
Exit Do
Exit While
Exit Sub
Exit Function
Mit EXIT kann eine Schleife jederzeit verlassen werden  
22 F
Syntax
Beschreibung
Beispiel
Bemerkung
  Format target=Format (source,"mask") Formatiert einen Nummerischen String
target=Eine Variable (String), die den formatierten String enthält.
source= Der Ursprungsstring
mask = Die Formatmaske für die Strinvarable. Wenn Leerzeichen in der Maske vorkommen, werden auch die Leerzeichen dem String hinzugefügt.

DIM S as string *20
Dim I as Integer

S="1234565"
S=Format(s,"+")
Print S

S="123"
S=Format(s,"00000")
Print S

S="12345"
S=Format(s,"000.00")
Print S

S="12345"
S=Format(s,"+000.00")
Print S
End


For Next Schleife
For A = 1 To 20

Portd.3 = 1
Waitms 8
Portd.3 = 0
Waitms 280

Next A
Schleife wird 20 mal durchlaufen,dann wird die Schleife verlassen
A muss als Variable deklariert werden
For T = -30 To 0        
Locate 1 , 1
Lcd T
Locate 1 , 7
Lcd "Sekunden"
Locate 2 , 7
Lcd "Wartezeit"
Locate 2 , 1
Lcd "V.2A"

Waitms 1000
Cls
Next T


Fusing
Formatiert einen String, Byte oder Single Variable , damit ist es möglich Zeichen oder Zahlen auf eine
bestimmte Menge an Zeichen hinter dem Komma anzeigen zu lassen.
Diese Anweisung kann auch in Verbindung mit dem "Print" Befehl verwendet werden
Dim Variable 1 as Single
Dim Variable 2 as String * 10
--------------------------------
Variable1 = 12345,1234
Variable2=fusing(variable1,"#.##")
  LCD Variable 2
------------------------
zeigt das Ergebnis 12345,12 an

oder als Ausgabe auf dem Display:

Lcd Fusing(varable , "#.###")



oder einfach

Lcd "A=" ; Fusing(analog1_strom , "#.###")
3333
G
Syntax
Beschreibung
Beispiel
Bemerkung

GET RC5

' Pin für IR Empfänger angeben
Config Rc5 = Pinc.4
Portc.= 1                   ' PullUp aktivieren
Enable Interrupts             ' Globale Interrupts freigeben
Dim Address As Byte , Command As Byte
Dim Flag As Bit
Flag = 1



Do
'---------Infrarot Abfrage---
Getrc5(address , Command)
If Flag = 1 Then
Cls
Locate 1 , 1
Lcd "Warte auf Signal"
Flag = 0
End If
If Address <> 255 Then
Reset Command.7               ' Toggle bit zurück setzen
Cls
Locate 1 , 1
Lcd "Adress:" , Adress "
Locate 2 , 1
Lcd "command:" ; Command
Flag = 1
End If

Loop
Hiermit kann eine Digitaler IR Empfänger abgefragt werden.
Der Atmega ist in der Lage das Signal direkt zu entschlüsseln.
Allerdings muss dazu die Fernbedienung das RC5 Protokoll verwenden

Goto
Goto Test
Springt zur Angegebenen Marke mit dem Namen "Test"
Goto Test
............
..........
Test:
Hier wird hin gesprungen und das Programm weiter fortgeführt.
Die Marke zu der gesprungen werden soll muss ein Goto vorgesetzt werden z.B.
Goto Test
oder einfach durch ein Doppelpunkt gekennzeichnet werden
Test:
außerdem dürfen die Marken bis zu 32 Zeichen lang sein
  Gosub Gosub label Verzweigt in eine Unterroutine innerhalb einer Prozedur und kehrt zum Ausgangspunkt zurück.

Goto Fortsetzen
Print " Dieser Code soll nicht gedruckt werden "
Fortsetzen:( Sprungmarke muss mit Doppelpunkt abgeschlossen werden)
Print " Hierstratet die Unterroutine"
Gosub Routine
Print "Zurück von der Routine"
end

Routine:
Print"Das wird ausgeführt"
Return (Zurück von der Unterroutine)

Label ist der Name der Sprungmarke, an dem das Programm fortgeführt werden soll .Die Gosub und Return Routine sind an jeder Stelle im Programm zulässig Die sprungmarken können bis zu 32 Zeichen lang sein und müssen wenn kein Gosub davor gesetzt wird mit einem Doppelpunkt abgeschlossen werden.

(Variable die innerhalb einer Gosub Routine gesetzt werden, werden beim verlassen durch Return wieder auf Null gesetzt) ms

4444
I
Syntax
Beschreibung
Beispiel
Bemerkung
22
if.......then Else

if Bedingung then

else if bedingung then

else

end if

Wenn die "if then" Anweisung in eine Zeile geht, dann kann man es so übernehmen, man kann auch hinter dem "then" mehrere Anweisungen schreiben. Die müssen dann allerdings durch einen Doppelpunkt von einander getrennt werden, und immer noch in einme zeile passen.

if A = 10 then A=20
Print A
end if

(Wenn A gleich 10 entspricht dann weise A den Wert 20 zu) oder 

Hier kann man unter "then" mehrere Anweisungen schreiben, muss diese dann aber mit "End if" abschließen. hier ist es etwas übersichtlicher gestaltet

 Immer wenn die IF ...Then Anweisung mehr als eine Zeile umfasst, muss diese Anweisung mit der Zeil " end if" beendet werde.
So wird sichergestellt das der Interpreter das ende der Anweisung auch sicher erkennt.
Beispiel:
If Pind.2 = 0 And Pind.3 = 0 Then
Toggle Portc.5
End If
Beispiel:
 If Pinb.7 = 0 And Durschmesser > 0 Or Durschmesser < 0 Then Exit Do
Beispiel:
If Pind.2 = 0 Then
Waitms 50
If Pind.2 = 0 Then
Incr Stunde
If Pind.2 = 0 Then Portd.7 = 1
Else
Portd.7 = 0
End If
End If

Beispiel:
If Porta.7 = 1 And Porta.0 = 1 Then Takt1 = Takt1 + 1 Else Takt1 = Takt1 + 0


Beispiel:
If Pulszeit < 3 And Pulszeit > 1 Then Antwort = 1
22 INCR
Incr X
In der Variable X wird immer eine Increment also der Wert 1 hinzuadiert
 22  Input
Der Befehl INPUT erwartet eine Zeichenfolge aus dem UART und schreibt diese in eine Variable.
INPUT wartet so lange auf die Zeichenfolge bis CARRIAGE RETURN (CR) übermittelt wurde.
Das Programm bleibt also stehen, bis CR über die UART rein kommt.
Das ist ideal, wenn das Programm in der Hauptschleife nur kommuniziert.
Es ist nicht ideal, wenn in der Hauptschleife auch noch andere Dinge erledigt werden sollen.
Dafür gibt es andere Befehle wie INKEY oder ISCHARWAITING.
Außerdem gibt es sogar die Möglichkeit einen Interrupt auslösen zu lassen wenn eine Zeichenfolge angekommen ist.

Dieses Beispiel wartet bis eine mit CR abgeschlossene Zeichenfolge übermittelt wurde und schickt diese über die UART zurück:

Dim Empfangen As String * 20    Do     Input Empfangen     Print "Empfangen: " ; Empfangen  Loop    End  

Mit CONFIG INPUT kann man einstellen welches unsichtbare Zeichen oder welche unsichtbare Zeichenfolge einen Empfang abschließt.

Und mit ECHO OFF kann man einstellen, dass in ein Terminal eingegebene Zeichen nicht sofort wieder zurück geschickt werden.

( Beispiel )           Input zum Einlesen über die RS232 Schnittstelle
$Baud 4800 ( Ermöglicht erst das einlesen über die Serielle Schnittstelle und gibt die Baudrate an)
Dim Rs232_empfang As String * 255 ( Deklariert die Variable in der die Zeichen emfpangen werden sollen als Variable mit einer Größe von 255 Bit)

Rs232_empfang = ""      (stellt sicher das die Variable leer ist)
Input Rs232_empfang    (Emfangene Zeichen werden in Variable RS232 gespeichert ,aber nur wenn am PC auch Return gedrückt wurde)

Select Case Rs232_empfang      (Anfang der Auswerteschleife)
Case "0"                                        ( wenn Zeichen Null  emfangen dann)
Portd.5 = 0                                     ( Portd.5 aus schalten )
Print " Gelbe Led ausschalten"      (Meldung an den PC (Terminalprogramm ) senden )
Case "1"  ( Wenn Zeichen Eins empfangen wird dann )
Portd.5 = 1  ( Portd.5 einschalten)
Print "Gelbe Led eingeschaltet"  ( Meldung an den PC)
End Select ( Ende der Auswertung)


Beim Befehl INPUT wartet der Prozessor bis die Eingabe mit Return bestätigt wurde und läuft dann erst im Programmcode weiter, wenn das nicht gewünscht ist sollte mann anstatt INPUT den Befehl INKEY verwenden, damit wird die Variable in der Programmschleife abgerufen:
Beispiel:

Rs232_emfang = Inkey()                                      (Sieht nach einem Zeichen)
If Rs232_emfang > 0 Then Print Rs232_emfang (Wird irgend ein Zeichen empfangen dann soll Zeichen an PC übergeben werden)


If Rs232_emfang = 50 Then Toggle Portd.6       ( 50 ist der Scancode der Taste 2)
If Rs232_emfang = 51 Then Toggle Portd.7        (51 ist Der Scancode Der Taste 3)

 
22 Inputbin

Dim My_word_var As Word

Do Inputbin My_word_var

Printbin My_word_var

Loop

End

  Bei diesem Befehl wartet Bascom auf Binärdaten. Es wartet also nicht auf Text, wie es INPUT macht, sondern auf reine Daten. An diesen Befehl wird als Argument eine Variable übergeben. INPUTBIN stoppt das Programm so lange, bis diese Variable befüllt wurde. Wird also eine BYTE-Variable übergeben, dann genügt ein Byte und das Programm läuft weiter. Wird eine WORD-Variable übergeben, dann wartet INPUTBIN bis zwei Byte (=WORD) übergeben wurden. Beispiel:
 
22  Interrupt GICR = General Interrupt Control Register bei einigen Atmegas auch unter der Bezeichnung GIMSK zu finden , hier können die Interrupt's eingeschaltet und natürlich bei Bedarf auch ausgeschaltet werden.

Beispiel:

Portd.2 = 1(PullUp setzen)
Portd.3 = 1( PullUp setzen)
Gicr = &B11000000                                           (Interrupt 0 und 1 einschalten, Bit 6 setzt Interrupt 0- Bit 7 setzt Interrupt 1)
Sreg.7 = 1 ( Interrupts Global freigeben)
 
On Int0 Routine0  ( Namen der Routine festlegen)
On Int1 Routine1  ( Name für Routine 1 festlegen)
(Routine 0)
Routine0:
Portd.5 = 1
Waitms 100
Portd.5 = 0
Return
( Routine 1)
Routine1:
Portd.6 = 1
Waitms 100
Portd.6 = 0
Return


Interrupt SREG.7=1 Interrupts Global freigeben als Direkte Registereingabe


Enable Timer0 Interrupt für Timer 0 freigeben


TIMSK.TOIE0=1 Interrupt für Timer 0 freigeben als direkte Registereingabe
22 Inkey ()

Var=Inkey ()

Var=Inkey (#channe)

Liefert einen ASKII Wert des ersten Zeichens im Seriellen Inputbuffer

Dim A as Byte
Do ' Abfrage starten
A=Inkey() ' Sieht nach einem Zeichen
If A > 0 then ' Ist die Variable größer 0
Print A ' Auf RS232 ausgeben
End if
Loop

Var ( Byte,Integer,Word,Long,String)

Channel (Eine Konstante Zahl, die den offenen Kanal im Software UART Modus identifiziert)

Diese Funktion wartet nicht auf das Zeichen. Es wird eine Null zurück geliefert wenn kein Zeichen empfangen wurde.

Nutzen die ISCharWaiting() Funktion , um zu prüfen, ob ein Byte wartet.
Die Inkey Routine kann genutzt werden, wenn ein RS232 Gerät vorhanden ist. Das Rs-232 Gerät kann mit dem COM Port des Computer verbunden werden.

22 Ischarwaiting

 

 ISCHARWAITING gibt 1 zurück, wenn im UART-Buffer ein Zeichen wartet. ISCHARWAITING gibt 0 zurück, wenn kein Zeichen im UART-Buffer wartet. Beispiel: siehe INKEY
22 Kommentar
Wer sein Programm auch später noch richtig lesen und verstehen möchte, sollte
seinen Quelltext exakt dokumentieren.Die Dokumentation kann man übersichtlich im Quellcode selbst erstellen. Dazu gibt es unterschiedliche Kommentarzeichen, die man dazu verwenden kann, normale Texte auszuklammern.
In den Standardeinstellungen von BASCOM erscheint ein auskommentierter Text in
Grün.

Beispiel:
' Ich bin ein einzeiliger Kommentar

REM Auch ich bin ein einzeiliger Kommentar

' (
Ich bin ein
mehrzeiliger Kommentar,
der immer länger und länger wird …
' )






43
L
Syntax
Beschreibung
Beispiel
Bemerkung

LCD


LCD "Test" gibt "Test" im Display aus


Mann kann auch Variableninhalte im Display darstellen Gibt Die Variable A aus dem Display aus incl deren Inhalt Lcd "A=" ; A

Ebenso kann man auch die Werte der einzelnen Ports im Display anzeigen lassen
Lcd Pinb.0 ; Pind.7 ; Pind.6 

Cursor Off Noblink
Schaltet den Cursor aus

Mögliche Fehler beim Anschluss eines Display: Fehlende Spannungsversorgung, Datenleitungen vertauscht, oder im Programm nicht richtig zugeordnet.

Left
Z = Left(textmenge , 2) 

Mit LEFT können Zeichen aus einer Variablen ausgelesen werden Es werden hier aus der Variable "Textmenge" beginnen von LInks zwei Zeichen ausgelsen und in die Variable Z abgelegt


Len
Len
Mit Len wird die Anzahl der Zeichen  einer String Variablen ausgegeben
Dim Textmenge As String * 10
Dim Textlaenge As Byte
Textlaenge = Len(textmenge) 
LCD textmenge ( zeigt die Anzahl der Zeichen aus der Variable Textmenge an)

Load
Load Timer , Value
Lädt den angegebenen Timer mit einem Wert
Load Timer0, 100
Der Timer kann nachdem er geladen wurde, nicht erneut geladen werden. Wenn der Timer nach 10 Takte einen Interrupt erzeugen soll kann die Funktion "Reload" verwendet werden. Ein 8 Bit Timer kann mit dem Wert 0 bis 256 geladen werden. Soll also nach 10 Takte ein Interrupt erfolgen müssen wir von den möglichen 256 Takte 10 abziehen = 246 , und den Timer mit diesen 246 laden. Beim Timer1 der ein 16 Bit Timer ist haben wir mögliche 65536 Takte.
  Left() Var= Left (String,length) Liefert einen Wert Typ String,der eine bestimmte Anzahl von Zeichen ab dem ersten (linken) Zeichen einer Zeichenfolge enthält.

Dim S as String * 30
Dim SS as String * 30

S= ABCDEF

SS= left(S,5)

Print SS
Ausgabe ist ABCDE

Var : Der zugeordnete String
lenght: Die Anzahl der Zeichen, die aus der linken Seite des Strings gelesen werden.
322
Syntax Beschreibung Beispiel Bemerkung

MID
Z = Mid(textmenge , 2 , 1)
List aus einer Zeichenkette"Textmenge"ab den 2. Zeichen, ein Zeichen aus und speichert das ausgelesene Zeichen in der Variable "Z"







322
P
Syntax
Beschreibung
Beispiel
Bemerkung
Ports & Pin's
22 
Port   
Beim Atmega gibt es diverse Ein/Ausgänge. Diese sind jeweils zu 8 Bit zueinem Port zusammengefasst.
Der Atmega 8 besitzt 3 dieser Ports. Die Ports hat man nach dem Alphabet benannt. Der AVR besitzt Ports mit den Namen PortB ,PortC und PortD. Beim Port C hat man die 8.Leitung nicht herausgeführt.
Jeden Anschluss kann man entweder als Einzel Eingang oder Ausgang definieren oder man kann auch den gesamten Port als ganzes verwenden. Da jeder Pin noch eine Zweitfunktion besitzt,ist die Definition als Einzelpin sehr sinnvoll.
Sobald die Direktive $Baud im Programm eingesetzt wird, hat sie Vorrang vor den Funktionen als normalen Ein oder Ausgängen und wandelt die normalen EIN/Ausgänge in einer Modem Schnittstelle mit den Anschlüssen TXD und RXD um.
Beim Atmega 8 äußert es sich beispielsweise so, dass beim Einsatz der Direktive $Baud , obwohl Pin D.0 beispielsweise ein mit einer LED angeschlossenen
und als Ausgang gesetzt Pin, dieser Ausgang zwar in seiner Funktion vorhanden ist, er aber nicht sauber schaltet, bei einer Betriebsspannung von 2,5 Volt schaltet Pin D.0 nur zwischen 1 und 2,5 hin und her.
Sollte ein Display angeschlossen sein, kann man sich den jeweiligen Status der Ports mit folgendem Befehl (Lcd Portd.4) Anzeigen lassen. Es wird dann der jeweilige Zustand als 0 oder 1 angezeigt.
DDRD = 1 Hier wird der gesamte Port  D als Ausgang definiert , die 1 gibt an das es sich um einen Ausgang handelt
DDRD=&HFF oder
DDRD=255
DDRD=&B11111111
Hier wird der gesamte Port D als Ausgang angegeben allerdings als Hexwert dargestellt als FF . sind gleich Dezimal 255 oder Binär 11111111
Config Portd = Output Konfiguriert den gesamten Port als Ausgang . Im AVR wird dabei ein Register gesetzt,der Steuerelektronik des Ports wird damit gesagt,das es als Ausgang arbeiten soll. Das Register nennt man Datenrichtungsgegister (DDR = Data Direction Register)

Config Portb.1 = Output
Konfiguriert nur den Port b.1 als Ausgang
22   PortC.0 = 1 oder
PortC=255 oder
PortC=&B11111111
Pin C.0 wird auf High geschaltet Also der Interne PullUp Widerstand wird aktiviert
 Led Alias Portc.0 Port C.0 wird als Variable Led abgeleg
DDRC = &B00000001    PortC.0 wird als Ausgang definiert , alle anderen , also Port C.1 bis C7 bleiben als Eingänge definiert    &B Bezeichnet das der folgende Wert im Binärformat angegeben ist, anschließend werden die 8 Bits des Ports angegeben, , die Zählweise ist von rechts nach links gelesen , als rechts das Bit 0 , und das linke Bit ist das Bit 7
Mann solte alle POrts die als Eingang definiert sind , auf einen festen Bezugspunkt legen,auch wenn sie nicht benutzt werden, also entweder durch den internen PullUp Widerstand auf Plus legen, oder eben extern auf Masse legen . Weil diese Eingänge sonst einen undefinierten Wert annehmen können, und dadurch das Programm durcheinander bringen können.
22 Print Print var; "constant" Sendet eine Ausgabe auf dem RS232 Port. Schreibt einen String in eine Datei.

Dim a as Byte

A=1
Print "Ausgabe der Varable A = "; A

Print Hex (A)' Ausgabe in Hexformat

 

var: Die Variable bzw. Konstante die ausgegeben werden soll.
Um mehr als eine Variable in einer Zeile auszugeben darf ein Semikolon (;) benutzt werden. Wird die Zeile mit einem Semikolon beendet, wird der Zeile kein Wagenrücklauf hinzugefügt.
Ist ein RS232 Gerät angeschlossen, kann die Print Anweisung genutzt werden..Das Rs232 kann mit dem Seriellen Port ihres PC's verbunden werden, auf diese Weise kann man ein Terminal Programm als Ausgabegerät benutzen.

Um beim Übertragen die Zeichen für LF Zeielnsprung und Return zu ünterdrücken muss ein Strichpunkt ";" hinter der Zahl angegeben werden
Also nicht
Print 1
sondern
Print 1;

Beim Empfang der gesendeten Zahl 1
wird bei
Lcd "Empfange=" ; Chr(x)
die 1 angezeigt und bei
und bei
Locate 2 , 1
Lcd "Empfange=" ; X
der Askii Wert 049
angezeigt.

Es wird vom Sender ein Signal mit folgenden Text übetragen "PIR"
Beim Empfänger aber kommt es nicht als zusammenhängender Text an sondern Buchstabe für Buchstabe
Also nicht als "PIR" sondern als "P"  dann "I" dann "R"
Offensichtlich wird immer nur ein Byte übetragen, und das bedeutet auch immer nur ein Zeichen, wenn dem so ist wird immer nur Zeichen nach Zeichen übetragen, und die müssen dann im Empfänger wieder zusammengesetzt werden.

22
Pulsein

Pulsein misst die Länge eines anstehenden Signal
Pulsein Pulszeit , Pind , 5 , 1
wartet bis zur nächsten aufsteigender Flanke an Pin d.5 und stoppt bei der nächsten abfallende Flanke
die Zeit wird mit einem 16 Bit Zähler erfasst und benötigt keinen Timer.
Es wird die Zeit in 10us Schritte ausgegeben.
Pulsein var,PINx,Pin,Status
Pinx=Pinregister z.B. Pind
Pin= Pin Nummer zB. 1 bis 7
Status= 1 für Messung von ansteigender Flanke zur nächsten Abfallende
oder 0 für Abfallende Flanke zu nächsten Aufsteigende
Dim Pulszeit As Byte
Pulsein Pulszeit , Pind , 5 , 1
Lcd "Pulszeit=" ; Pulszeit
Im ERR Flag wird eine 1 abgelegt wenn kein Signal eingeht
Somit kann durch auslesen des Flags festgestellt werden ob ein Signal angekommen ist.
Beispiel:
if err=1 then lcd"kein Signal"
22 Quarz
Wie kann ich feststellen ob mein Quarz auch schwingt ?

Am einfachsten , ich lass den Atmega mit seinen Stadardeisntellungen laufen, das wäre beim Atmega 8 z.B 1 Mhz
dabei schreibe ich ein kleines Programm das nur eine Led ungefähr im Sekundentakt blinkt.
Dann erst aktiviere ich den externen Quarz in dem ich die Fuse Bits einstelle.
Habe ich beispielsweise ein 8 Mhz Quarz angeschlossen , sollte ab dann die Led mit 8 facher Geschwindigkeit blinken.
Damit ist sichergestellt das der Atmega auch den Quarz erkannt hat und dieser auch schwingt

Anschließend ändere ich die Christal Anweisung im Programm 
von $crystal = 1000000 ( Standardwert , muss nicht zwingend angegeben sein)

auf $crystal = 8000000
Danach sollte die Led wieder im Sekundentakt arbeiten
22 Register
Register ACSR
ACD
ACBG
ACO
ACI
ACIE
ACIC
ACIS1
ACIS0
Funktion
Bit 7
Bit 6
Bit 5
Bit 4
Bit 3
Bit 2
Bit 1
Bit 0

0
0
0
0
0
0
0
0
Bei  0 ist der Komparator eingeschaltet ( Default)  , bei 1 ausgeschaltet.
0
0
0
0
0
0
0
0
Bei  1  ist die Interne Referenzspannung eingeschaltet und liegt am AIN0 an, bei 0 aus.
0
0
0
0
0
0
0
0
Ausgang des Komparators , kann nur ausgelesen werden
0
0
0
0
0
0
0
0

0
0
0
0
0
0
0
0
Wenn 0 dann ist der Komparator Interrupt ausgeschaltet
0
0
0
0
0
0
0
0

0
0
0
0
0
0
0
0
Interrupt wird bei steigender und bei fallender Flanke ausgelöst
0
0
0
0
0
0
0
1
Verwendung des Interrupt ist ausgeschaltet
0
0
0
0
0
0
1
0
Interrupt bei fallender Flanke aktiviert
0
0
0
0
0

1
1
Interrupt bei steigender Flanke aktiviert

22


Register ADCSR
Register ADCSR
Bit 7
Bit6
Bit5
Bit4
Bit3
Bit 2
Bit 1
Bit 0










1







schaltet den AD Wandler ein ( Standard = 0)

1






Dieses Bit startet eine einzelne Wandlung sobald man es auf 1 setzt.
Befindet sich der Wandler im Dauermodus muß man dieses Bit einmal auf 1 setzen
um mit der Dauerwandlung zu beginnen.
Solange eine Wandlung am Laufen ist, ist dieses Bit auf 1. Danach wird es
automatisch wieder auf 0 gesetzt.
Das manuelle setzen auf 0 hat zu keinem Zeitpunkt einen Effekt.



1





Freilaufmodus für permenenter Konvertierung, sonst nur einmalige Konverteirung













1



Interrupt soll genutzt werden





0
1
0
Teilt Systemtakt durch 4 für Samplerrate die sollte zwischen 50 KHz und 200 KHz betragen





1
1
1
Teilt Systemtakt durch 128 für Samplerrate die sollte zwischen 50 KHz und 200 KHz betragen
Mit dem Register ADCSR wird die Funktion des A/D Wandlers beeinflusst.
Beispiel:
ADCSR = &B11100111


Bit 7=1 schaltet den AD Wandler ein (Standard = 0 )
Bit 6=1 startet die Konvertierung
Bit 5=1 Freilaufmodus für permanente Konvertierung
Bit 3=1 Interrupt soll benutzt werden
Bit 2 + 1 + 0 legt die Samplerrate fest, also mit welcher Geschwindigkeit die Analogeingänge abgefagt werden.
Die Geschwindigkeit wird aus dem Systemtakt des Atmega gewonnen indem dieser durch einen Teiler den Takt reduziert.
Dieser Teiler Faktor wird durch BIT 2-1-0 bestimmt laut Datenblatt sollte die Samplerrate zwischen 50 und 200 Khz betragen.
Bit 2 + 1 + 0= 111 teilt Systemtakt durch 128

22 Register ADMUX
Register ADMUX
REFS1
REFS0
ADLAR
----
MUX3
MUX2
MUX1
MUX0

Bit 7
Bit 6
Bit 5
Bit 4
Bit3
Bit2
Bit1
Bit 0
Funktion
0
0






Es wird als Referenzspannung die am Anschluss AREF (Pin 32 beim Atmega32) benutzt,diese Referenzspannung kann zwischen Null und Fünf Volt betragen.
0
1






Referenzspannung wird an Anschluß AVCC angelegt, ist gleich die Versorgungsspannung für den A/D Wandler also meist die Betriebsspannung.
1
0






ohne Funktion
1
1






Es wird eine interne Referenzspannung benutzt die auf 2,56 Volt festgelegt ist.


0





sorgt für eine 10 Bit Auflösung also 0 bis 1023


1





sorgt für eine 8 Bit Auflösung also 0 bis 255



?








?









X



wird nur für Vergleichsoperationen verwendet , also wenn der Analogeingang als Komparator Verwendung findet




0
0
0
0
ADC0
Damit wird der Analogeingang ausgewählt ,  weil der Eingang über einen Multilexer mit dem Atmega verbundet wird  kann immer nur ein Eingang Aktiv sein. 000 ist




0
0
0
1
ADC1




0
0
1
0
ADC2




0
0
1
1
ADC3




0
1
0
0
ADC4




0
1
0
1
ADC5




0
1
1
0
ADC6




0
1
1
1
ADC7
22
Register GIFR
General Interrupt Flag Register
Bit7
Bit6
Bit5
Bit4
Bit3
Bit2
Bit1
Bit0
INTF1
INTF0
-
-
-
-
-
-
R/W
R/W








22
Register MCUCR
Bit 7
Bit 6
Bit 5
Bit 4
Bit 3
Bit 2
Bit 1
Bit 0

X
X
X
X
X
X
0
0
wiederholt solange L-Pegel
X
x
X
X
X
X
0
1
INT0 bei Wechsel von H zu L oder L zu H
X
X
X
X
X
X
1
0
INT0 bei Wechsel von H zu L
X
X
X
X
X
X
1
1
INT 0 bei Wechsel von L zu H
X
X
X
X
0
0
X
X
INT1 wiederholt solange L Pegel
X
X
X
X
0
1
X
X
INT1 bei Wechsel von H zu L oder L zu H
X
X
X
X
1
0
X
X
INT1 bei Wechsel von H zu L
X
X
X
X
1
1
X
X
INT1 bei Wechsel von L zu H



SREG
Bit
7
6
5
4
3
2
1
0


I
T
H
S
V
N
Z
C

Read/Write
R/W
R/W
R/W
R/W
R/W
R/W
R/W
R/W


1







Globalen Interrupt Freigeben (SREG.7=1)
Register SREG regelt die Funktionen des Interrupt's

TIMSK
Bit
7
6
5
4
3
2
1
0


OCIE2
TOIE2
TICIE1
OCIE1A
OCIE1B
TOIE1
-------
TOIE0

Read/Write
R/W
R/W
R/W
R/W
R/W
R/W
R
R/W




1





Timer Counter1 , Input Capture Interrupt Enable
Wenn dieses Bit eine 1 hat und der Interrupt Flag im Status Register gesetzt ist ( Globale Interrupt freigegeben) dann ist der Interrupt für Timer 1 Vergelichsregister freigegeben




1




Timer/Counter1,Output Compare A Match  Interrupt Enable





1



Timer/Counter1,Output Compare B Match  Interrupt Enable






1


Timer/Counter1,Overfow Interrupt Enable








1
Timer0 Overflow-Interrupt ein Beispiel (TIMSK.TOIE0=1)

22
Register TCCR1A Bit 7
Bit 6
Bit 5
Bit 4
Bit 3
Bit 2
Bit 1
Bit 0

COM1A1
COM1A0
COM1B1
COM1B0
FOC1A
FOC1B
WGM11
WGM10
Über BIT 6 + 7 wird der OC1A  Anschluß konfiguriert ob er mit dem Ausganspin verbunden wird oder nicht
(00= nicht verbunden) 01= OC1A verbunden.Beim Atmega8 ist Ausgang OC1A gleich Portb.1 und der muss als Ausgang deklariert werden, wenn diese Funktion genutzt wird.
0
0






Über Bit 4 + 5 wird der OC1B Anschluß konfiguriert ob er mit  dem Ausgangspin verbunden wird  wenn WGM13=0 ist(00=nicht verbunden) 01=verbunden


0
0




Der Ausgang OC1A ist beim hochzählen 0 bis Vergleichswert erreicht wird , dann wird Ausgang auf 1 gesetzt. 1
0






Resetiert OC1B wenn Vergleichswert erreicht wird

1
0




Der Ausgang OC1A ist beim hochzählen 1 bis Vergleichswert erreicht wird , dann wird Ausgang auf 0 gesetzt. 1
1









1
1




Timer 1 wird bei einem Gleichstand des Zählers mit dem Vergleichsregister ( Compare1A) den Status des Ausgang OC1A ändern. Wobei Compare 1 A nur ein 16 Bit Pseudoregister für zwei tatsächliche 8 Bit Register ( OCR1AH + OCR1AL) ist. 0
1






Bei Gleichstand des Zählers und des Vergleichsregister Status am Ausgangpin  OC1B ändern

0
1




COM1A1
(Compare Match Output Mode) diese Register steuern den Output Compare Funktionen damit wird entschieden ob der OCR Ausgang aktiviert ist oder nicht








Force Output Compare (FOC) Modus
Der Force Output Compare Modus ist in alle Timer/Counter integriert.
Der FOC Modus kann nur bei nicht-PWM Modi genutzt werden. Beim Schreiben einer
logischen 1 auf FOCx wird ein sofortiger Compare Match des Funktionsgenerators
erzwungen. Der OCx Ausgang wird auf den Status des COMx1 Bits gesetzt. Deshalb
bestimmt der Wert aus COMx1 den Wert des OCx Pins beim Vergleich.








TCNTx - Timer/Counter Register In diesem Register wird der aktuelle Zählwert gespeichert. 







OCRx[A | B][H | L] - Output Compare Register (A oder B und H oder L nur
Timer1)Wenn TCNTx den Wert dieses Registers erreicht, wird ein Output Compare
Interrupt Request ausgelöst.








FOCx (Force Output Compare) Beim Schreiben einer logischen 1 auf FOCx wird ein sofortiger compare match des Funktionsgenerators erzwungen.







Der Zählwert des Timers also die gezählten Takte werden im Zähl-Register TCNT0 abgelegt mit jedem Takt wird der Wert im Register CNT0 um eins erhöht.
Es gibt zwei Möglichkeiten den Timern zu sagen was sie machen sollen, zum einen funktioniert das mit Bascom Befehle, und zum anderen gibt es die Möglichkeit Registereinstellungen direkt zu ändern.








TIMSK - Timer/Counter Interrupt Mask RegisterZur Auswahl, welche Interrupts aktiviert werden sollen.








ICR1[H | L] - Input Capture Register 1 Hi oder Low (nur Timer1)Wird bei jedem Input Capture Event mit TCNT abgeglichen. Kann zur
Festlegung des Maximalwertes genutzt werden.








TIFR - Timer/Counter Interrupt Flag RegisterHier werden bestimmte Bits gesetzt, wenn ein Interrupt ausgeführt werden soll.








ASSR - Asynchronous Status Register (nur Timer2)Register zur Steuerung des asynchronen Modus








SFIOR - Special Function IO RegisterPSR2 Bit setzt den Prescaler des Timer2 zurück









22
Register TCCR1B Bit 7
Bit 6
Bit 5
Bit 4
Bit 3
Bit 2
Bit 1
Bit 0

ICNC1
ICES1

WGM13
WGM12
CS12
CS11
CS10
Bei 1 wird steigende Flanke registriert bei 0 die fallende
1






CSxx (Clock Select) konfiguriert den Prescaler
CS10,CS11,Cs12.
Mit den Bits 0-1-2 (CS10,CS11,CS12) wird  der Prescaler ( Vorteiler ) eingestellt also in wie weit der Tackt des Atmegas herunter geteilt soll , oder aber wenn der Takt von Außerhalb angelegt wird , an welcher Flanke der Takt registriert werden soll bei abfallender oder Steigender Flanke.(000 =Timer / Counter hält an)





0
0
0
Voller Takt wird genutzt




0
0
1
Takt durch 8




0
1
0
Takt durch 64




0
1
1
Takt durch 256




1
0
0
Takt durch 1024




1
0
1
Externer Takt an Pin T1 bei fallender Flanke




1
1
0
Externer Takt an Pin T1 bei steigender Flanke




1
1
1
Register (ICES1) wird festgelegt ob bei aufsteigender Flanke ( ICES1=1) oder fallender Flanke (ICES1=0 )der Eingangspin ausgewertet werden soll.
ICES1
 (Input Capture Edge Select) Bestimmt, welche Flanke ein Capture Ereignis auslöst. Bei 0 löst eine fallende Flanke ein Capture Ereignis aus, bei 1 eine steigende Flanke 1 = Triggert bei steigender Flanke 0 Triggert bei fallender Flanke1

1






ICNC1 (Input Capture Noice Canceler) Ist die Störunterdrückung (ICNC1=1) eingeschaltet, wird der Eingangspin viermal hintereinander abgetastet und muss auch 4 mal den gleichen Wert aufweisen also 4 mal 0 oder 4 mal 1 je nach welche Flanke er erkannt werden soll damit der Eingangsimpuls als solcher gewertet wird.
Bei ausgeschalteter Störunterdrückung (ICNC1=0) wird jede Flanke als Eingangsimpuls erkannt, so kann es beispielsweise bei nicht entprellten Signale zu Störungen durch mehrfach Erkennung kommen.
Störunterdrückung eingeschaltet 0 ist ausgeschaltet
1







nach oben










22
Register GICR
GICR = General Interrupt Control Register bei einigen Atmegas auch unter der Bezeichnung GIMSK zu finden ,
hier können die Interrupt's eingeschaltet und natürlich bei Bedarf auch ausgeschaltet werden.

Es ist auch möglich die Externen Interrupts über die Software intern zu steuern,
dazu muss der INT Pin als Ausgang deklariert sein,
dann kann man den Pin über die Software auf High setzen mit Portd2=1 damit ist der Interrupt Flag gesetzt und wenn man ihn denn auswerten möchte wird er freigegeben mit Enable Int0 und ausgewertet.

GICR
Bit 7
Bit 6
Bit 5
Bit 4
Bit 3
Bit 2
Bit 1
Bit 0

1
1
X
X
X
X
X
X
Interrupt 0 und 1 einschalten
0
1
X
X
X
X
X
X
Interrupt 0 einschalten
1
0
X
X
X
X
X
X
Interrupt 1 einschalten

Dieses Register ist zuständig um bei einem Interrupteingang fest zu legen
ob der Interrupteingang bei aufsteigender oder abfallender Flanke reagieren soll.



Möglichkeiten für GICR
GICR=&B01000000 INT0 einschalten
GICR=&B10000000 INT1 einschalten
GICR=&B11000000 INT0 und INT1 einschalten

666
S
Syntax
Beschreibung
Beispiel
Bemerkung

SFIOR SFIOR.PUD=1 schaltet PullUps aller Pins ab
SFIOR=SpecialFunctionIORegister
  SPC SPC()
oder
PRINT SPC(x)
oder
LCD SPC(x)
Wird zusammen mit der Print-Anweisung oder der Print-Methode verwendet um die Ausgabeposition festzulegen


Syntax








Dim S As String * 15 , Z As String * 15

Print "{" ; Spc(5) ; "}" '{ }

Lcd "{" ; Spc(5) ; "}" '{ }
Bemerkung:
X: Die Anzahl der Blanks, die ausgegeben werden sollen
Die Nutzung einer 0 für X ergibt einen String von 255 Bytes.Es findet keine Überprüfung für eine Länge der = Zuordnung statt.
Die SPC Anweisung kann zusammen mit der LCD Ausgabe genutzt werden.
Der Unterschied zur Space Anweisung ist der, daß Space eine Anzahl von Blancks zurückgibt, während SPC() nur für die Ausgabe genutzt werden kann.
Die Nutzung von Space() mit einer Ausgabe ist ebenfalls möglich.Dabei wird allerdings der temporäre Buffer genutzt.Die SPC() Anweisung nutzt den tämporären Buffer nicht.
666 Sound
Sound Pin,Duration , Pulse
Sound Portd.5 , 1004 , 83 
Mit dem Sound Befehl kann man ganz leicht einen Ton an jeden X beliebigen Ausgangspin erzeugen. Dazu gibt man den Ausgangspin ,und die beiden Parameter für die Tonlänge (Duration)und Tönhöhe (Pulse) ein.
Achtung der Sound ist abhängig von der verwendeten Taktfrequenz des Atmega's.
außerdem werden die beiden Parameter abhängig voneinander, es ist also zuerst der Parameter "Puls" und abhängig von dessen Ergebnis der Parameter " Duration " aus zu rechnen.
Die beiden Parameter müssen also wie folgt erst Berechnet werden
.
Beispiel für Atmega 8 mit 1Mhz Quarz
 Gewünschte Werte bei 1 Mhz Systemtakt
 Berechnung
Puls (Tonhöhe 1000 Hz)
Taktfrequenz/ (12 mal gewünschte Tonfrequenz)

1 Mhz / (12* gewünschte Tönhöhe)

1000000 / (12*1000)= 83
Duration (Tonlänge 1 Sekunde)
Tondauer mal Taktfrequenz geteilt durch 12 mal Tonfrequenz

1 * 1 Mhz/12*83

1*1000000 / (12 * 83)=1004
Damit erhalten wir einen Ton mit 1000Hz und einer Tönlänge von 1 Sekunde
Bei einer Frequenz von 1 MHz und pulse von 57 ergibt einer Tönhöhe von 1,4 KHz

Eine weitere Möglichkeit der Tonausgabe besteht darin mit Hilfe des Timer1 die benötigte Frequenz zu
erzeugen und diese dann an zwei mögliche dafür vorgesehene Ausgänge des Atmegas aus zu geben.
Die dafür vorgesehenen Ausgänge sind am Atmega 8 , Pin15 (OC1A) und Pin 16 ( OC1B)

folgende Anweisungen sind dafür nötig:

TCCR1A=&B01000000. ' Toggelt OC1A also Atmega Pin15
TCCR1B=&B00001010 ' Timer resetten bei Compare , Clock/8
Compare1A=200 ' Vergleichswert angeben


damit wird der  Vergleichswert 200  mit dem Wert verglichen der sich aus der Taktfrequenz geteilt durch 8 ergibt.

Die dann ausgegebene Frequenz berechnet sich bei einer Taktfrequenz von 1 000 000 Hz wie folgt:

((Taktfrequenz / Teilerfaktor) / 16 Bit) * Vergleichswert
=
(( 1 000 000 HZ / 8 )/ 65535)* 200

Ergebnis ca. 381 Hz
666 String Variable
Der Inhalt einer String Variablen kann nicht direkt für Rechen Operationen verwendet werden, es ist also erforderlich das eine Stringvariable erst in eine Variable einens anderen Typen umgewandelt werden muss.
Ist z.B. folgender String vorhanden

Dim  S as String * 10
Dim  T as Integer

S= 123456
so muss dieser String folgendermaßen gewandelt werden um damit zu rechnen.

T = Val(S)
Print T
1
T
Syntax
Beschreibung
Beispiel
Bemerkung

Timer
Enable Timer1 startet Timer 0

Beispiel für Timer 0
wo bei folgende Vorgabewerte für folgenden Takt
Teilerfaktor
Timervorgabewert
Taktgeschwindigkeit ca.
Tccr0 = 00000001 Timer0=2
1,58 Khz
Tccr0 = 00000001 Timer0=50 1,83 Khz
Tccr0 = 00000001 Timer0=100 2,27 Khz
Tccr0 = 00000001 Timer0=220 3,90 Khz
Tccr0 = 00000001 Timer0=244 4.01 Khz

$regfile "m8def.dat Definiert den Atmega als Atmega 8
$crystal = 1000000 Gibt die Quarzfrequenz an in Herz
On Timer0 Timer_null Routine die bei Timerüberlauf ausgeführt wird
Ddra.7 = 1 
Port A.7 als Ausgang setzen
Ddra.6 = 1 Port A.6 als Ausgang setzen
Tccr0 = 00000101
Teilerfaktor setzen ( teilt durch 1024)
Timsk.toie0 = 1
Interrupt für Timer0 einschalten
Sreg.7 = 1 Interrupts Gloabal setzen
Do Anfang Programmschleife
Waitms 500 
Pause
Toggle Porta.6 Zustand einer Led wechseln
Waitms 500 Pause
Loop
Schleifenende
Timer_null:
Timer Routine
Timer0=2
Vorgabewert
Toggle Porta.7
Ausgangspin A.7 wechseln ( Led)
Return
Routine beenden
  Toggle Toggle Portb.0 Invertiert den Zustand 
Dim a as word


A = A + 1
If A = 60000 Then Toggle Portb.0
Wechselt den Zustand des Ausgangs jeweils beim Durchlauf von 0 auf 1 oder von 1 auf 0






11 V Syntax Beschreibung Beispiel Bemerkung


      
   22
Val
B= Val(a)
Wandelt eine Stringvariable in eine Zahl um
Dim a as String*10
Dim B as byte

A="42"
B=Val(a)
Print B
String kann Buchstaben oder Zeichen enthalten
Variable     
   
Variablen-Namen
In BASCOM-Basic-Variablen-Namen wird nicht zwischen Groß- und Kleinschreibung unterschieden. Außerdem ist der Unterstrich _ zugelassen. Dieser wird oft
benutzt, um lange Variablen-Namen lesbarer zu machen. Schlüsselwörter wie If,
While usw. dürfen als Variablen-Namen nicht verwendet werden. Globale Variablen und Funktionen dürfen nicht denselben Namen besitzen. Außerdem
können Funktionen innerhalb des Bezugsrahmens einer lokalen Variablen nicht benutzt werden, wenn sie denselben Namen wie die Variablen besitzen.
Bit 0 und 1    Benötigt 1 Bit an Speicherplatz
Byte 8 Bit = 256 Dezimal    Benötigt 1 Byte an Speicherplatz
Word 0-65535   Benötigt 2 Byte an Speicherplatz
Integer -32768 bis 32767    Benötigt 2 Byte an Speicherplatz
 Long
-2147483648 bis 2147483647
 
 Benötigt 4 Byte an Speicherplatz
 Single  1,5*10 hoch minus 45
 
 Benötigt 4 Byte an Speicherplatz
Double

 Benötigt 8 Byte an Speicherplatz
String * n
 1 bis 153 Zeichen
 Benötigt min. 2 Byte bis max. 254 Byte
 Variable2=Variable1  
Kopiert die Variable 1 in die Variable2
   
Single Variable kann man formatiert darstellen mit folgender Zeile:
'Lcd "U_min=" ; Fusing(spannung_min , "#.###")
Pseudo Variable:
Wenn 16 Bit Daten oder Adressen in Byte Variable abgespeicher werden soll oder muss
kann man soegannnte Pseudo Variable erzeugen und so 16 Bit Daten in 2 Stück  Byte Variable Speicher ablegen

Dim Volt As Single At $95
Dim Volt_low As Byte At $95 Overlay
Dim Volt_high As Byte At $96 Overlay
Damit wird beispielsweise eine 16 Bit Variable ab Adresse 95 abgelegt , und belegt so Adresse 95 und 96.
Oder auch umgekehrt kann ich aus beiden 8 Byte Overlay Variable eine 16 Bit Variable erzeugen
Wird z.B. benötigt um Daten im Byte orientierten EEprom auch eine 2 Byte lange Variable abzulegen.
22 Version
Version (1)
Zeigt das Datum und die Uhrzeit der letzten Compilierung an:
z. B Print Version (1)
11
W


Syntax
Beschreibung
Beispiel
Bemerkung
  Waitkey()

Var=Waitkey()

Var=Waitkey (#channel)

 

DIM A as Byte

A= Waitkey() ' Wartet auf ein Zeichen

Print A

var: Eine Variable,die den ASCII Wert vom Seriellen Buffer empfangen hat.Kann eine nummerische bzw. String Variable sein.
#channel: Der Kanal,der für die Software UART genutzt wird.
22 Waitkey Dim My_byte As Byte
Dim My_string As String * 1
Do
My_byte = Waitkey()
Print "Empfangen: " ; My_byte 'Gibt den ASCII-Code des Zeichens zurück
My_string = Waitkey()
Print "Empfangen: " ; My_string 'Gibt den Text zurück
Loop
End
 Dieser Befehl wartet bis ein Zeichen über die UART zum µC übertragen wurde und gibt dieses zurück. WAITKEY blockiert so lange bis ein Zeichen übermittelt wurde. Wird eine BYTE-Variable damit befüllt, dann steht in der BYTE-Variable der ASCII-Code des übermittelten Zeichens. Wird eine STRING-Variable befüllt, dann weiß Bascom, dass der übermittelte ASCII-CODE ein Textzeichen ist und gibt dieses bei PRINT als solches zurück. Beispiel:
22 Wait X Wartet eine gewissen Anzahl von Sekunden, wobei X durch die Anzahl der Sekunden ersetzt wird ( 0-65535)
22 Waitms Waitms  50 Pause von 50 Millisekunden -

"Waitms" lässt den Controller die angegebene Zahl an Millisekunden warten. In unserem Beispiel 50 = 0,05s.

(0-65535)
Fügt eine Pause ein
22  While ...Wend 

While Bedingung

...Anweisung

Wen

Wenn die Bedingung hinter "While" richtig ist dann springe in die Schleife sonst überspringe die Schleife. Schleifen können ineinander verschachtelt sein.

Schleife wird erst ausgeführt wenn die Bedingung richtig ist

 

While A< 10 ( Wenn A kleiner als 10 dann springe in die Schleife )

Print A ( Varable A ausgeben )

Incr A ( Variable A um 1 erhöhen )

Wend ( zurück zu While
 While Pind.4 <> 1     
 Gosub Anzeige
Wend
 Beispiel:

Ledtimer = Ledtimer + 1
While Ledtimer > 10
Portc.1 = 1
Waitms 10
Portc.1 = 0
Ledtimer = 0
Wend

Die Ledtimer Variable wird bei jedem Durchlauf um den Wert von 1 erhöht
Wen die Variable den Wert größer als 10 annimmt wird in die Schleife gesprungen
un diese dann abgearbeitet.
Die in der Schleife befindlichen Pausenzeiten
werden somit nur bei jeden 10. Durchgang eine Verzögerung der Programmschleife verursachen.





 
22          
Hier einige Mathematischen Beispiele
AF= 13.233 * rF * ((10 ^ ((7.5 * T) / (237 + T))) / (273.16 + T))

Aktualisierung 18.12.2022
Copyright by Ms 2009