P1 an einem C535 als Aus und Eingang nutzen

OP #3138430
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
#3138450
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
OP #3138635
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 :-)
Gast #3138659
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.
OP #3138681
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 ?
Gast #3138697
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.
OP #3138731
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.
OP #3138779
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 ?
Gast #3138795
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?

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren