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)