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.
Ich habe das mal gemacht, mindestens in Assembler, ob auch in C weiss ich nicht mehr sicher. In Assembler reicht es mit Sicherheit.
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 ?
Kannst Du nicht an anderer Stelle noch etwas einsparen? Wieviele Bytes sind denn zuviel?
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.
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.
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 | }
|
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.
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 | }
|
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.