www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Frage an die onewire spezis


Autor: Bernd (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: A. K. (prx)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Mit nur einem Sensor wird es deutlich einfacher.

Autor: Bernd (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nette Antwort :-) hast du es mal gemacht ? wieviel code ?

Autor: A. K. (prx)
Datum:

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

Autor: Bernd (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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 ?

Autor: Pete K. (pete77)
Datum:

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

Autor: Bernd (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: A. K. (prx)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Bernd (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: A. K. (prx)
Datum:

Bewertung
0 lesenswert
nicht 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:
      w1_command( READ );      // read command
      temp = w1_byte_rd();      // low byte
      temp |= (uint)w1_byte_rd() << 8;    // high byte
      if( ###sensortyp != DS18B20### )    // 9 -> 12 bit
        temp <<= 3;
      sprintf( s, "  T: %04X = ", temp );  // hex value
      uputs( s );
      sprintf( s, "%4d.%01døC", temp >> 4, (temp << 12) / 6553 ); // 0.1øC
      uputsnl( s );
    }

Autor: Bernd (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke für den Hinweis, das werde ich mal ausprobiern.

Besten Dank.

Autor: Christian H. (netzwanze) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: A. K. (prx)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ob sich das lohnt? Was nach den Streichungen übrig bleibt sieht 
(ungetestet) so aus:
bit w1_reset(void)
{
  bit err;

  W1_OUT &= ~(1<<W1_PIN);
  W1_DDR |= 1<<W1_PIN;
  DELAY( DELAY_US( 480 ));      // 480 us
  cli();
  W1_DDR &= ~(1<<W1_PIN);
  DELAY( DELAY_US( 66 ));
  err = W1_IN & (1<<W1_PIN);      // no presence detect
  sei();
  DELAY( DELAY_US( 480 - 66 ));
  if( (W1_IN & (1<<W1_PIN)) == 0 )    // short circuit
    err = 1;
  return err;
}

uchar w1_bit_io( bit b )
{
  cli();
  W1_DDR |= 1<<W1_PIN;
  DELAY( DELAY_US( 1 ));
  if( b )
    W1_DDR &= ~(1<<W1_PIN);
  DELAY( DELAY_US( 15 - 1 ));
  if( (W1_IN & (1<<W1_PIN)) == 0 )
    b = 0;
  DELAY( DELAY_US( 60 - 15 ));
  W1_DDR &= ~(1<<W1_PIN);
  sei();
  return b;
}

uint w1_byte_wr( uchar b )
{
  uchar i = 8, j;
  do{
    j = w1_bit_io( b & 1 );
    b >>= 1;
    if( j )
      b |= 0x80;
  }while( --i );
  return b;
}

uint w1_byte_rd( void )
{
  return w1_byte_wr( 0xFF );
}

void w1_command( uchar command )
{
  w1_reset();
  w1_byte_wr( SKIP_ROM );      // to all devices
  w1_byte_wr( command );
}

void start_meas( void ){
  if( W1_IN & 1<< W1_PIN ){
    w1_command( CONVERT_T, NULL );
    W1_OUT |= 1<< W1_PIN;
    W1_DDR |= 1<< W1_PIN;      // parasite power on -- nötig???
  }
}

// Temperatur in Schritten zu 0,5°C
int read_meas( void )
{
  int temp;
  w1_command( READ );      // read command
  temp = w1_byte_rd();      // low byte
  temp |= (uint)w1_byte_rd() << 8;  // high byte
}

Autor: Christian H. (netzwanze) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
OK, wenn das ausreicht.
Bitte mal ausprobieren ;-)

Autor: gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Bernd (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
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.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.