Forum: Mikrocontroller und Digitale Elektronik DS18S20 Bytes auslesen


von Paul S. (paulszymanski)


Lesenswert?

Hallo,
ich habe für den DS18S20 eine Funktion geschrieben, die die einzelnen 
Bits ausließt. Diese funktionert auch (wenn ich die 16 mal 
hintereinander in einer Schleife ausführe und jedes mal den Ausgelesenen 
Bit über uart an mein Terminal sende stimmt die Bitfolge mit der 
Temperatur überein).

Nun wollte ich jeweils 8 bit ein eine vorzeichenlose integer Variable 
abspeichern:
1
bool ow_ReadBit(void);
2
3
unsigned int ow_ReadByte(void) {
4
  uint8_t buffer = 0;
5
  for (uint8_t i = 0; i<8; i++) {
6
    buffer |= ow_ReadBit();     //LS Bit speichern 
7
    for (int b = 0; b<7; b++) {
8
      buffer <<= 1;       //bitfolge nach links schieben
9
    }
10
  }
11
  return buffer;
12
}

Um zu sehen ob es funktioniert hat dient folgende Funktion:
1
void ow_binToBinChar(unsigned int bin) { //unsinnigen namen bitte ignorieren
2
  
3
  for (int i = 0; i<8; i++) {
4
    
5
    if ((bin & 1) == 1) {
6
      sendchar('1');
7
    } else if ((bin & 1) == 0){
8
      sendchar('0');
9
    }
10
    bin >>= 1;
11
  } 
12
}
13
14
15
// in der hauptfunktion steht:
16
ow_binToBinChar(ow_ReadByte());

Nun kommt im terminal aber immer 00000001 an. Erwartet habe ich jedoch 
10011000.

Könnt ihr mir einen Hinweis auf meinen Fehler geben? Ich komme da nicht 
drauf :(

LG
Paul

von Uwe (de0508)


Lesenswert?

Hallo,

ich verweise auf dies hier:
1
    for (int b = 0; b<7; b++) {
2
      buffer <<= 1;       //bitfolge nach links schieben
3
    }

Klar? - nein dann schau mal hier:
1
unsigned char ow_ReadByte(void) {
2
  unsigned char buffer = 0;
3
4
  for (unsigned char i = 0; i < 8; i++) {
5
    buffer |= ow_ReadBit();     //LS Bit speichern 
6
    buffer <<= 1;       //bitfolge nach links schieben
7
  }
8
  return buffer;
9
}

Diese Funktion würde ich etwas kürzer schreiben:
1
void ow_binToBinChar(unsigned char bin) {
2
  
3
  for (unsigned char i = 0; i<8; i++) {
4
    sendchar((bin & 1) ? '1' : '0');
5
    bin >>= 1;
6
  }
7
8
}

von Paul S. (paulszymanski)


Lesenswert?

Oh nein -.- Bin ich blind. kopf gegen die wand

Okay so funktioniert es natürlich auch.

Danke für den Hinweis! Danke auch für die kurzschreibweise!

Sorry für diesen Fail,
LG
Paul

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.