Zitat Zitat von Grillmeister Markus
Auch wenn die sache mit GOTO angeblich ein unsaubererprogrammierstiel ist, so erscheint es mir doch deutlich einfacher und überlichtlicher.
Hallo

Einfacher schon, aber nicht übersichtlicher. Und einfacher auch nur bei sehr kleinen Programme und weil du den Stack nicht überflutest.

Du hast zum Beispiel einen (On Timer0 Ontimer) in deinem Programme, wenn du jetzt in der Ontimer Routine einen GOTO rein setzt wirst du wieder einen Stacküberlauf haben, weil bei einem Interrupt Automatisch die Rücksprungadresse auf den Stack abgelegt wird, und sie so nie gelöscht wird.

Im Grund ist es so. du sollst ein Hauptprogramm haben was in einer Schleife läuft, in dem Hauptprogramme reagierst du auf verschiedene Ereignisse wie zum Beispiel Tassendruck, dann rufst eine Unterroutine auf die diese Arbeit erledigt dann springst du wieder in die Hauptroutine zurück. So das dein Programm aus einem Mainprogramm besteht, und viele kleinen Unterprogramme.

Du kannst auch aus einem Unterprogramm ein andres Unterprogramm aufrufen, aber immer wieder dahin zurück springen wo du herkommst.

Was du auch vermeiden sollst ist, aus einem aufgerufenen Unterprogramm das aufrufende Unterprogramm aufrufen. Weil du dich dann in eine Endlosschleife begeben kannst die nie endet.

So kannst du dein Programm Ablauf sehr einfach verfolgen und schnell Fehler entdecken. Mit GOTO Ist das nicht so einfach. Wenn du zum Beispiel eine Variable hast die an einer bestimmten Stelle einen falschen Wehrt hat, und du dann feststellen sollst wo der her kommt ist das nicht mehr so einfach, weil du eben hin und her springst.

Ich habe dir mal dein Programm so umgeändert wie es aussehen sollte. Du kannst es nicht so einsetzen, es soll lediglich das Prinzip verdeutlichen.


Code:
$regfile = "2313def.dat"
$crystal = 3686400
$baud = 9600

Dim Zaehler As Byte

Ddrd.2 = 1                                                  'motor links vorwärts
Ddrd.3 = 1                                                  'motor links rückwärts
Ddrd.4 = 1                                                  'motor rechts vorwärts
Ddrd.5 = 1                                                  'motor rechts rückwärts
Ddrb.0 = 0                                                  'taster links vorne
Ddrb.1 = 0                                                  'taster mitte vorne
Ddrb.2 = 0                                                  'taster rechts vorne
Portb.0 = 1
Portb.1 = 1
Portb.2 = 1

Mlinksvor Alias Portd.2
Mlinksrueck Alias Portd.3
Mrechtsvor Alias Portd.4
Mrechtsrueck Alias Portd.5

Schalterlinks Alias Pinb.0
Schaltermitte Alias Pinb.1
Schalterrechts Alias Pinb.2

Config Timer0 = Timer , Prescale = 1024
Enable Timer0
Start Timer0
Enable Interrupts
On Timer0 Ontimer

''Main:

Do
   Mlinksvor = 1
   Mlinksrueck = 0
   Mrechtsvor = 1
   Mrechtsrueck = 0
   If Schalterlinks = 0 Then
      Zaehler = 0
      Gosub Links
   End If
   If Schaltermitte = 0 Then
      Zaehler = 0
      Gosub Mitte
   End If
   If Schalterrechts = 0 Then
      Zaehler = 0
      Gosub Rechts
   End If
Loop

Links:
Do
If Zaehler => 33 Then
   Mlinksvor = 1
   Mlinksrueck = 0
   Mrechtsvor = 0
   Mrechtsrueck = 1
Else
   Mlinksvor = 0
   Mlinksrueck = 1
   Mrechtsvor = 0
   Mrechtsrueck = 1
End If

If Zaehler = 83 Then
   Return
End If
Loop

Mitte:
Do
If Zaehler => 33 Then
   Mlinksvor = 1
   Mlinksrueck = 0
   Mrechtsvor = 0
   Mrechtsrueck = 1
Else
   Mlinksvor = 0
   Mlinksrueck = 1
   Mrechtsvor = 0
   Mrechtsrueck = 1
End If
If Zaehler = 101 Then
   Return
End If
Loop

Rechts:
Do
If Zaehler => 33 Then
   Mlinksvor = 0
   Mlinksrueck = 1
   Mrechtsvor = 1
   Mrechtsrueck = 0
Else
   Mlinksvor = 0
   Mlinksrueck = 1
   Mrechtsvor = 0
   Mrechtsrueck = 1
End If
If Zaehler = 83 Then
   Return
End If
Loop

Ontimer:
Incr Zaehler
Print Zaehler
Return
Schau dir auch mal an wie ich aus deinen Zwei (If Zaehler > 33 Or Zaehler = 33 Then If Zaehler < 33 Then ) eine mit ELSE gemacht habe. Die ist viel übersichtlicher, und zudem im Prinzip auch noch schneller.

Ein andrer Grund ist, dass es in andren Sprachen keinen GOTO gibt. Wenn du dir den GOTO zu sehr angewöhnst wirst du beim umsteigen auf eine andere Sprache viel Schwierigkeiten haben.

Für den Anfang würde ich dir raten mit einem Flußdiagramme zuarbeiten Googel mal nach Flußdiagramme. Eine andre und bessere Möglichkeit ist mit einem Struktogramme, aber das ist ein wenig schwieriger. Und erst wenn dein Programm im Flußdiagramme funktioniert solltest du anfangen den Code zuschreiben.

So ich hoffe ich konnte dir ein wenig weiter helfen, und noch viel Spaß beim Progen.

mfg
Guy