www.mikrocontroller.net

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


Autor: Sebastian (Gast)
Datum:

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

Autor: Anja (Gast)
Datum:

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

Autor: Bernhard R. (barnyhh)
Datum:

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

Autor: Sebastian (Gast)
Datum:

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

Autor: Sebastian (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
NACHTRAG :

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

:-))

Autor: g457 (Gast)
Datum:

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

Autor: Sebastian (Gast)
Datum:
Angehängte Dateien:

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

Autor: MaWin (Gast)
Datum:

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

Autor: Euro (Gast)
Datum:

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

Autor: g457 (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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:
$ 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
   text    data     bss     dec     hex filename
     72       0       0      72      48 crc8.o
   2305      10       0    2315     90b ds18x20.o
   2170       0       0    2170     87a main.o
    598       0       0     598     256 onewire.o
    420       0      69     489     1e9 uart.o
   5842      10     116    5968    1750 main.elf
..danach..
$ 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
   text    data     bss     dec     hex filename
     72       0       0      72      48 crc8.o
    796       8       0     804     324 ds18x20.o
    756       0       0     756     2f4 main.o
    598       0       0     598     256 onewire.o
    420       0      69     489     1e9 uart.o
   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

Autor: MaWin (Gast)
Datum:

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

Autor: Euro (Gast)
Datum:

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

Autor: MaWin (Gast)
Datum:

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

Autor: Sebastian (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
g457 schrieb:
> Autor:
> g457(Gast)

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

Autor: Peter Dannegger (peda)
Datum:

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

Autor: Sebastian (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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:
int empfang (void) {
int i = 0;
for (i=0; i<8; i++) {

wire_low();
_delay_us(1),
wire_high();
_delay_us(4);

if (PINC & (1<<WPIN))
zahl1 = zahl1 + 1;
//else
//zahl1 = 0; <-- überflüssig

zahl1 = zahl1 * 2; //2 für binär

while (!(PINC & (1<<WPIN))) {
_delay_us(2);
}
//_delay_us(80); ???
 }
 return zahl1;
} 

diese gibt einen :
unsigned int wert1 = empfang(); 
 aus.
ich kann aber auf einer SD nur bytes Schreiben.
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

Autor: g457 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> kannst du mit deine daten schicken

..quick'n'dirty.. nur zu Demozwecken..
$ diff ds18x20_demo*/main.c
56a57,61
> // TODO: this is a hack.. tidy up..
> #undef uart_puts_P
> #define uart_puts_P(x)        ((void)0)
> // end of hack
> 
$ diff ds18x20_demo*/ds18x20.h
8c8
< #define DS18X20_EEPROMSUPPORT
---
> // #define DS18X20_EEPROMSUPPORT
11c11
< #define DS18X20_VERBOSE
---
> //#define DS18X20_VERBOSE

HTH und HF beim weiteren entschlacken

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.