Frage an die onewire spezis

Gast #1456874
Lesenswert?

Hallo zusammen,

ich möchte nen DS18S20 auswerten habe aber nur noch rund 400Byte an 
Flash übrig. Ich habe mir mal den Beispielcode von Peter angeschaut 
kenne aber das Protokoll noch nicht in der Tiefe.

Bei dem genannten Beispiel ist das gesamte Protokoll implementiert. 
Gibts nen quick & dirty für die Auswertung von "nur einem" DS18S20 ?

Mir gehts bei der Frage um eine Einschätzung, kann mich ja dann daran 
versuchen.
Gast #1456892
Lesenswert?

Muß in C sein... na, werde wohl selber testen aber sorichtig kann ich 
noch nicht erkennen was man aussparen kann, Peters Code hat nichts 
überflüssiges soweit ich es beurteilen kann.

Vielleicht noch jemand ne Erfahrung in C ?
Gast #1456912
Lesenswert?

Pete, hab ich schon reichlich :-) bin von ehemals 2052 (eh zuviel) auf 
1650 Bytes runter, mehr geht nicht. Vielleicht noch nen paar bytes aber 
das reicht nicht.

Bin derzeit bei 2340 und muß herunter oder eben das Ganze lassen.
#1456929
Lesenswert?

Die ID ist nicht nötig, da bei nur einem Sensor dieser mit SKIP ROM ohne 
ID adressiert werden kann.

Was 1wire.c angeht:
  w1_rom_search entfällt ersatzlos.
  In w1_command entfällt id und der ganze Teil mit id != 0.

read_meas dampft ein zu was ähnlichem wie:
1
      w1_command( READ );      // read command
2
      temp = w1_byte_rd();      // low byte
3
      temp |= (uint)w1_byte_rd() << 8;    // high byte
4
      if( ###sensortyp != DS18B20### )    // 9 -> 12 bit
5
        temp <<= 3;
6
      sprintf( s, "  T: %04X = ", temp );  // hex value
7
      uputs( s );
8
      sprintf( s, "%4d.%01døC", temp >> 4, (temp << 12) / 6553 ); // 0.1øC
9
      uputsnl( s );
10
    }
#1456974
Lesenswert?

Ob sich das lohnt? Was nach den Streichungen übrig bleibt sieht 
(ungetestet) so aus:
1
bit w1_reset(void)
2
{
3
  bit err;
4

5
  W1_OUT &= ~(1<<W1_PIN);
6
  W1_DDR |= 1<<W1_PIN;
7
  DELAY( DELAY_US( 480 ));      // 480 us
8
  cli();
9
  W1_DDR &= ~(1<<W1_PIN);
10
  DELAY( DELAY_US( 66 ));
11
  err = W1_IN & (1<<W1_PIN);      // no presence detect
12
  sei();
13
  DELAY( DELAY_US( 480 - 66 ));
14
  if( (W1_IN & (1<<W1_PIN)) == 0 )    // short circuit
15
    err = 1;
16
  return err;
17
}
18

19
uchar w1_bit_io( bit b )
20
{
21
  cli();
22
  W1_DDR |= 1<<W1_PIN;
23
  DELAY( DELAY_US( 1 ));
24
  if( b )
25
    W1_DDR &= ~(1<<W1_PIN);
26
  DELAY( DELAY_US( 15 - 1 ));
27
  if( (W1_IN & (1<<W1_PIN)) == 0 )
28
    b = 0;
29
  DELAY( DELAY_US( 60 - 15 ));
30
  W1_DDR &= ~(1<<W1_PIN);
31
  sei();
32
  return b;
33
}
34

35
uint w1_byte_wr( uchar b )
36
{
37
  uchar i = 8, j;
38
  do{
39
    j = w1_bit_io( b & 1 );
40
    b >>= 1;
41
    if( j )
42
      b |= 0x80;
43
  }while( --i );
44
  return b;
45
}
46

47
uint w1_byte_rd( void )
48
{
49
  return w1_byte_wr( 0xFF );
50
}
51

52
void w1_command( uchar command )
53
{
54
  w1_reset();
55
  w1_byte_wr( SKIP_ROM );      // to all devices
56
  w1_byte_wr( command );
57
}
1
void start_meas( void ){
2
  if( W1_IN & 1<< W1_PIN ){
3
    w1_command( CONVERT_T, NULL );
4
    W1_OUT |= 1<< W1_PIN;
5
    W1_DDR |= 1<< W1_PIN;      // parasite power on -- nötig???
6
  }
7
}
8

9
// Temperatur in Schritten zu 0,5°C
10
int read_meas( void )
11
{
12
  int temp;
13
  w1_command( READ );      // read command
14
  temp = w1_byte_rd();      // low byte
15
  temp |= (uint)w1_byte_rd() << 8;  // high byte
16
}
Gast #1456999
Lesenswert?

nutzt du sonst irgendwie sprintf ??
allein das sprintf hatte bei einem test bei mir fast 400byte ausgemacht
durchd as einbinden der lib
geht eben nur dann wenns nirgends woanders steht

wenige sprintf lassen sich schnell einafch ersetzen
Gast #1457247
Lesenswert?

Erst einmal vielen Dank für die nützlichen Hinweise... das Paßt und es 
freut mich das es Möglich ist. Ich hätte mich sonst durchs Protokoll 
wühlen müssen. Ich kanns heute nicht mehr testen, wird wohl nächste 
Woche.

Also noch einmal, Danke.

Schönes Wochenend

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