Hallo Tobi,
das mit dem PinB einlesen habe ich übersehen.
Die Bit-Zählweise ist so wie Du beschrieben hast &B76543210
Wenn ich das richtig sehe werden in dem Ablauf alle Bits des r16 gelöscht.
Das kannst zu Beginn mit clr r16 machen und Du brauchst nicht 8 mal cbr r16,x.
Überprüf mal ob Du wirklich folgende Umsetzung von den Pins in das r16 vorgesehen hast?
pinc.1 -> r16.0
pinc.0 -> r16.1
pinb.5 -> r16.2
pinb.4 -> r16.3
pinb.3 -> r16.4
pinb.2 -> r16.5
pinb.1 -> r16.6
pinb.0 -> r16.7
Ich hab mal irgendwo gelesen (kann Dir aber jetzt nicht sagen wo das war), dass man nicht sofort nach einer Änderung an einem Port von dort Werte einlesen kann. Wird auf ein Port geschrieben, in Deinem Fall auf das DDRB und DDRC so kommt die Änderung mit Beginn des nächsten CPU-Takts (=ASM-Befehl) zum Tragen. Wird von einem Pin eingelesen, wird der Zustand vom Ende des vorhergehenden CPU-Takt ausgewertet. Es könnte also sein, dass Du auf ein
Ddrc = &B11111100
nicht sofort im nächsten Befehl mit
in r17, PinC
fortsetzen kannst.
Mit
ddrc = &B11111100
ddrb = &B00000000
clr r16
in r17, pinc
bekommst Du zwischen dem C-Port setzen und Einlesen schon mal 3 CPU-Takte.
Ich hoffe ich konnte Dir weiterhelfen.
Lesezeichen