Forum: Mikrocontroller und Digitale Elektronik zustände der ports zusammenrechnen


von Acidcool (Gast)


Lesenswert?

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

von Glaskugel (Gast)


Lesenswert?

Das kommt auf den verwendeten µC drauf an.

von Floh (Gast)


Lesenswert?

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.
:-)

von Acidcool (Gast)


Lesenswert?

das ist der 8051

von Matthias L. (Gast)


Lesenswert?

>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.

von Acidcool (Gast)


Lesenswert?

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??

von Karl H. (kbuchegg)


Lesenswert?

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.

von Hugi (Gast)


Lesenswert?

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ß

von Acidcool (Gast)


Lesenswert?

hmm hättet ihr ein beispiel? kann mir das so nicht vor ausgen halten.

also ist es möglich die vier ports zu addiern?

von Hugi (Gast)


Lesenswert?

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
  }

von Acidcool (Gast)


Lesenswert?

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

von Matthias L. (Gast)


Lesenswert?

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

von Peter D. (peda)


Lesenswert?

1
        mov     a, #0F0h
2
_m1:
3
        cjne    a, p1, _m1
4
; hier ist P1 = 0F0h



Peter

von Acidcool (Gast)


Lesenswert?

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:

von Achim S. (Gast)


Lesenswert?

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

von Fabian (Gast)


Lesenswert?

Nimm eine 16 Byte grosse LookUp Tabelle

von Michel (Gast)


Lesenswert?

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 ;-)

von Klaus D. (kolisson)


Lesenswert?

if &Bxxxxxxxx(der Port) and &hf0 = port then "alle 4 sind an"

von Hugi (Gast)


Lesenswert?

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

von Klaus D. (kolisson)


Lesenswert?

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
Noch kein Account? Hier anmelden.