Forum: Mikrocontroller und Digitale Elektronik DS1820 libs, sehr speicherlastig??


von Gerhard (Gast)


Lesenswert?

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

von Bernd (Gast)


Lesenswert?

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.

von Gerhard (Gast)


Lesenswert?

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

von Bernd (Gast)


Lesenswert?

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
}

von Bernd (Gast)


Lesenswert?

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
}

von Bernd (Gast)


Lesenswert?

Deine Display UART Angabe kommt mir ein bischen viel vor, hab mein 
Projekt mal rausgekramt und onewire + display + adc inklusive 
linearisierungsfunktion 1200 Byte.

von Peter D. (peda)


Lesenswert?

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

von Bernd (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.