Naja, fast - wichtig ist hier zu verstehen und auseinander zuhalten was wo passiert. Deine do-loop ist eine Schleife - Die Hauptschleife. Deine Unterroutinen, die du mit Gosub anwählst sind genau genommen nicht mehr Bestandteil diese Schleife. Der Zeitverlust entsteht in diesem Fall nicht in der Hauptschleife, sondern in der Unterroutine - allein zu sehen an den "6x waitms 100" - und natürlich fehlt der Interrupt. Diese Zeitverzögerung die du bemerkst ist also der Moment in dem sich Dein Programm in einer (langen) Unterroutine befindet. Damit hast du übrigens auch den schlechten Nebeneffekt vom pollen direkt bemerkt.
Manche Programme kann man durchaus damit laufen lassen, wenn es aber mal direkt gehen soll dann ist dieser Weg eher schlecht, weil man je nach dem wie lang eine Unterroutine ist dementsprechend warten - bzw den richtigen Moment der Tasterabfrage erwischen muss. Natürlich ist aber die Zeit die der µC benötigt um einmal die do-loop Schleife abzuarbeiten inklusiver der Unterroutinen die angewählt werden. Da kommt es dann eben noch drauf an was in ihnen passiert.
Beim "Case 1" passiert dir das übrigens auch, nur nicht so extrem auffällig weil keine waits drin sind und der Zeitverzug einfach für "uns" nicht direkt wahrnehmbar ist.
Viele Grüße
Jörg
Lesezeichen