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