Forum: Mikrocontroller und Digitale Elektronik 0 oder 1 in Register schieben abhängig von Pinzustand? ASM


von Thomas (kosmos)


Lesenswert?

Hallo ich wollte mal frage ob jemand eine elegantere Lösung(weniger 
Befehle) für dieses Abfrage parat hat.

Ich habe einen Timer laufen und der mir alle 104µSek einen Overflow 
erzeugt und in der Overflow Interruptroutine frage mittels
1
sbis pind, 2
einen Pin ab und möchte nun abhängig von Zustand des Pins eine 0 oder 
eine 1 von links in ein Register schieben.

Kennt vielleicht jemand eine kompaktere Lösung.
1
sbis pind, 2     ;Abfrage: wenn PinD2 = 1 dann nächsten Befehl überspringen
2
rjmp shift0      ;Springe zu Shift0
3
shift1:
4
sbr sreg, 0      ;Setze Carrybit
5
rol Register     ;Schiebe Register nach links wodurch das Carrybit (1) eingeschoben wird
6
shift0:
7
cbr sreg, 0      ;Lösche Carrybit
8
rol Register     ;Schiebe Register nach links wodurch Cyrrybit (0) eingeschoben wird
von (prx) A. K. (prx)


Lesenswert?

1
clc
2
sbic pind, 2
3
sec
4
rol R
oder
1
lsl R
2
in tmp, pind
3
bst tmp, 2
4
bld R, 0
von Peter D. (peda)


Lesenswert?

1
  lsl r16
2
  sbic pind, 2
3
  inc r16
von Sam .. (sam1994)


Lesenswert?

Sollte ein USI Interface am Avr sein, kann der das auch HW-technisch 
machen. Mit SPI würde es auch gehen, aber da hat man entweder den SPI 
Takt zu verfügung, oder muss einen Timerpwmpin mit clock verbinden.
von Peter D. (peda)


Lesenswert?

Ne, SPI geht nicht.

Soll ne SW-UART werden:
104µs = 9600 Baud


Peter
von Sam .. (sam1994)


Lesenswert?

Samuel K. schrieb:
> oder muss einen Timerpwmpin mit clock verbinden.

Hardwareseitig verbinden, SPI als Slave, dann gehts.
von Thomas (kosmos)


Lesenswert?

danke Leute.

@peda: die Lösung gefällt mir immer schieben und die geschobene 0 um 1 
erhöhen.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.