DS18S20 Bytes auslesen

OP #2347025
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
#2347032
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
}

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren