Generell:
Gewöhnt euch eine strukturierte Programmierung an!
Dann sind schleinfen und Bedingungen übersichtlicher dargestellt.
Also alles was innerhalb einer Schleife steht wird eingerückt.
Schleifenanfang und Schleifenende sind dann besser ersichtlich.
z.B. So:
Code:
Do
PORTC.0 = 0
Waitms 100
PORTC.0 = 1
Waitms 100
PORTC.1 = 0
Waitms 10
PORTC.1 = 1
Waitms 10
Loop
End
Der Loop befehl bewirkt eine Rücksprung zu Do Zeile (ohne abbruchbedingung)
Willst Du eine Schleife haben, welche nach einer geprüften Bedingung beendet wird (der Rest nach der Schleife wir abgearbeitet) gibt es sog. While/Wend Do/until. Diese Schleifen werden zu anfang oder zu ende geprüft, wenn die Bedingung zutrifft wird die Schelife nicht mehr durchlaufen.
Anfangsgeprüfte Schelifen werden ggf. garnicht und Endegeprüfte Schelifen werden mindestens einmal durchlaufen.
Code:
$regfile "m32def.dat"
$crystal = 16000000 ' Takt Frequenz des AVR (ggf. Anpassen)
Dim X As Byte
' ----
X = 0
Print "Wert = " ; X
Rem Aufwärtszählen bis X = 10 ist
Do
X = X + 1 ' um 1 erhöhen
Loop Until X >= 10 ' Ende geprüfte Schleife
Print "Wert = " ; X
Rem Aufwärtszählen in 10er Schritten bis X = 100 ist
While X < 100 ' Anfang geprüfte Schleife
X = X + 10 ' um 10 ehöhen
Wend
Print "Wert = " ; X
End ' end program
Es gibt auch Befehle, mit welche die Schleifen frühzeitig abgebrochen werden können: EXIT DO / EXIT WHILE.
Für Dein Problem hab ich mal (astrakt) ein Beispiel:
Code:
$regfile "m32def.dat"
$crystal = 16000000 ' Takt Frequenz des AVR (ggf. Anpassen)
' blablablabla
' blablablabla
Sensor_front Alias Pinb.0 ' Hier die richtigen Port-Pins definieren
Sensor_rear Alias Pinb.1 ' "PIN" fragt einen "EINGANG" ab
Motor_left_direction Alias Portc.0 ' "PORT" setzt/löscht einen I/O "AUSGANG"
Motor_right_direction Alias Portc.1
Moror_left_drive Alias Portc.2
Moror_right_drive Alias Portc.3
Hupe Alias Portc.4
Declare Sub Wenden() ' Deklarieren des Subroutine
Declare Sub Anhalten() ' Deklarieren des Subroutine
Declare Sub Fahren() ' Deklarieren des Subroutine
Declare Sub Motoren_toggle() ' Deklarieren des Subroutine
Declare Sub Hupen()
Config Portb = Input ' Ports definieren
Config Portc = Output ' Ports definieren
Dim Hupe_an As Bit ' Variable ob gehupt werden soll
' Definieren der Ausgänge
Set Motor_left_direction ' Motor 1 vorwärts umschalten
Set Motor_right_direction ' Motor 2 vorwärts umschalten
Reset Hupe_an ' Nicht hupen
Call Fahren() ' Los gehts
Do ' Endlosschleife damit das Programm immer wieder durchlaufen wird
' ich berücksichtigen nur den einen Sensor
If Sensor_front = 1 Then ' Wenn der Sensor-Eingang HI dann
Call Anhalten()
Call Hupen()
Call Wenden() ' Unterprogramm Wenden ausführen
End If
Loop
End 'end program
' ==============================================================================
Sub Wenden()
' Routine zum Wenden / Richtung ändern hier Programmieren
' Die Zeiten (Waitms) habe ich willkürlich gewählt
Print "Wenden" ' Just for Info
Call Anhalten() ' Motoren Stopp
Waitms 1000 ' 1 Sekunde warten
Reset Motor_left_direction ' Richtung für Motor 1 rückwärts umschalten
Reset Motor_right_direction ' Richtung für Motor 2 rückwärts umschalten
Call Fahren() ' Fahren
Waitms 250 ' 250 ms (fahren)
Call Anhalten() ' anhalten
Set Motor_left_direction ' Motor 1 vorwärts umschalten
Call Fahren() ' Fahren
Waitms 250 ' 250 ms
Call Anhalten() ' anhalten
Set Motor_right_direction ' Motor 2 vorwärts umschalten
Call Fahren() ' fahren
Waitms 250 ' 250 ms
Call Anhalten() ' anhalten
Waitms 250 ' 250 ms
Call Fahren() ' fahren
End Sub
' ==============================================================================
Sub Anhalten()
' Routine zum anhalten (Motoren Stopp)
Print "Stopp" ' Just for Info
Reset Moror_left_drive
Reset Moror_right_drive
End Sub
' ==============================================================================
Sub Fahren()
' Routine zum fahren (Motoren Fahren)
Print "Fahren" ' Just for Info
Set Moror_left_drive
Set Moror_right_drive
End Sub
' ==============================================================================
Sub Motoren_toggle()
' Routine zum umschlten der Motoren
' nur als Beispiel (verwende ich hier nicht)
Toggle Moror_left_drive ' (ist der Pin Hi dann eben Low)
Toggle Moror_right_drive ' (also umschalten des Staus)
End Sub
' ==============================================================================
Sub Hupen()
Local X As Byte
Print "TUT TUT"
For X = 1 To 4
Toggle Hupe
Waitms 500
Next X
End Sub
End 'end program
Also zuerst hast Du im Hauptprogramm eine Endlosschleife.
Wenn jetzt der Sensor anspricht, dann wird zum Unterprogramm verzweigt.
Dieses ruft weitere Unterprogramme auf.
Sind die Unterprogramme jeweils beendet ,
springen diese wieder zurück (nach dem Aufrufpunkt).
Letztendlich wirst Du dann wieder in der Endlosschleife zurück sein und diese läuft wieder und wieder und wieder und wieder und wieder und wieder .
Du must jetzt nur noch aufpassen, dass in den Sub's nicht irgendwo weitere Endlosschleifen programmiert werden sonst hängst du dort fest und kommt nie in die Hauptschleife zurück.
Übrigens auch Abbruchbedingte Schleifen können endlos werden, wenn die Abbruchbedingung nie erreicht wird.
Alles verstanden?
Von den Interrupt's würde ich an Deiner Stelle erst mal die Finger lassen.
Wenn Du etwas mehr Erfahrung und Praxis hast dann ja.
Durch Interrups kann das ganze noch schneller reagieren,
aber auch diverse Probleme verursachen welche Du so nicht hast,
wenn alles schön nacheinander abläuft.
Ich denke aber auch dass Du so noch keine Zeitprobleme mit der Reaktion bekommen wirst. (ist ja noch einfach und überschaubar)
Lesezeichen