Forum: Mikrocontroller und Digitale Elektronik Bit von Port einlesen


von Grossuhr (Gast)


Lesenswert?

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

von Karl H. (kbuchegg)


Lesenswert?

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?

von Grossuhr (Gast)


Lesenswert?

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

von Bernd N (Gast)


Lesenswert?

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.

von Grossuhr (Gast)


Lesenswert?

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..

von Bernd N (Gast)


Lesenswert?

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).

von Grossuhr (Gast)


Lesenswert?

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...

von Marcus (Gast)


Lesenswert?

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.

von Frank S. (tic226)


Lesenswert?

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.

von P. S. (Gast)


Lesenswert?

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.

von Bernd N (Gast)


Lesenswert?

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.

von Marcus O. (marcus6100)


Lesenswert?

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.

von Bernd N (Gast)


Lesenswert?

>> 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 :-)

von Grossuhr (Gast)


Lesenswert?

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 :)

von Peter D. (peda)


Lesenswert?

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

von Grossuhr (Gast)


Lesenswert?

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;
}

von Peter D. (peda)


Lesenswert?

Im ersten Post wolltest Du doch einlesen und nun gibst Du aber aus.
Du solltest Dich mal entscheiden.


Peter

von Karl H. (kbuchegg)


Lesenswert?

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.

von Grossuhr (Gast)


Lesenswert?

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;
  }

von Grossuhr (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.