Frage an die onewire spezis

Gast #1456874
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
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
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.
Gast
Ja, mehr :-) Spass beiseite, wenn ich das RomSearche herausnehme wie 
soll ich dann an die ID kommen, wie gesagt, kenne das Protokoll nicht in 
der Tiefe, danke dennoch für die Idee.
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
    }
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
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
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

Eine eigene Frage? Dieser Thread ist über 17 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.