www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Bit von Port einlesen


Autor: Grossuhr (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Grossuhr (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Bernd N (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert

#define meinPin           P2_7

meinPin = 1;
meinPin = 0;


Beim einlesen schiebst Du BIT für BIT in ein Byte. Der 8051 ist 
BITadressierbar das macht das Ganze recht einfach.

Autor: Grossuhr (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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..

Autor: Bernd N (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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).

Autor: Grossuhr (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: Marcus (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Frank S. (tic226)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: P. S. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Bernd N (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Marcus Overhagen (marcus6100)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Bernd N (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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 :-)

Autor: Grossuhr (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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 :)

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
#include <reg51.h>


sbit SPI_CLK = P2^7;
sbit SPI_MISO_PIN = P2^6;

#define uint8_t unsigned char


uint8_t shift_in( void )        // receive byte
{
  uint8_t i, b;

  for( i = 8; i; i-- ){         // 8 bits
    b >>= 1;
    SPI_CLK = 1;
    if( SPI_MISO_PIN )
      b |= 0x80;                // MSB last
    SPI_CLK = 0;
  }
  return b;
}


Peter

Autor: Grossuhr (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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;
}

Autor: Peter Dannegger (peda)
Datum:

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


Peter

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Grossuhr (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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;
  }

Autor: Grossuhr (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.