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
Kein Problem, die Ports sind ja bitweise zugreifbar. Eingangspins müssen beim 8051 nur auf high gesetzt werden.
deswegen hatte ich ja geschrieben das ich nciht bitweise darauf zugreifen will :-)
Warum nicht, was stört Dich daran? Byteweise geht natürlich trotzdem. Man muß dann nur die nicht relevanten Pins maskieren (&,|).
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
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 ?
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.
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 ... :-(
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 :-)
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.
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 ?
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.
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.
Der 8051 hat open-drain Ausgänge nach GND und interne Pullups. Daher ist der 1-Pegel rezessiv und die 0 dominant.
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 ?
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.