Forum: Mikrocontroller und Digitale Elektronik ATMEGA8 TEMPSensor --> Codegröße zu groß


von Sebastian (Gast)


Lesenswert?

Hallo

Mit welcher Art sensor schaffe ich es den Code sehr klein zu halten?
ich habe einen DS1820 am ATMEGA8 nur leider ist der code immer ca 50% 
(4K).
Mit I²C kenne ich mich nicht aus aber kann man da Code sparen ?
oder Kennt jemand für DS1820 1wire einen Simplen code zur abfrage?
Analoge Sensoren denke ich mal benötigen das wenigste an code (AD 
wandler abfragen und umrechnen oder so) aber analog ist der 
schaltaufwand recht hoch habe ich gelesen.

angepeilte codegröße für einen sensor unter 1KB

Danke
Sebastian

von Anja (Gast)


Lesenswert?

Sebastian schrieb:
> ich habe einen DS1820 am ATMEGA8 nur leider ist der code immer ca 50%

irgendwas machst Du falsch. Den notwendigen Code schätze ich hierfür auf 
500 Bytes.

Sebastian schrieb:
> aber analog ist der
> schaltaufwand recht hoch habe ich gelesen.

Ich brauche einen Pull-up-Widerstand und einen NTC.
Also ist der Bauteilaufwand genauso wie beim DS1820.

Gruß Anja

von Bernhard R. (barnyhh)


Lesenswert?

Sebastian schrieb:
> Mit welcher Art sensor schaffe ich es den Code sehr klein zu halten?
> ich habe einen DS1820 am ATMEGA8 nur leider ist der code immer ca 50%
> (4K).

Die Kristallkugel sagt: Zeile 42!

Meine Erfahrung sagt: Das, was Du wissen willst, steht wunderschön in 
den verschiedenen Listings des Compilers (und in Deinem Source-Code). 
Lies es!

Bernhard
BTW: Wozu brauchst Du den Rest vom Hauptspeicher?

von Sebastian (Gast)


Lesenswert?

Hallo
ich möchte einen Datenlogger bauen.
die SD - Karte läuft schon aber ich habe nur noch wenig Speicher.
die ds1820 routinen die so als code hier im forum zu finden sind sind 
immer ca 70-90% von 8KB. deshalb kann ich so einfach nicht nutzen. 
leider bin ich noch anfänger. Kennt jemand einen simple DS1820 routine 
ohne gleich mit Uart und display. Die meisten code vorlagen binden sehr 
viele C++ daten mit ein. Ach ja stimmt ich tippe nicht in ASM sondern in 
C.

Danke und frohe weihnacht
Sebastan

von Sebastian (Gast)


Lesenswert?

NACHTRAG :

ich rede vom Flash der voll ist.
nicht vom RAM.

:-))

von g457 (Gast)


Lesenswert?

Ergänzung zum NACHTRAG : Du enthältst uns noch immer den Code vor.

Ich ∗vermute∗ Du hast die Fließkommalib dazugelinkt, aber die Details 
finden sich wie so oft nur im Code..

HF

von Sebastian (Gast)


Angehängte Dateien:

Lesenswert?

Hallo da bin ich wieder

also ich habe jetzt einmal die Ds1820 routinen aus dem Forum hier 
angehangen. Diese Fragen den DS1820 ab und geben alles auf Uart aus.
Dieser code benötigt schon 5900 bytes. Dann habe ich alles mit Uart 
entfernt aber unter 4KB komme ich nicht.

@anja: die hast geschrieben 500 bytes ... da bin ich noch sehr weit weg 
davon. Faktor 8.

könnt ihr mir tips geben.

leider bin ich noch nicht soweit ein byte auf einen pin vom avr zu 
senden.
in bascom habe ich das viel simpler gesehen.
-init
-sensor ansprechen
-sensor lesen
-fertig

in c habe ich immer nur recht lange routinen gefunden die ich nicht ganz 
vertstehe.

grüße
sebastian

von MaWin (Gast)


Lesenswert?

> Mit welcher Art sensor schaffe ich es den Code sehr klein zu halten?

Ganz klar mit einem Analogsensor, wie einem NTC, PTC, KTY, RTD,
denn da musst du nur den Wandlerwert des A/D-Wandlers einlesen
und das kostet nur wenige Bytes.
Ob der Wandlerwert dann der Temperatur in GradC entspricht, oder
noch umgerechnet werden muss, hängt natürlich von der äusseren
Beschaltung ab, ein einstellbarer Verstärker mit einem OpAmp
lohnt immer damit man den Bereich anpassen kann.

von Euro (Gast)


Lesenswert?

@ Mawin / alle Analogfans

vergiss nicht die grausige Nichtlinearität der meisten günstigen 
Temperaturelemente.

Wenns halbwegs genau werden soll Platinsensoren (kann man natürlich mit 
entsprechender beschaltung auch SEHR genau machen mit denen).

von g457 (Gast)


Lesenswert?

> könnt ihr mir tips geben.

..ich hab mal auf die Schnelle (hoffentlich die Semantik erhaltend :-) 
..:
- DS18X20_EEPROMSUPPORT deaktiviert
- DS18X20_VERBOSE deaktiviert
- in main.c die uart_puts_P() umgebogen..

..davor:
1
$ rm *o *elf ; for f in *c ; do avr-gcc -Wall -mmcu=atmega8 -Os -DF_CPU=10000000UL -o ${f%.c}.o -c $f ; done ; avr-gcc -o main.elf *o ; avr-size *o *elf
2
   text    data     bss     dec     hex filename
3
     72       0       0      72      48 crc8.o
4
   2305      10       0    2315     90b ds18x20.o
5
   2170       0       0    2170     87a main.o
6
    598       0       0     598     256 onewire.o
7
    420       0      69     489     1e9 uart.o
8
   5842      10     116    5968    1750 main.elf
..danach..
1
$ rm *o *elf ; for f in *c ; do avr-gcc -Wall -mmcu=atmega8 -Os -DF_CPU=10000000UL -o ${f%.c}.o -c $f ; done ; avr-gcc -o main.elf *o ; avr-size *o *elf
2
   text    data     bss     dec     hex filename
3
     72       0       0      72      48 crc8.o
4
    796       8       0     804     324 ds18x20.o
5
    756       0       0     756     2f4 main.o
6
    598       0       0     598     256 onewire.o
7
    420       0      69     489     1e9 uart.o
8
   2918       8     116    3042     be2 main.elf

(Das vorhandene Makefile habe ich grob vorsätzlich ignoriert!) DS1820 
und main sind also jeweils etwa um den Faktor 3 geschrumpft. Viel Spaß 
beim weiteren optimieren.

HTH

von MaWin (Gast)


Lesenswert?

> Wenns halbwegs genau werden soll Platinsensoren

Alle genannten Sensoren sind genauer auswertbar
als DS1820 und ähnliche Digitalsensoren,
also WENN es um Genauigkeit geht, dann bleibt
sowieso keine andere Wahl, Pt100 RTD ist natürlich
"das genaueste".

> vergiss nicht die grausige Nichtlinearität
> der meisten günstigen Temperaturelemente.

Ja nun, in Grundschulmathematik nicht aufgepasst ?
Bei 10 bit Auflösung könnte man eine 1024er Einträge
grosse Tabelle machen und nachgucken, wenn einem das
Rechnen zu schwer fällt.

Aber hier sind doch alles hochqualifizierte masslos
unterbezahlte oder gar nicht beschäftigte Ingenieure
unterwegs die doch an einer simplen Interpolation
nicht scheitern werden, oder?

von Euro (Gast)


Lesenswert?

das Problem bei der interpolation ist das man sehr kleine Koeffizienten 
bei hohem Polynomgrad bekommt.

Ich habe es auhc immer mit 'ner Tabelle gelöst. Aber 1024 Werte 
erfordern (wenn man sich nicht mit 8Bit Auflösung begnügt) nun mal 2 kB 
Speicher...und wir waren beim Codegrößenoptimieren.

Und schon wirds am ende größer als das bissche I²C ;)

P.S.: Noch bin ich Student

von MaWin (Gast)


Lesenswert?

> kleine Koeffizienten bei hohem Polynomgrad

Na ja, alles eine Frage der Genauigkeit.
Wenn der Sensor nicht zufälligerweise einer bekannten Funktion folgt,
dann wählt man oft lineare Interpolation mit wenigen Stützstellen um 
z.B. genauer als 1 GradC werden zu können.
Dazu ist nichts anderes ausser
y[i]+(x-x[i])*(y[i+1]-y[i])/(x[i+1]-x[i])
notwendig, also so 6 Operationen, das sollte doch in weniger als 
Kilobyte zu schaffen sein :-).

von Sebastian (Gast)


Lesenswert?

g457 schrieb:
> Autor:
> g457(Gast)

DANKE g457(Gast) ... kannst du mit deine daten schicken

von Peter D. (peda)


Lesenswert?

Bei Analogsensoren wird aber die Verkabelung deutlich teurer (4-Leiter 
bzw. Ausgleichsleitung) und die Schaltung deutlich aufwendiger und man 
muß sie auch erstmal kalibrieren.


Peter

von Sebastian (Gast)


Lesenswert?

Hallo

also Analog kommt nicht mehr in frage.
ich mach ds1820 ... den ich möchte mehrer sensoren auswerten.
und die ds1820 habe ich schon oft verbaut.
ich habe jetzt eine DS1820 routine aus dem forum eingebaut und komme auf 
: Program:    6378 bytes (77.9% Full). Leider läuft noch nicht alles.

es gibt eine Empfang Routine:
1
int empfang (void) {
2
int i = 0;
3
for (i=0; i<8; i++) {
4
5
wire_low();
6
_delay_us(1),
7
wire_high();
8
_delay_us(4);
9
10
if (PINC & (1<<WPIN))
11
zahl1 = zahl1 + 1;
12
//else
13
//zahl1 = 0; <-- überflüssig
14
15
zahl1 = zahl1 * 2; //2 für binär
16
17
while (!(PINC & (1<<WPIN))) {
18
_delay_us(2);
19
}
20
//_delay_us(80); ???
21
 }
22
 return zahl1;
23
}

diese gibt einen :
1
unsigned int wert1 = empfang();
 aus.
ich kann aber auf einer SD nur bytes Schreiben.
1
mmc_write_byte(0x0d);

Wie zerlegt man einen solchen wert? ich möchte mal was auf der SD karte 
sehen. dann kann ich mich ans ziel tasten ....

danke

von g457 (Gast)


Lesenswert?

> kannst du mit deine daten schicken

..quick'n'dirty.. nur zu Demozwecken..
1
$ diff ds18x20_demo*/main.c
2
56a57,61
3
> // TODO: this is a hack.. tidy up..
4
> #undef uart_puts_P
5
> #define uart_puts_P(x)        ((void)0)
6
> // end of hack
7
> 
8
$ diff ds18x20_demo*/ds18x20.h
9
8c8
10
< #define DS18X20_EEPROMSUPPORT
11
---
12
> // #define DS18X20_EEPROMSUPPORT
13
11c11
14
< #define DS18X20_VERBOSE
15
---
16
> //#define DS18X20_VERBOSE

HTH und HF beim weiteren entschlacken

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.