Hallo,
ich möchte genere in Assembler (Atmega16) in eine Subroutine die
PIN-Nummer mittels eventuell eines Registers (oder habt ihr einen
anderen Vorschlag) übergeben.
Also z.B. dachte ich mir sowas:
1
timer0_overflow: ; Timer 0 Overflow Handler
2
rcall storeToStack
3
4
ldi outpin, PIND7
5
rcall toggle
6
7
rcall restoreFromStack
8
reti
9
10
toggle:
11
sbic PIND, outpin
12
rjmp Off
13
sbis PIND, outpin
14
rjmp On
15
toggle_end:
16
ret
17
18
On:
19
sbi PORTD, outpin
20
rjmp toggle_end
21
22
Off:
23
cbi PORTD, outpin
24
rjmp toggle_end
Jetzt meldet mir der Compiler aber in "toggle", "On" und "Off" bei
verwendung von outpin jeweils "Invalid number": Dabei steht doch genauso
eine 7 im Register (outpin) wie wenn ich PIND7 direkt anspreche.
Wie kann ich soetwas realisieren?
bzw. wie erweitere ich noch "toggle", sodass auch "PIND" außerhalb von
"toggle" gesetzt werden kann, also so dass "toggle", etc. komplett
generisch werden?
Gerald H. schrieb:> Hi Spess,>> danke... irgendwie schon klar und logisch...> Die Lösung habe ich einfach nicht gesehen.
Das bezog sich auf "PIND7"!
Doch eine Frage bleibt: Wie wie kann ich in dem Code von Spess denn noch
PORTD ähnlich wie PIND7 ersetzen?
PORTD hat ja die Adresse 0x12 und wenn ich die in ein Register kopiere
und dann das Register anstelle von PORTD verwende, sagt der Compiler
schon eine "invalid number".
Also so ich möchte gerne sowas machen:
Deine erste Lösung geht nicht, da der Pin bei sbi und cbi immer konstant
sein muss.
Bei der zweiten Lösung ist das Problem, dass der Port bei in und out
immer konstant sein muss.
Ich weiß was du machen willst, deine Funktion toggle soll auf alle Ports
gehen. So eine Lösung ist mit den AVRs aber nicht möglich.
Du könntest höchstens in "toggle" feste Befehle (in r16, PORTA; in r16,
PORTB; ...) machen, von denen durch eine Fallunterscheidung zwischen den
Ports immer nur einer ausgeführt wird.
Hi
>Bei out und in kein Register zum Adressieren verwenden.
Entschuldige. Soll heissen:
'Bei out und in kann man kein Register zum Adressieren verwenden.'
MfG Spess