Halli zusammen, ich habe heute hier diverse ds1820 libs und code-schnipsel mal durch winavr geschoben. dabei fiel mir auf das das produkt am ende immer so um die 4k hat. ist das normal? oder gibt es vielleicht einen weg diesen teil ein wenig mehr zu schrumpfen? mein teil mit lcd-steuerung und uart hat ja auch schon einige kb (oem, 2,5 glaube ich) und wenn der teil von den ds1820 so reinhaut, hab ich zuwenig platz im atmega48 :/ muss ich nun den grossen bruder mit 8 oder 16k flash auspacken, um lcd, ds1820 und uart und dach und fach zu bekommen? das wurde hier ja schon 1000 mal programmiert, vielleicht hat jemand seine programm-groesse noch im kopf. danke, gerhard
Hatte vor einiger Zeit das gleiche Problem, kannst Du auf ca. 270 Bytes schrumpfen, kommt darauf an was du machen willst. Ein DS1820 oder mehrere am gleichen Bus.
Ich habe vom Prinzip (ich lasse mich auch gerne von anderen Sachen überzeugen) vor: 2 DS1820 über 1wire zu messen. Oder ist es vielleicht sogar Speichersparender wenn ich sie einzelnd an jeweils einen eigenen pin am avr hänge? gruss, gerhard
Ja, genau so ist es den dann kannst du es erheblich einfacher machen. Ich hatte Peter Daneggers Code hierfür verwendet und viel mehr als das hier brauchst du nicht:
1 | uint8_t OneWireReset (void) |
2 | {
|
3 | uint8_t err; |
4 | |
5 | OneWireOut &=~(1 << OneWirePIN); // W1 pin auf Low |
6 | OneWireDDR |= (1 << OneWirePIN); // W1 pin auf Ausgang |
7 | _delay_us (480); |
8 | cli(); |
9 | OneWireDDR &=~(1 << OneWirePIN); // W1 pin auf Eingang |
10 | _delay_us (66); |
11 | err = OneWireIN & (1 << OneWirePIN); // no presence detect |
12 | sei(); |
13 | _delay_us (480-66); // 414 us warten |
14 | if ((OneWireIN & (1 << OneWirePIN)) == 0) { // short circuit |
15 | err = 1; |
16 | }
|
17 | return err; |
18 | }
|
19 | |
20 | uint8_t OneWireBit_IO (uint8_t b) |
21 | {
|
22 | cli (); |
23 | OneWireDDR |= (1 << OneWirePIN); // W1 pin auf Ausgang |
24 | _delay_us (1); |
25 | if (b) |
26 | OneWireDDR &=~(1 << OneWirePIN); // W1 pin auf Eingang |
27 | _delay_us (15-1); // 14 us warten |
28 | if ((OneWireIN & (1 << OneWirePIN)) == 0) |
29 | b = 0; |
30 | _delay_us (60-15); // 45 us warten |
31 | OneWireDDR &=~(1 << OneWirePIN); // W1 pin auf Eingang |
32 | sei (); |
33 | return b; |
34 | }
|
35 | |
36 | uint16_t OneWireWriteByte (uint8_t b) |
37 | {
|
38 | uint8_t i = 8, j; |
39 | |
40 | do { |
41 | j = OneWireBit_IO (b & 1); |
42 | b >>= 1; |
43 | if (j) { |
44 | b |= 0x80; |
45 | }
|
46 | } while (--i); |
47 | return b; |
48 | }
|
49 | |
50 | int16_t OneWireReadByte (void) |
51 | {
|
52 | return OneWireWriteByte (0xFF); |
53 | }
|
54 | |
55 | void OneWireCommand (uint8_t command) |
56 | {
|
57 | OneWireReset (); |
58 | OneWireWriteByte (SKIP_ROM); // to all devices |
59 | OneWireWriteByte (command); |
60 | }
|
Dann noch:
1 | int16_t getTempDS18x20 (void) |
2 | {
|
3 | int16_t temp; |
4 | |
5 | if (OneWireIN & 1 << OneWirePIN) { |
6 | OneWireCommand (CONVERT_T); |
7 | OneWireOut |= 1 << OneWirePIN; |
8 | OneWireDDR |= 1 << OneWirePIN; // parasite power on |
9 | }
|
10 | _delay_ms (750); |
11 | |
12 | OneWireCommand (READ); |
13 | temp = OneWireReadByte (); // low byte |
14 | temp |= OneWireReadByte () << 8; // high byte |
15 | return temp; |
16 | }
|
Deine Display UART Angabe kommt mir ein bischen viel vor, hab mein Projekt mal rausgekramt und onewire + display + adc inklusive linearisierungsfunktion 1200 Byte.
Gerhard schrieb: > ich habe heute hier diverse ds1820 libs und code-schnipsel mal durch > winavr geschoben. dabei fiel mir auf das das produkt am ende immer so um > die 4k hat. Das kann man erheblich besser. Ich hab mal ein Testprogramm geschrieben (Ausgabe mehrerer Sensoren über die UART), das brauchte insgesamt 2,5kB. Davon waren allerdings 1,5kB die sprintf - Library. In der Codesammlung ist auch ne Routine zur Zahlenausgabe, die deutlich sparender ist als sprintf. Die Sensoren können alle am selben Pin hängen, mein ROM-Search ist 136 Byte groß. > ist das normal? oder gibt es vielleicht einen weg diesen teil ein wenig > mehr zu schrumpfen? Schau mal in die Codesammlung. > mein teil mit lcd-steuerung und uart hat ja auch schon einige kb (oem, > 2,5 glaube ich) und wenn der teil von den ds1820 so reinhaut, hab ich > zuwenig platz im atmega48 :/ Der reicht dicke aus. Peter
Habs der Einfachheit halber hier geposted, brauchte nur einen DS1820 und dann fliegt ne Menge raus. Wie gesagt, seine Angabe zum bestehenden Code ist schon verdächtig.
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.