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
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
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?
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
NACHTRAG : ich rede vom Flash der voll ist. nicht vom RAM. :-))
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
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
> 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.
@ 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).
> 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
> 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?
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
> 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 :-).
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
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
> 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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.