Hallo Ich arbeite mit einem At89C51 und programmiere in C. Nun habe ich folgendes Problem: Am Port 2.6 bekomme ich 8 Bits nacheinander von eine anderen Ic. Wie kann ich diese nun einlesen, damit diese acht Bits in einem Byte sind? Dies sollte am besten in einer for-Schleife stattfinden die ich einfach 8 mal durchlaufen kann. mfg
Grossuhr schrieb: > Dies sollte am besten in einer for-Schleife stattfinden die ich einfach > 8 mal durchlaufen kann. Damit hast du dir die Frage dann auch schon (fast) selbst beantwortet. Die einzige Frage die bleibt: Woher weißt du eigentlich, wann dein Gegenüber mit dem nächsten Bit anfängt?
Dies sage ich dem anderen Ic mit dem Port2.7. Wenn ich es setzte gibt der andere IC das erste Bit, danach lösche ich den Port2.7 und wenn ich ihn das nächste mal stzte wird das zweite Bit gesendet. Dies bringt mich gerade zur zweiten frage, die ich vorhin vergass. :) Wie kann man mit c ein Port setztn und löschen. danke
1 | #define meinPin P2_7 |
2 | |
3 | meinPin = 1; |
4 | meinPin = 0; |
Beim einlesen schiebst Du BIT für BIT in ein Byte. Der 8051 ist BITadressierbar das macht das Ganze recht einfach.
Danke schonmal für die erste beantwortung. Aber wie schiebe ich dieses Bit in das Byte und wie muss ich das ganze initialisieren. so geht es nicht: #define meinPin 2_6 int meinByte; meinPin = meinByte_0; ...und jetzt müsste ich es noch irgendswie rechtsschieben..
meinByte sollte wohl eher ein uint8_t sein... oder unsigned char. Schiebeoperationen wie <<=1; solltest Du dir auch einmal ansehen. Überleg mal, Du gibst das Signal aus und schaust nach welcher Pegel am Eingang von P2.6 liegt... entweder 0 oder 1. Dann, je nachdem ob MSB oder LSB first, gehört dieses BIT nun an eine entsprechende Position innerhalb des Byte. Dann entsprechend das nächste BIT holen und einreihen. Sind das genug Hinweise ? :-) Also, Schiebeoperationen, Datentypen und ein bischen Grundlagen erlernen. Wäre auch gut wenn Du mitteilst mit welchem Compiler Du arbeitest. Bei der Definition von PINs sind diese zuweilen unterschiedlich (SDCC versus Keil).
Bernd N schrieb: > Sind das genug Hinweise ? :-) Danke schonmal für diese, ich werde es nun nocheinmal versuchen :) Bernd N schrieb: > Wäre auch gut wenn Du mitteilst mit welchem Compiler Du arbeitest. Bei > > der Definition von PINs sind diese zuweilen unterschiedlich (SDCC versus > Keil). Ich benutze Keil...
Win weiterer Thread, der sich mit ein bischen Eigenrecherche hätte vermeiden lassen. Das Niveau hier ist teilweise Kindergarten Hausaufgabenhilfe. Ist ja nicht so, das das Problem ein paar Signale einzulesen komplett neu wäre.
Marcus schrieb: > Win weiterer Thread, der sich mit ein bischen Eigenrecherche hätte > vermeiden lassen. Das Niveau hier ist teilweise Kindergarten > Hausaufgabenhilfe. Ist ja nicht so, das das Problem ein paar Signale > einzulesen komplett neu wäre. Ein weiteres Beispiel für einen völlig unqualifizierten/ungefragten Kommentar. Deine Meinung interessiert NIEMANDEN, behalt den Mist für dich.
Frank S. schrieb: > Ein weiteres Beispiel für einen völlig unqualifizierten/ungefragten > Kommentar. Deine Meinung interessiert NIEMANDEN, behalt den Mist für > dich. Sprich bitte nur fuer dich selbst.
Jeder von uns hat irgendwann einmal angefangen... laß also auch hier dem
Anfänger eine Chance... er hat genug Hinweise bekommen.
>> Das Niveau hier ist teilweise Kindergarten
Entspricht in etwa deinem Verhalten.
Bernd N schrieb: > Jeder von uns hat irgendwann einmal angefangen... laß also auch hier dem > Anfänger eine Chance... er hat genug Hinweise bekommen. > Genug Hinweise hat er definitiv nicht bekommen, auch nicht von dir. Du freust dich anscheinend auch wenn mal ein Thema aufkommt zu dem du was sagen kannst. Entweder er macht noch Eigenrecherche, dann hätte er sich den Thread gleich ganz sparen können, oder er wird sich noch wundern warum er immer wieder sporadisch Müll einliest. Als Hinweis mal von mir: Wann sind die Daten gültig und wie lange? >>> Das Niveau hier ist teilweise Kindergarten > > Entspricht in etwa deinem Verhalten. Bitte nicht falsch zitieren, ich schrieb "Kindergarten Hausaufgabenhilfe". Jeder hat mal klein angefangen, aber nicht jeder hat sich den Arsch nachtragen lassen.
>> Genug Hinweise hat er definitiv nicht bekommen, auch nicht von dir. Na dann ist er sicherlich froh das Du so geholfen hast. 1. Es ist offensichtlich das "Grossuhr" Anfänger ist. Er kann durch meine Hinweise einen Pin auf 1 oder 0 setzen (ist doch schon was). 2. Grundlagen fehlen ihm. Er weiß nun das ein Byte NICHT "int" ist :-) 3. Er hat uns nicht mitteilen können ob MSB oder LSB first. Er wird es sicherlich herausfinden weil er einen Hinweis bekommen hat. Die typische Antwort, lies das Tutorial ist meiner Meinung nach keine Hilfe. Wenn die Tipps nicht ausreichen kann er erneut fragen... so what ? Er wird die 8 BIT schon ins Byte bringen denn auch der Hinweis auf Schiebeoperationen wurde gegeben. >> Du freust dich anscheinend auch wenn mal ein Thema aufkommt >> zu dem du was sagen kannst. Ich helf doch gern :-)
Also nun muss ich mich doch nochmal zu Wort melden. Marcus schrieb: > Das Niveau hier ist teilweise Kindergarten > Hausaufgabenhilfe. Es kann doch dir egal sein was ich in diesen Thread schreibe und was nicht (solange es mit dem Thema zu tu hat..). Ich habe mich schon mit dem Thema befasst aber bin nicht auf eine indeutige Antwort gekommen. Marcus Overhagen schrieb: > Genug Hinweise hat er definitiv nicht bekommen, auch nicht von dir. Aber die Hinweise haben mir geholfen... Bernd N schrieb: > 3. Er hat uns nicht mitteilen können ob MSB oder LSB first. Es ist LSB first, das vergas ich zu schreiben :)
1 | #include <reg51.h> |
2 | |
3 | |
4 | sbit SPI_CLK = P2^7; |
5 | sbit SPI_MISO_PIN = P2^6; |
6 | |
7 | #define uint8_t unsigned char
|
8 | |
9 | |
10 | uint8_t shift_in( void ) // receive byte |
11 | {
|
12 | uint8_t i, b; |
13 | |
14 | for( i = 8; i; i-- ){ // 8 bits |
15 | b >>= 1; |
16 | SPI_CLK = 1; |
17 | if( SPI_MISO_PIN ) |
18 | b |= 0x80; // MSB last |
19 | SPI_CLK = 0; |
20 | }
|
21 | return b; |
22 | }
|
Peter
Mit der Hilfe von euch habe ich nun meine eigene routine geschrieben. Falls ihr irgendwelche fehler endteckt bitt melden.. Danke unsigned char send =0; #define SCLK P2_7 #define I_O P2_6 for (i=1;i<=8;i++){ if (send & (1<<0)) // ist Bit 0 von send auf high? I_O = 1; //dann I_O auf eins setztn else I_O = 0; //sonst I_O auf null setztn send = send >> 1; //Die Bits von send 1 nach rechts verschieben SCLK =1; //Sobald SCLK aug high ist liest der empfänger IC wait(); SCLK = 0; }
Im ersten Post wolltest Du doch einlesen und nun gibst Du aber aus. Du solltest Dich mal entscheiden. Peter
Grossuhr schrieb: > unsigned char send =0; > > #define SCLK P2_7 > #define I_O P2_6 > > > for (i=1;i<=8;i++){ > > if (send & (1<<0)) // ist Bit 0 von send auf high? > I_O = 1; //dann I_O auf eins setztn > > else I_O = 0; //sonst I_O auf null setztn > > send = send >> 1; //Die Bits von send 1 nach rechts verschieben wieso send? Ich denke send repräsentiert deinen Eingangsport, von dem du das Bit abgreifst? Wieso I_O auf 0 oder 1 setzen? > SCLK =1; //Sobald SCLK aug high ist liest der empfänger > IC > wait(); > SCLK = 0; > } Ein paar Dinge allgemeinerer Natur: * gewöhn dir gleich jetzt eine saubere äußere Form an. Du findest Fehler viel leichter! So etwas > if (send & (1<<0)) // ist Bit 0 von send auf high? > I_O = 1; //dann I_O auf eins setztn > > else I_O = 0; //sonst I_O auf null setztn geht gar nicht! Wenn du nur 1 Anweisung hast, die unter einem if oder else steht dann schreib sie entweder immer in die gleiche Zeile oder fang immer eine neue Zeile an, in der du die Anweisung einrückst Aber nicht mischen! Immer die gleiche äussere Form verwenden Für Anfänger ist es oft besser, generell immer eine neue Zeile zu beginnen, und dort einzurücken. ALso if( send & (1<<0) ) I_O = 1; else I_O = 0; * Das hier for (i=1;i<=8;i++){ solltest du dir auch gleich wieder abgewöhnen. In C wird grundsätzlich immer bei 0 angefangen zu zählen. Willst du eine Schleife haben, die 8 mal durchläuft, dann heisst das for( i = 0; i < 8; i++ ) Alles andere wird dich über kurz oder lang bei Arrays in den Wahnsinn treiben. Vor allen Dingen, wenn du nicht mit 0 zu zählen anfängst.
Ja sorry..:D Ich möchte eigentlich beides, aber schrieb nur einlesen da beides etwa ähnlich ist. Hier ist die Routine zum einlesen (hab die falsche Routine kopiert:) ) for (i=1;i<=8;i++){ if (I_O) send |= (1<<7); //Bit 7 von send setzen else send &= ~(1<<7); //Bit 7 von send löschen send = send >>1; //rechts verschieben wait(); SCLK =1; wait(); SCLK =0; }
Karl heinz Buchegger schrieb: > wieso send? > > Ich denke send repräsentiert deinen Eingangsport, von dem du das Bit > > abgreifst? > > Wieso I_O auf 0 oder 1 setzen? Wie ich schon erklärt habe, war dies die falsch Routine (mit dieser sende ich) :). Aber die andere ist ja auch schon drin.. Danke für die Tipps ich werde noch die änderungen vornehmen.
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.