heute will ich euch mal zeigen, wie man auf bestimmte "Ereignisse" im Programm reagieren kann. Ereignisse für den µC sind eigentlich immer die Zustände an den Pins oder der Inhalt einer Variablen. Baut bitte wieder das STK auf und stellt alle Verbindungen her. Wie beim letzten Mal, verbindet bitte den Sockel mit der Beschriftung "LEDS" mit dem "PORTB" und den "SWITCHES" mit "PORTD" mit den Flachbandkabeln.
Bei Verwendung von Tastern ganz wichtig ist das Thema PullUps. Bin grad faul und zitier mich grad mal schnell selbst:
Zitat von diezel im Beitrag RE: [BEK03] der EinstiegFür den µC ist es wichtig, klare Verhältnisse vorzufinden. Stellt euch mal vor, er soll auf das Verändern eines Zustandes eines Pins reagieren, aber dieser Zustand ändert sich laufend. Das gibt nur Probleme. Um dies zu vermeiden werden große Widerstände gegen Plus geschaltet, die den Pin immer gegen VCC ziehen. Da der Widerstand aber recht groß ist, kann der Zustand des Pins leicht geändert werden, z.B. in dem ihn ein Schalter gegen GND zieht, der Strom, der durch den Widerstand nach VCC fließt, spielt dann keine Rolle mehr
Diese Pullups kann man wie schon gezeigt per Portregister intern im Atmega einschalten, oder man macht es extern, wie auf dem STK500 gemacht: switches.png - Bild entfernt (keine Rechte) Das heißt für uns, daß der µC an seinem Eingang ein logisches High-Signal sieht, wenn der Taster NICHT gedrückt ist. Wird der Taster gedrückt, liegt ein Low-Signal an. Der µC schreibt uns diese Information dann in das entsprechende Register: PINx.y Beispiel an unserem Aufbau: wir beobachten den Taster, der an PinD.3 angeschlossen ist: Taster nicht gedrückt: PinD.3 = 1 Taster gedrückt: PinD.3 = 0 Also: Verdrehte Logik beachten!
Bei den LEDs gibt´s natürlich auch wieder was zu beachten. Lasten werden am µC bevorzugt über GND geschaltet. Damit will man die Versorgungsspannung des µC möglichst nicht mit externen Lasten beeinträchtigen. Was ich meine seht ihr am folgenden Bild: led.png - Bild entfernt (keine Rechte) Quelle des Bildes: www.ne555.at Heißt für uns: Ist ein Ausgang auf High geschaltet, fließt kein Strom durch die LED, sie bleibt dunkel. Ist der Ausgang Low, kann der Strom durch den Atmega nach GND abfließen, sie leuchtet. Beispiel: die LED an PortB.3: PortB.3 = 1 --> LED leuchtet nicht PortB.3 = 0 --> LED leuchtet Also auch hier: Verdrehte Logik beachten!
Das Bild der Schalter hab ich wieder aus der Hilfe des AVR-Studios. Schadet nicht wenn ihr da mal durchblättert!
------------------------------------------------------------------------------------------- hier mein aktueller TinyKatalog
so, jetzt aber mal ein Beispiel-Programm. Setzt dazu die Fusebits so, daß der Prozessor mit internen 8MHz läuft. Setzt dazu daß Fusebit "KLA987" auf "010100: Int RC. Osc 8 MHz" Dann kopiert euch dieses Programm in Bascom rein, Kompiliert und Programmiert es in den µC. Dann sucht Euch den Taster 3 und drückt mal fleißig.
'*** Ein/Ausgänge deklarieren ************************************************** Config Portb.3 = Output 'PB.3 als Ausgang Config Pind.3 = Input 'PD.3 als Eingang
'*** Hauptschleife ************************************************************* Do 'Beginn Hauptschleife If Pind.3 = 0 Then 'wenn Taster an PinD.3 gedrückt Portb.3 = 0 'LED an PortB.3 Ein Print "Ein" Else 'wenn nicht Portb.3 = 1 'LED Aus Print "Aus" End If 'Ende von If-Then-Abfrage Loop 'Ende Hauptschleife
End
Und bevor irgendjemand zu nörgeln anfängt: - das Thema Taster entprellen hab ich bewußt ignoriert, wird später mal erklärt - ich weiß, daß hier das If-Then völlig overkill ist, aber an einfachen Beispielen erklärt sich es eben einfacher
------------------------------------------------------------------------------------------- hier mein aktueller TinyKatalog
Dateianlage:
Aufgrund eingeschränkter Benutzerrechte werden nur die Namen der Dateianhänge angezeigt Jetzt anmelden!
BEK05-1.txt
der Anfang des Programm dürfte eigentlich für Euch schon mal klar sein. Interessant wirds in der Do-Loop-Schleife, dürfte aber durch die Kommentare schon klar werden. Beachtet bitte die Schreibweise, die Einrückungen erleichtern die lesbarkeit, sind aber kein muß. Was sein muß, ist die Aufteilung in die einzelnen Zeilen, sobald mehrere Befehle in einem Zweig auftreten. Würden wir die Prints weglassen, könnte das Ganze in einer Zeile geschrieben werden, da jeweils nur ein Befehl bearbeitet werden muß:
1
If Pind.3 = 0 Then Portb.3 = 0 Else Portb.3 = 1
über die lesbarkeit läßt sich hier aber wieder streiten.
'*** Variablen definieren ****************************************************** Dim Zaehler As Byte
'*** Hauptschleife ************************************************************* Do 'Beginn Hauptschleife Incr Zaehler 'Zähler plus 1
If Zaehler = 1 Then 'wenn Zähler = 1 Print "Zaehler ist jetzt " ; Zaehler ; "." Elseif Zaehler = 2 Then 'wenn Zähler = 1 Print "Zaehler ist jetzt groesser geworden, Zaehler = " ; Zaehler ; "." Elseif Zaehler > 2 Then 'wenn Zähler größer als 2 Print "Zaehler ist jetzt groesser als 2, naemlich " ; Zaehler ; "." End If
If Zaehler = 6 Then Zaehler = 0 'wenn Zähler = 6 dann Zähler = 0
Wait 1 Loop 'Ende Hauptschleife
End
ich glaub große Worte brauch ich hierüber nicht mehr zu verlieren. Funktion dürfte klar sein. Achtet auf die Schreibweise. Einzeilig ist sowas nicht mehr möglich. Beachtet auch, daß es in der ersten Zeile "if" heißen muß, alle weiteren dann "elseif". Interessant zu wissen ist, daß dieses Konstrukt nur so weit abgearbeitet wird, bis eine Bedingung erfüllt ist. Wäre eine weitere Bedingung erfüllt, wird diese nicht mehr bearbeitet! Nach Abarbeitung der jeweiligen Befehle geht´s nach dem End if weiter.
Gruß Gerhard
------------------------------------------------------------------------------------------- hier mein aktueller TinyKatalog
einen hab ich noch, paßt hier recht gut rein: SELECT-CASE Ist eine neue Art der If-Then-Abfrage, macht eigentlich genau das gleiche. Ist reine geschmackssache, was ihr verwendet bleibt euch überlassen. Achtet aber wieder auf die genaue Schreibweise, sonst meckert Bascom.
'*** Variablen definieren ****************************************************** Dim Zaehler As Byte
'*** Hauptschleife ************************************************************* Do 'Beginn Hauptschleife Incr Zaehler 'Zähler plus 1
Select Case Zaehler Case 1 : Print "1" Case 2 : Print "2" Case 3 To 5 : Print "3-5" Case Is >= 10 : Print ">= 10" Case Else : Print "nicht abgefragt" End Select
If Zaehler = 15 Then Zaehler = 0 'wenn Zähler = 6 dann Zähler = 0
Wait 1 Loop 'Ende Hauptschleife
End
Gruß Gerhard
------------------------------------------------------------------------------------------- hier mein aktueller TinyKatalog
Dateianlage:
Aufgrund eingeschränkter Benutzerrechte werden nur die Namen der Dateianhänge angezeigt Jetzt anmelden!
BEK05-3.txt
gerade dieses Beispiel hab ich direkt aus der Bascom-Hilfe kopiert. Generell find ich diese Hilfe super umgesetzt, ist immer mal wieder ein Blick wert.
Gruß Gerhard
------------------------------------------------------------------------------------------- hier mein aktueller TinyKatalog