@izaseba: jahaaa!!! In jedem Anfänger-Manual oben links auf der ersten Seite Ich hab mich auch an Deinem Beispiel orientiert: http://www.izaseba.roboterbastler.de...ction=Lektion8 Das stammt doch von Dir, oder? Vielen Dank!

@JonnyP: brauch ich das HIGH-Byte für mein simples Vorhaben?

Wie auch immer - hey Leute, die Erde ist rund und es funktioniert!!! Ich hab mir jetzt sogar Lötzinn organisiert und die Käbelchen an meine Pin-Abnehmer gelötet. Aber mal im Ernst. Diese Abnehmer, die ich da habe, die sind ja wohl ein Witz... Die haben schön die Aussparung, damit ich sie auf den Platinenpin aufstöpseln kann, aber am anderen Ende kommt wieder ein Pin raus. Meine Güte, ich musste meine Frau zu Hilfe holen, damit sie mit der einen Hand das Kabel hält und mit der anderen die Zange mit dem eingeklemmten Pin-Abnehmer, damit ich einerseits das Lötzinn halten und andererseits den Quatsch zusammenlöten konnte. Da gibts doch sicher optimalere Lösungen...

Aber mal zurück zum Code (kann ich den mit HTML-Code formatieren?):

<pre>
;***** STK500 Servo in mittlere Position bringen
;************************************************* *********
.include "8515def.inc" ; Definitionen für AT90S8515
rjmp RESET ; Reset Handle
;************************************************* *********
.def temp =r16 ; Temporary register
.def stack = r17 ; stack

RESET:
; ser temp ; auskommentiert, versteh ich nicht
ldi stack, HIGH(RAMEND)
out SPH, stack
sbi DDRB,PB0 ; Set PORTB to output
LOOP:
; out PORTB,temp ; Update Port, auskommentiert, versteh ich auch nicht
sbi PORTB, PB0 ; Setze PortB, Pin0
rcall WAITPOS ; warte 1-2ms (Servo-Position)
cbi PORTB, PB0 ; Lösche PortB, Pin0
rcall WAITREP ; warte 20ms (Repetition-Periode)
rjmp LOOP ; usw usf

;************************************************* *********
; Subroutinen (später mal auf 4Mhz anpassen)
;************************************************* *********
WAITPOS:
ldi ZH, HIGH(1500) ; setze höheres Z-Byte
ldi ZL, LOW(1500) ; setze niedriges Z-Byte
LOOPPOS:
sbiw ZL, 1 ; decrementiere Z
brne LOOPPOS ; loop bis Z=0
ret ; und tschüss

WAITREP: ; dito WAITPOS
ldi ZH, HIGH(65535)
ldi ZL, LOW(65535)
LOOPREP:
sbiw ZL, 1
brne LOOPREP
ret
</pre>

Der Servo akzeptiert, wenn ich mit einem 65535-Intervall daherkomme (Eigentlich akzeptiert er alle Werte, ich könnte sogar 100 eingeben). Als Steuersignal akzeptiert er 1000 (links), 1500 (mitte), 2000 (rechts) wie im Beschieb steht, auf das mich Manf aufmerksam gemacht hat. Die Limits gehen sogar von etwa 750 - 2400 (hab das noch nicht bis in die Nachkommastellen getestet). Bei 1000/2000 geht er nicht ganz nach links/rechts. Aber das ist ein Detail.

Ursprünglich hatte ich mit meinem simplen Gemüt erwartet, dass ich den Wert vervierfachen muss, weil ich ja mit 4Mhz daherkomme. Ich denke inzwischen aber, dass ich die Cycles innerhalb der Warteschlaufe auch berücksichtigen muss:
SBIW: 2 + BRNE: 1 + RET ? (4 devices with 16-bit PC ), was auch immer das für RET heissen mag. Angenommen RET braucht 1 Cycle, käme ich exakt auf 4, was wiederum bedeutet, dass ein Loop 4 Takte verbrennt. Das führt dazu, dass ich meine Millisekunden eben gerade NICHT vervierfachen muss, weil mein Loop bereits schon 4 Takte braucht.

Gehen meine Gedanken in etwa in die richtige Richtung oder sehe ich das komplett falsch?

Mein nächstes Vorhaben wird sein, die Taster miteinzubeziehen. Mal schauen, ob ich das hinkriege.

Auf alle Fälle vielen Dank für Eure bisherige Unterstützung - ohne Euch hätte ich das niemals so schnell hinbekommen.