Sie sind vermutlich noch nicht im Forum angemeldet - Klicken Sie hier um sich kostenlos anzumelden Impressum 
Sie können sich hier anmelden
Dieses Thema hat 6 Antworten
und wurde 3.729 mal aufgerufen
 Bascom - Unser Einsteigerkurs
diezel Offline



Beiträge: 709

29.01.2013 21:00
[BEK05] If - Then - Else Zitat · Antworten

Hallo,

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 Einstieg
Fü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


diezel Offline



Beiträge: 709

29.01.2013 21:54
#2 RE: [BEK05] If - Then - Else Zitat · Antworten

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.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
 
$regfile = "m8def.dat"                                      'Mikrocontroller ist Atmega 8
$crystal = 8000000 'Arbeitsfrequenz 8 MHz
$hwstack = 40 'Hardware-Stack
$swstack = 32 'Software-Stack
$framesize = 60 'Frame
$baud = 19200 'serielle Übertragungsgeschwindigkeit
 
'*** 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

diezel Offline



Beiträge: 709

29.01.2013 22:14
#3 RE: [BEK05] If - Then - Else Zitat · Antworten

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.

Mögliche Operanden sind:
= ist gleich
< kleiner
> größer
<= kleiner gleich
>= größer gleich

hierzu gleich noch das nächste Beispiel...

-------------------------------------------------------------------------------------------
hier mein aktueller TinyKatalog


diezel Offline



Beiträge: 709

29.01.2013 22:34
#4 RE: [BEK05] If - Then - Else Zitat · Antworten

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
 
$regfile = "m8def.dat"                                      'Mikrocontroller ist Atmega 8
$crystal = 8000000 'Arbeitsfrequenz 8 MHz
$hwstack = 40 'Hardware-Stack
$swstack = 32 'Software-Stack
$framesize = 60 'Frame
$baud = 19200 'serielle Übertragungsgeschwindigkeit
 
'*** 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


diezel Offline



Beiträge: 709

29.01.2013 22:51
#5 RE: [BEK05] If - Then - Else Zitat · Antworten

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.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
 
$regfile = "m8adef.dat"                                     'Mikrocontroller ist Atmega 8
$crystal = 8000000 'Arbeitsfrequenz 8 MHz
$hwstack = 40 'Hardware-Stack
$swstack = 32 'Software-Stack
$framesize = 60 'Frame
$baud = 19200 'serielle Übertragungsgeschwindigkeit
 
'*** 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

Scotch Offline




Beiträge: 415

31.01.2013 23:48
#6 RE: [BEK05] If - Then - Else Zitat · Antworten

Hallo Gerhard,

Auch diese Beisiele finde ich sehr gut erklärt.
Die einfachen Case abfragen kannte ich schon.
Dies beiden sind neu für mich.

1
2
 
      Case 3 To 5 : Print "3-5"
Case Is >= 10 : Print ">= 10"
 


Finde ich aber sehr interessant das so etwas auch möglich ist.

Gruß Ingo

------------------------------------------

Meine Webseite


diezel Offline



Beiträge: 709

31.01.2013 23:55
#7 RE: [BEK05] If - Then - Else Zitat · Antworten

Hallo Ingo,

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


 Sprung  

disconnected Mikromodell-Chat Mitglieder Online 9
Xobor Xobor Community Software
Datenschutz