hi leute komm nicht weiter. bestimmt könnt ihr mir weiter helfen.
folgendes:
ich will die ports 1.0-1.4 zusammen rechnen und dann vergleichen ob
1,2,3 oder 4 der ports an sind. zum beispiel; port1: 11110000 das
würde ja wenn man es zusammen rechnet 4 ergeben. F0h müsste dann im akku
stehen. dann müsste ich es nur noch subbtrahiren mit F0h damit es null
ist. wenn dann carry null ist ist es wahr. soweit bin ich bi jetzt
gekommen nur wie kann ich den ganzen port in den akku laden?
LG acid
Acidcool schrieb:> soweit bin ich bi jetzt> gekommen nur wie kann ich den ganzen port in den akku laden?
Wenn du sagst welcher Prozessor das tun soll, kriegste ordentliche
Infos.
:-)
>ich will die ports 1.0-1.4 zusammen rechnen und dann vergleichen ob>1,2,3 oder 4 der ports an sind.
Das macht man nicht mit Subtraktion, sondern mit Maskierung.
Wenn der Ausdruck:
( PORT & 0xF0 )
ungleich Null ist, dann ist mindestens einer der vier Eingänge HIGH.
hmmm maskierung sagt mir als neuling nichts ich dachte eher an sowas:
mov a, p1
subb a, 0fh
jnc weiter
dann müsste er ja springen wenn die 4 ports an sind oder??
Acidcool schrieb:> hmmm maskierung sagt mir als neuling nichts ich dachte eher an sowas:>> mov a, p1> subb a, 0fh> jnc weiter>> dann müsste er ja springen wenn die 4 ports an sind oder??
klingt erst mal nichtr schlecht. Ich denke aber trotzdem, dass du da ein
wenig zu einfach denkst.
Beim Feststellen von 4 Leitungen auf 1 ist die Sache noch einfach. Es
gibt ja nur 1 Bild, das diese Forderung erfüllt. Wenn du dich aber
frägst, ob am Eingang vielleicht nur 3 Eingänge auf 1 sind, dann gibt es
da schon meherer 'Bilder'
1110 0000
1101 0000
1011 0000
0111 0000
und bei nur 2 Einsen sind es dann noch mehr.
D.h. eine tatsächliche Zählung wird da wohl einfacher sein als wie wenn
du das Ganze mittels Erkennung von bestimmten Zahlen machst.
Einfach bei 1 Anfangen mit der UND-Verknüpfung und bei True eine
Variable hochzählen, dann immer um 1 nach oben schieben. Nach der
UND-Verknüpfung mit 8 abbrechen und die Variable auswerten.
Ist ne einfache For/DO-While-Schleife mit ner Schiebeoperation ner
UND-Verknüpfung und ner Variablen.
Gruß
ahh jetzt hats glaube ich doch klick gemacht
also ich soll einfach in einer schleibe den zustand des ports auslesen
wenn er wahr ist soll ich es in einem zähler einen hochsetzen :) okey
ihr habt mir sher geholfen thx
Dieser Sch* 8051 hat ja nur ein Arbeitsregister. Das hat mich im Studium
schon genervt. Immer dieses Push/pop..
Hier mal der PseudoCode. Die exakten Befehle kenn ich nicht mehr. b und
d müsstest du durch Variablen bzw. Register ersetzen.
leider muss ich es in assembler programieren da ist mit c raus aber
trozdem danke. ich macht das so wenn jemand es besser kann bitt ich drum
es mir zu zeigen :)
mov c, S1
jnc h1
inc Z
h1:
mov c, S2
jnc h2
inc z
h2:
mov c, S3
jnc h3
inc Z
h3:
mov c, S4
jnc h4
inc Z
h4:
du kannst dir den Umweg über das Carry-Flag sparen, der bedingte Sprung
kann direkt den Portpin auswerten:
mov z,#0
jnb P1.0,h1
inc z
h1: jnb P1.1,h2
inc z
h2: jnb P1.2,h3
inc z
h3: ....
schöne Grüße
Achim
Hugi schrieb:> Ist ne einfache For/DO-While-Schleife mit ner Schiebeoperation ner> UND-Verknüpfung und ner Variablen.
Klar, For/Do-While in Assembler ;-)
Michel schrieb:> Klar, For/Do-While in Assembler ;-)
Er hatte nirgends explizit geschrieben dass er es in ASM will ;-)
Und zweitens ging es ja auch eher um das Verständnis wie man soetwas
machen könnte.
Das C-Programm kann man ja fast 1 zu 1 in ein ASM Programm umstricken.
Er meinte ja dann:
Acidcool schrieb:> ahh jetzt hats glaube ich doch klick gemacht
Klaus De lisson schrieb:> if &Bxxxxxxxx(der Port) and &hf0 = port then "alle 4 sind an"
Hier kommt noch meine Selbstkorrektur:
Das da oben ist natürlich falsch gedacht und es sollte heissen:
if &Bxxxxxxxx(der Port) and &hf0 = &Hf0 then "alle 4 oberen sind an"
grussy
Eine eigene Frage?
Dieser Thread ist über 15 Jahre alt.
Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.