Forum: Mikrocontroller und Digitale Elektronik Frage an die onewire spezis


von Bernd (Gast)


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.

von (prx) A. K. (prx)


Lesenswert?

Mit nur einem Sensor wird es deutlich einfacher.

von Bernd (Gast)


Lesenswert?

Nette Antwort :-) hast du es mal gemacht ? wieviel code ?

von (prx) A. K. (prx)


Lesenswert?

Ich habe das mal gemacht, mindestens in Assembler, ob auch in C weiss 
ich nicht mehr sicher. In Assembler reicht es mit Sicherheit.

von Bernd (Gast)


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 ?

von Pete K. (pete77)


Lesenswert?

Kannst Du nicht an anderer Stelle noch etwas einsparen? Wieviele Bytes 
sind denn zuviel?

von Bernd (Gast)


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.

von (prx) A. K. (prx)


Lesenswert?

Alles was mit dem ROM Search zu tun hat kann raus (w1_rom_search oder 
so), und für die Adressierung des Sensors wird statt der ROM ID ein 
anderes Kommando verwendet. Mehr dazu ggf. später.

von Bernd (Gast)


Lesenswert?

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.

von (prx) A. K. (prx)


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
    }

von Bernd (Gast)


Lesenswert?

Danke für den Hinweis, das werde ich mal ausprobiern.

Besten Dank.

von Christian H. (netzwanze) Benutzerseite


Lesenswert?

Um Speicherplatz zu sparen, schau Dir mal den DS2480 an. Das ist ein 
1-Wire-Master, der über RS232 angesteuert wird. Du sparst Dir damit das 
ganze Bitgewackel.

Alternativ kannst Du auch mal den DS2482 (-100 oder -800) ansehen. Das 
ist ebenfalls ein 1-Wire-Master jedoch für I2C.

von (prx) A. K. (prx)


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
}

von Christian H. (netzwanze) Benutzerseite


Lesenswert?

OK, wenn das ausreicht.
Bitte mal ausprobieren ;-)

von gast (Gast)


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

von Bernd (Gast)


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

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.