erstellt  10.05.2019
Kleine Programmier Kniffe
Im Allgemeinen lässt man während eine Programmschleife läuft eine Led blinken, dies Signalisiert zum einen ob meine Schaltung mit Spannung versorgt ist
beziehungsweise ob sie eingeschaltet ist, anderseits erkennt man an dem blinken ob meine Programmschleife läuft, oder wenn die Led dauerhaft aus oder an bleibt
ob mein Programm hängen geblieben ist.
Die einfachste Form eine Led zum blinken zu bringen besteht darin sie "An" zu schalten, dann sie eine gewisse Zeit an zu lassen um sie dann wieder "Aus" zu schalten.
Beispiel 1
do
Schleifenanfang
Portd.1=1
Led einschalten
waitms 500
Einschaltdauer festlegen
Portd.1=0
Led aus schalten
waitms 500
Zeit in der die Led aus ist
loop

 
Diese Methode funktioniert ganz gut, hat aber den Nachteil das die Programmschleife dadurch stark gebremst wird.
Insgesamt kann sich dadurch der Durchlauf einer Programmschleife  erheblich verlängern .
Wenn nur eine Led blinken soll ist es in Ordnung, wenn das Programm aber auch andere Funktionen ausüben soll kommen wir schnell an die Grenzen.
Wenn zum Beispiel innerhalb des Programm abgefragt werden soll ob eine Taste gedrückt ist, muss man unter umständen die Taste so lange festhalten
bis ein Schleifendurchgang erfolgt ist damit dieses Ereignis vom Programm erfasst werden kann.

Etwas schneller läuft die Schleife bei folgenden Programm:
Beispiel 2
do
Schleifenanfang
Toggle Portd.1=1
Zustand der Led wechseln
waitms 500
Einschaltdauer festlegen
loop


Hier beträgt die Laufzeit des Blinken nur noch eine halbe Sekunde.

Und es geht noch viel  schneller.
Hier wird erst nach jedem hundertsten Durchlauf der Schleife der Zustand der Led gewechselt.

Beispiel 3
dim E as Byte
Variable für eine Schleife
do
Schleifenanfang


E=E+1
Variablenwert in jeder Schleife um, eins erhöhen
if E > 100 then Toggle Portd.1
Wenn die Schliefe den Wert von 100 erreicht den Zustand der Led wechseln
if E > 100 then E=0
Variablenwert wieder auf Null setzen
loop

 
Tastengeschwindigkeit
Oft wird über eine Taste einen Wert über mehrere Decaden  eingegeben, das kann je nach Eingabewert dazu führen das die entsprechende Taste relativ
lange gedrückt werden muss.

Um diese Eingabe nicht so langwierig zu gestalten, lässt man das "Auf" oder "Ab" zählen  über mehrer Geschwindigkeiten laufen.
So das man schnell hohe Differenzen  eingeben kann, aber auch die Werte bei kleine Abstände noch differenzieren kann.
Dazu lässt man die Tastenabfrage im Beispiel von zwei Tasten ( auf und ab)in einer separaten Routine laufen .
do
Schleifenanfang
If Pind.1 = 0 Then D = D + 1 Taste "Auf" addiert bei jeden Schleifendurchgang  den Wert von 1 zur Variable D
If Pind.3 = 0 Then D = D -1 Taste "Ab" subtrahiert bei jeden Schleifendurchgang  den Wert von 1 zur Variable D
If Pind.1 = 0 Or Pind.3 = 0 Then Dd = Dd + 1 Wenn eine der Beiden Tasten gedrückt wird , wird bei jedern Schleifendurchgang eine zusätzliche Variable hochgezählt
If Pind.1 = 1 And Pind.3 = 1 Then Dd = 0 Wenn keine der Tasten gedrückt ist , wird die Variable Dd wieder auf Null gesetzt
If Dd < 10 Then Ddd = 500 Wenn Variable DD kleiner als 10 dann beleg die Pausenvariable DDD mit dem Wert 500
If Dd > 10 Then Ddd = 100 Wenn Variable DD größer  als 10 dann beleg die Pausenvariable DDD mit dem Wert 100
If Dd > 50 Then Ddd = 50 Wenn Variable DD größer  als 50 dann beleg die Pausenvariable DDD mit dem Wert 50
If Dd > 60 Then Ddd = 1 Wenn Variable DD größer als 60 dann beleg die Pausenvariable DDD mit dem Wert 1
Waitms Ddd Pausenzeit wird deer Variablen DDD entnommen
If Pind.1 = 0 And Pind.3 = 0 Then Exit Do
Durch drücken beider Tasten gleichzeitig kann die Schleife wieder verlassen werden
Loop Schleifenende

Taktgeschwindigkeit anzeigen
Angenommen der Prozessortakt beträgt  16 MHz, so kann man den internen Timer benutzen um sich die Taktgeschwindigkeit anzeigen zu lassen.
Benutzt man beispielsweise dazu beim Atmega 8 oder auch andere Typen , den Timer 1, der mit einer Auflösung von 16 Bit arbeitet so kommen wir bei 16 Bit auf
65535 Stufen, also nach jeweils 65535 Takte wird ein Überlauf erreicht.
Man kommt damit auf 244,14 Überläufe pro Sekunde.
Multipliziert man diese Überläufe mit der Anzahl der Timerschritte kommen wir auf  244,14 mal 65535 = ca 16 000 000 Hz.
Diese Berechnung kann man sich nun anzeigen lassen und hat damit den aktuellen Prozessortakt.


Aktualisiert 02.01.2023