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ß
hmm hättet ihr ein beispiel? kann mir das so nicht vor ausgen halten. also ist es möglich die vier ports zu addiern?
Beispiel für AVR und Port D (ohne Init der Ports usw.):
1 | char sum = 0; |
2 | char mask = 1; // 00000001b |
3 | char input = ~PIND; // invert Inputstatus (low active) |
4 | |
5 | while(mask & 0x0F) // only lower nibble |
6 | {
|
7 | if(input & mask) // input pin is set |
8 | {
|
9 | sum++; // inkrement sum |
10 | }
|
11 | mask <<= 1; // next input pin |
12 | }
|
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.
1 | MOV b, 0 |
2 | MOV d, 1 |
3 | |
4 | loop: |
5 | MOV a, p1 |
6 | AND a,d |
7 | JZ low |
8 | INC b |
9 | low: |
10 | SHL d |
11 | JNZ loop |
1 | mov a, #0F0h |
2 | _m1: |
3 | cjne a, p1, _m1 |
4 | ; hier ist P1 = 0F0h |
Peter
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 ;-)
if &Bxxxxxxxx(der Port) and &hf0 = port then "alle 4 sind an"
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.