Manche Sätze, oder hinter manche Begriffe sind Apostrophen zufinden. Weil das Board irgendwie auf die Befehle reagiert und einen Fehler bringt...
Verkürzter Befehl für Deklaration der I/Os-Pins (Eingänge/Ausgänge)
Im Tutorial 6. Grundstruktur und ein paar Grundbefehle (Basic-Sprache) wurde über das Deklarieren der I/Os-Pins (Eingänge/Ausgänge) geschrieben.
Da wurde jeder einzelner I/O-Pin mit dem Befehl "Config PinX.X = Output" deklariert.
Möchte man 10 I/O-Pins deklarieren, so müsste man 10 mal den oberigen Befehl eingeben.
Es geht auch einfacher und zwar mit einem Befehl, mit dem man gleich eine Pinreihe (z.B:PC0-PC5, PD0-PD7,...) deklarieren kann:
DdrX = &BYYYYYY <- X = für den Buchstaben der Pinreihe und Y die dazugehörige Nummer zum Buchstaben der Pinreihe. (Das erste Y von Links steht für 0, das zweite Y von Links für 1,... ). Wenn das Y eine 1 ist, wird der Pin als Ausgang deklariert und bei 0 als Eingang.
Hier Klicken für Pinbelegung des Atmega8.
Hier ein Beispiel mit der Pinreihe "PC0-PC5":
IF-Funktion
"IF" heißt auf Deutsch übersetzt "Wenn". Also eine Wenn-Funktion.
Wenn eine angegebene Bedingung erfüllt wird, soll er folgendes ausführen, ansonsten folgendes ausführen.
Der Grundaufbau der 'IF-Funktion:
Code: Alles auswählen
IF (Bedingung) Then
Else
End if
Code: Alles auswählen
If Taster1 = 1 Then 'Wenn am Taster1 High-Pegel liegt, sprich Taster1 gedrückt, dann die Befehle unten ausführen
Led1 = 1
Led2 = 1
Waitms 500
Led1 = 0
Led2 = 0
End If 'Hier endet die IF-Funktion
Wenn am Taster1 High-Pegel anliegt bzw. Taster1 gedrückt wird, dann werden Led1 und Led2 für 0,5 Sek. gemeinsam leuchten.
Wenn wird unseren Code vom vorherigen Tut ergänzen, sprich dem Taster1 eine Funktion zuordnen, sieht unser gesamter Code folgender Maßen aus
(jedoch gibt es ein Problem!!!):
Code: Alles auswählen
$regfile = "m8def.dat"
$crystal = 1000000
Config Pind.5 = Output
Config Pind.6 = Output
Config Pind.2 = Input
Taster1 Alias Pind.2
Led1 Alias Portd.5
Led2 Alias Portd.6
Do
If Taster1 = 1 Then
Led1 = 1
Led2 = 1
Waitms 500
Led1 = 0
Led2 = 0
End If
Led1 = 1
Waitms 1000
Led1 = 0
Waitms 1000
Led2 = 1
Waitms 1000
Led2 = 0
Waitms 1000
Loop'
'Überträgt man den oberen Code zum Microntroller leuchten die Leds abwechseln hin und her, wie mit dem Code vom vorherigen Tut.'
Nun wenn man den Taster1 drückt, reagiert er nicht immer darauf.
'Der Grund ist (der Code zum Grund befindet sich unten):'
Er arbeit die Befehle im Hauptprogramm (innerhalb Do & Loop') ab und das endlos und wenn er im roten markierten ist Z.B.: in der 1 Sek. Pause und wir drücken auf Taster1, dann reagiert er nicht darauf.
Weil er nicht gerade die 'IF-Funktion durchführt (grün markiert).
'Sprich wir müssen im richtigen Moment den Taster1 drücken damit er reagiert und zwei Leds einmal gleichzeitig blinken lässt. Oder man hält den Taster1 gedrückt, bis er wieder zur IF-Funktion angelangt.:
Do
If Taster1 = 1 Then
Led1 = 1
Led2 = 1
Waitms 500
Led1 = 0
Led2 = 0
End If
Led1 = 1
Waitms 1000
Led1 = 0
Waitms 1000
Led2 = 1
Waitms 1000
Led2 = 0
Waitms 1000
Loop'
'Nun gibt es zwei Lösungsmöglichkeiten:'
'1. Taster mit Interrupt'
'2. Timer der in Intervall ein Interrupt auslöst, welches dann ein Unterprogramm aufruft mit der If-Funktion'
'Fangen wir mit 1. Taster mit Interrupt an'
Interrupt'
Auf Deutsch übersetzt bedeutet Interrupt' "Unterbrechung".
Der Microcontroller hat verschiedene 'Interrupt-Quellen. Z.B.: Durch Auslösen eines Tasters, Timerüberlauf, ...
Der Atmega8 hat zwei I/O-Pins, die man als Interrupt' einsetzen kann. Das wäre PD2 (INT0) und PD3 (INT1).
Siehe Pinbelegung des Atmega8.
'Das heißt sobald ein Interrupt ausgelöst wird, wird das Hauptprogramm sofort unterbrochen und das ausgewählte Unterprogramm wird ausgeführt. Nach dem das Unterprogramm durchgelaufen ist, kehrt es an der Stelle des Hauptprogramms zurück, an der es vorhin unterbrochen worden ist.
'Hierzu müssen wir folgendes im Code ergänzen:
Code: Alles auswählen
Config Int0 = Rising 'Hier konfigurieren unseren Int0 (PD2), Rising bedeutet wenn es ansteigt, sprich von Low auf High
Enable Interrupts 'Einschalten der Interrupts
Enable Int0 'Einschalten des Int0 (PD2)
On Int0 Unterprogramm 'Hier wird das Unterprogramm angegeben, wenn es Interrupt stattfindet und es wird zum "Unterprogramm" geleitet, den Namen kann natürlich selber frei bestimmen
'Und ein Unterprogramm (muss unter dem Hauptprogramm bzw. "Loop" eingegeben werden):'
Code: Alles auswählen
Unterprogramm: 'Name des Unterprogramms'
Led1 = 1
Led2 = 1
Waitms 500
Led1 = 0
Led2 = 0
Return 'zurück zu der Stelle des Hauptprogramms wo es unterbrochen wurden ist.'
Code: Alles auswählen
$regfile = "m8def.dat"
$crystal = 1000000
Config Pind.5 = Output
Config Pind.6 = Output
Config Pind.2 = Input
Config Int0 = Rising
Enable Interrupts 'einschalten der Interrupts
Enable Int0
On Int0 Unterprogramm
Taster1 Alias Pind.2
Led1 Alias Portd.5
Led2 Alias Portd.6
Do
Led1 = 1
Waitms 1000
Led1 = 0
Waitms 1000
Led2 = 1
Waitms 1000
Led2 = 0
Waitms 1000
Loop'
Unterprogramm:
Led1 = 1
Led2 = 1
Waitms 500
Led1 = 0
Led2 = 0
Return
'2. Die zweite Lösung findet Ihr im nächsten Thema. Weil ich ständig Fehlermeldungen vom Board zurückkriege und fast alles in Apostroph schreiben muss und es immer schlimmer wird...'



