Forum: Mikrocontroller und Digitale Elektronik P1 an einem C535 als Aus und Eingang nutzen


von Jörg D. (jrg_d)


Lesenswert?

Moin zusammen,

Ich stehe gerade etwas auf dem Schlauch.

Ich versuche derzeit an unseren Schulplatinen mit einem C535 einen 
Schrittmotor zum laufen zu überreden.

Jetzt ist es so das ich  15 verschiedene Drehzahlen vorwählen will. die 
will ich über 4 Eingänge wählen können. Desweiteren will ich diese 
Byteweise auslesen. und nicht bitweise.

Da aber die 4 Spulen des Schrittmotor ebenfalls an Port1 hängen und auch 
byteweise ausgegeben werden, stehe ich halt etwas auf dem schlauch.
Kann ja schlecht beides gleichzeitig machen oder ?

Also zur veranschaulichung

P1.0 - P1.3 Eingänge für Geschwindikeitswahl
P1.4 - P1.7 Spulen des Schrittmotor

hoffe ich habe mich verständlich ausgedrückt :-)

LG Jörg

von Peter D. (peda)


Lesenswert?

Kein Problem, die Ports sind ja bitweise zugreifbar.
Eingangspins müssen beim 8051 nur auf high gesetzt werden.

von Jörg D. (jrg_d)


Lesenswert?

deswegen hatte ich ja geschrieben das ich nciht bitweise darauf 
zugreifen will :-)

von Peter D. (peda)


Lesenswert?

Warum nicht, was stört Dich daran?

Byteweise geht natürlich trotzdem. Man muß dann nur die nicht relevanten 
Pins maskieren (&,|).

von Georg G. (df2au)


Lesenswert?

Vermutlich meinst du mit "Byteweise", dass du 4 Bits auf einmal 
lesen/schreiben möchtest.

Lesen: Wert = Port-lesen & benutzte-Bits
also Geschwindigkeit = Port1 & 0x0f

Schreiben: Ausgabe-Bits passend schieben, was Eingang sein soll auf 1 
setzen, raus damit.
also Port1 = (Spulen << 4) | 0x0f

von Jörg D. (jrg_d)


Lesenswert?

Ja wenn ich sage

P1&15;

und dann die abfrage der werte amch kann ich doch ncith später sagen

P1=0xf0; zum Beispiel jetzt

oder ?


oder muss ich dann vorher nochmal ne maske setzen ?
also quasi

P1&240;
P1=0xf0;

oder wie ?

von Peter D. (peda)


Lesenswert?

1
void set_p1_74( char i )
2
{
3
  P1 = i | 0x0F;
4
}
5
6
char read_p1_30()
7
{
8
  return P1 & 0x0F;
9
}

Und laß den Unsinn mit Dezimalzahlen für Binärwerte sein. Das ist schwer 
zu lesen.

von Jörg D. (jrg_d)


Lesenswert?

Danke für den Programmcode leider bin ich noch ein blutiger Anfänger 
kannst du mir den code etwas kommentieren ?

Ich verstehe noch nicht so ganz ... :-(

von Jörg D. (jrg_d)


Lesenswert?

1
void set_p1_74(char i)

ich kenne das "char i" nicht in Verbindung mit dem Void und der Name 
set_p1_74 ist der zufällig gewählt ?

1
  P1 = i | 0x0F;

Was bewirkt dieser Befehl ?
1
char read_p1_30()

und warum steht da char und nix in der klammer?
1
return P1 & 0x0F;

und was macht dann dieser Befehl.

Sorry für meine Unkenntniss aber ich will es nur ganz verstehen :-)

von Wilhelm F. (Gast)


Lesenswert?

Peters Code setzt die oberen 4 Pins von P1 mit dem Wert von i, und setzt 
die unteren 4 Pins wieder auf Eingang.

Der zweite Teil liest die unteren 4 Pins von P1.



Bei der Hardware des 535 muß man etwas aufpassen: Die Pins können bei 
High-Pegel nur einen winzigen Strom treiben, dort braucht man dann evtl. 
zusätzlich Pullup-Widerstände, Puffer, Treiber, was auch immer. Ein 
Schrittmotor-Treiberbaustein paßt aber meistens ohne besondere Maßnahmen 
an den Port.

von Jörg D. (jrg_d)


Lesenswert?

Sorry ich verstehe es nicht.

Wie kann ich die Pins denn auch Eongang setzen ?

bei dem Atmel weiss ich das aber beim 8051 bin ich da echt unwissend.

Mir ist der zusammenhang mit dem
1
void set_p1_74( char i )
2
{
3
  P1 = i | 0x0F;
4
}

klar weil ich sage ja schreibe mir auf P1 den wert aus i ODER 0x0F

oder ?

wieso ein ODER ? damit schreibe ich doch auf jeden fall die letzten 4 
bits auf eins oder vertue ich mich da jetzt total ?

von Wilhelm F. (Gast)


Lesenswert?

Jörg D. schrieb:

> Wie kann ich die Pins denn auch Eongang setzen ?
>
> bei dem Atmel weiss ich das aber beim 8051 bin ich da echt unwissend.

Man schreibt einfach Einsen in die betreffenden Pins, die man als 
Eingang haben möchte, und schaut, daß sie auch immer auf 1 bleiben. 
Setzt man Nullen in die Pins, kann man sie nur noch mit Null lesen, und 
sollte sie auch von außen nicht versuchen gewaltsam auf 1 zu setzen.

> P1 = i | 0x0F;

Dieser Befehl setzt durch die Veroderung die unteren 4 Pins an P1 immer 
auf 1, also auf Eingang. Zusätzlich gelangt der Wert der Variablen i in 
die oberen 4 Pins an P1. Die Bits müssen in der Variablen i natürlich 
auch in den oberen 4 Bits stehen, oder man schiebt den Wert vorher um 4 
Bits nach links.

von Jörg D. (jrg_d)


Lesenswert?

Sorry aber ich raffs nicht mit den dauerhaft auf eins setzen nicht. wird 
dan nder eingang auf null abgefragt oder wie ?

wie ist es denn wenn ich sage

P1&0xF0;

und dann P1=i;

und danach P1&0x0F;
und dann variable=P1&0x0F;

dann würde er doch die ersten vier Pins nicht beachten beim setzen oder 
?


ich bin grade echt etwas durch den wind.

von Peter D. (peda)


Lesenswert?

Der 8051 hat open-drain Ausgänge nach GND und interne Pullups.
Daher ist der 1-Pegel rezessiv und die 0 dominant.

von Jörg D. (jrg_d)


Lesenswert?

ah jetzt raff ich es.

Da ist das problem. wir haben experimentier boards wo die eingänge bzw 
ausgänge auf invertierer gehen.

wir legen eine 5V spannung an einem eingang an und bekommen eine 1 im MC 
"angezeigt"

Wenn ich euch richtig verstanden habe ist es ähnlich wie beim Atmega8 
das man quasi den eingang auf null zieht und quasi den eingang auf null 
abfragt.

Richtig ?

von Wilhelm F. (Gast)


Lesenswert?

Jörg D. schrieb:

> Sorry aber ich raffs nicht mit den dauerhaft auf eins setzen nicht. wird
> dan nder eingang auf null abgefragt oder wie ?
>
> wie ist es denn wenn ich sage
>
> P1&0xF0;
>
> und dann P1=i;

Schrittweise nacheinander ausgeben kann man evtl. zum besseren 
Verständnis noch so:

i = i << 4;
i = i | 0x0F;
P1 = i;

> und danach P1&0x0F;
> und dann variable=P1&0x0F;

Und einlesen so:

P1 = P1 | 0x0F;
i = P1;
i = i & 0x0F;

Vielleicht hilft das zu etwas besserem Verständnis.

Jörg D. schrieb:

> Da ist das problem. wir haben experimentier boards wo die eingänge bzw
> ausgänge auf invertierer gehen.
>
> wir legen eine 5V spannung an einem eingang an und bekommen eine 1 im MC
> "angezeigt"

Sicher, daß das Invertierer sind? Oder eher nicht invertierende 
Puffer?

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.