mikrocontroller.net

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


Autor: Gerhard (Gast)
Datum:

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

Autor: Bernd (Gast)
Datum:

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

Autor: Gerhard (Gast)
Datum:

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

Autor: Bernd (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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:
uint8_t OneWireReset (void)
{
    uint8_t err;

    OneWireOut &=~(1 << OneWirePIN);                  // W1 pin auf Low
    OneWireDDR |= (1 << OneWirePIN);                  // W1 pin auf Ausgang
    _delay_us (480);
    cli();
    OneWireDDR &=~(1 << OneWirePIN);                  // W1 pin auf Eingang
    _delay_us (66);
    err = OneWireIN & (1 << OneWirePIN);              // no presence detect
    sei();
    _delay_us (480-66);                               // 414 us warten
    if ((OneWireIN & (1 << OneWirePIN)) == 0) {       // short circuit
        err = 1;
    }
    return err;
}

uint8_t OneWireBit_IO (uint8_t b)
{
    cli ();
    OneWireDDR |= (1 << OneWirePIN);                  // W1 pin auf Ausgang
    _delay_us (1);
    if (b)
        OneWireDDR &=~(1 << OneWirePIN);              // W1 pin auf Eingang
    _delay_us (15-1);                                 // 14 us warten
    if ((OneWireIN & (1 << OneWirePIN)) == 0)
        b = 0;
    _delay_us (60-15);                                // 45 us warten
    OneWireDDR &=~(1 << OneWirePIN);                  // W1 pin auf Eingang
    sei ();
    return b;
}

uint16_t OneWireWriteByte (uint8_t b)
{
    uint8_t i = 8, j;

    do {
        j = OneWireBit_IO (b & 1);
        b >>= 1;
        if (j) {
            b |= 0x80;
        }
    } while (--i);
    return b;
}

int16_t OneWireReadByte (void)
{
    return OneWireWriteByte (0xFF);
}

void OneWireCommand (uint8_t command)
{
    OneWireReset ();
    OneWireWriteByte (SKIP_ROM);                     // to all devices
    OneWireWriteByte (command);
}

Autor: Bernd (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Dann noch:
int16_t getTempDS18x20 (void)
{
    int16_t temp;

    if (OneWireIN & 1 << OneWirePIN) {
        OneWireCommand (CONVERT_T);
        OneWireOut |= 1 << OneWirePIN;
        OneWireDDR |= 1 << OneWirePIN;               // parasite power on
    }
    _delay_ms (750);

    OneWireCommand (READ);
    temp = OneWireReadByte ();                       // low byte
    temp |= OneWireReadByte () << 8;                 // high byte
    return temp;
}

Autor: Bernd (Gast)
Datum:

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

Autor: Peter Dannegger (peda)
Datum:

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

Autor: Bernd (Gast)
Datum:

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

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.