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

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.

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.