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:
Der Loop befehl bewirkt eine Rücksprung zu Do Zeile (ohne abbruchbedingung)Code:Do PORTC.0 = 0 Waitms 100 PORTC.0 = 1 Waitms 100 PORTC.1 = 0 Waitms 10 PORTC.1 = 1 Waitms 10 Loop End
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.
Es gibt auch Befehle, mit welche die Schleifen frühzeitig abgebrochen werden können: EXIT DO / EXIT WHILE.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
Für Dein Problem hab ich mal (astrakt) ein Beispiel:
Also zuerst hast Du im Hauptprogramm eine Endlosschleife.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
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)






Zitieren
Das RN 

Lesezeichen