Hi,

entweder schreibst Du
Code:
mainloop:   wdr 
   in   r17,PINB 
   cp   r18,r17 
   brne mainloop 
   rcall   led  ; dann mit "ret" zurück
   rjmp mainloop

;------------------------------------------------------------------------ 
led: 
   rcall   myWait_30ms 
   inc   r19 
   out   PORTC,r19 
   ret ; mit "rcall" zu "led" gesprungen, also mit "ret" zurück
oder:
Code:
mainloop:   wdr 
   in   r17,PINB 
   cp   r18,r17 
   breq   led 
   rjmp   mainloop   ; Sprung zum Beginn der Hauptprogrammschleife 

;Subroutinen 
;------------------------------------------------------------------------ 
led: 
   rcall   myWait_30ms 
   inc   r19 
   out   PORTC,r19 
   rjmp   mainloop  ; <<< Diese Zeile ist gemeint
oder:
Code:
mainloop:   wdr 
   in   r17,PINB 
   cpse   r18,r17 
   rjmp   mainloop   ; Sprung zum Beginn der Hauptprogrammschleife 

;Subroutinen 
;------------------------------------------------------------------------ 
led: 
   rcall   myWait_30ms 
   inc   r19 
   out   PORTC,r19 
   rjmp   mainloop  ; <<< Diese Zeile ist gemeint
So ist es wenigstens formell richtig. Die Programmlogik habe ich nicht überprüft. "Schön" ist der Code auch nicht -- aber das lernt man erst mit der Zeit.

"rcall" legt die Rücksprungadresse auf den Stack, die von "ret" benutzt wird, zu PC+1 zurückzukehren. Bei "breq" und "rjmp" ist das nicht der Fall, also kannst Du nach einer solchen Verzweigung nicht mit "ret" zurückspringen! Wenn Du es doch versuchst, wird ein Wert vom Stack geholt und als Rücksprungadresse interpretiert -- die zeigt natürlich ins Blaue... Zudem korrumpierst Du damit den Stack(pointer).

Gruß

Fred