unsigned char zu kurz

OP #2787240
Lesenswert?

Guten Tag an alle,

ich möchte einen Array für ca. 1Mio Werte anlegen. Leider geht dies 
nicht mit einem Unsigned char, da der nur 256 Werte Speichern kann! Ich 
möchte nun wie gesagt 1Mio werte abfangen.

Was kann ich da alternativ zur unsigned char benutzen?

Mfg
OP #2787264
Lesenswert?

Hallo,

ich möchte eine langzeit gleitende Mittelwertbildung für einen ADC wert 
implementieren.

Thread: "ADC Mittelwert bilden in C"

Hab das C-Code aus der Seite RN-Wissen übernommen. Die Arrays mit dem 
Datentyp unsigned char sind zu kurz für eine langzeit Mittelwert.

Ein durchlauf meines Programms dauert ca.40us..ich möchte aber Werte bei 
60s Bilden. Das heisst 60s/40us=1,5Mio Werte...
#2787280
Lesenswert?

el pistolero schrieb:
> Die Arrays mit dem
> Datentyp unsigned char sind zu kurz für eine langzeit Mittelwert.

Das verstehe ich nicht ganz.

Man kann ein Array aus unsigned char mit 1 Mio. Elementen anlegen:
1
   unsigned char aDaten[1000000];

vorausgesetzt, man hat genügend Speicher zur Verfügung. Auf kleinen 
Microcontrollern ist das meistens nicht der Fall.

Auf der anderen Seite geben ADCs häufig mehr als nur 8 Bit pro Meßwert 
zurück - die passen dann natürlich nicht in ein unsigned char.

Angenommen, dein ADC erzeugt 12 Bit pro Meßwert, dann mußt du statt 
unsigned char eben unsigned int, oder mehr nehmen.
1
   unsigned int aDaten[1000000];

Voraussetzung ist natürlich, daß du 2 Mio. Byte freien Speicher hast.
#2787283
Lesenswert?

el pistolero schrieb:
> Ich habe schon unsigned long benutzt, der compiler(C18) macht das aber
> nicht mit!

Welcher PIC18 hat denn 4MB RAM?


el pistolero schrieb:
> ich möchte aber Werte bei
> 60s Bilden.

Du solltest mal etwas Realität tanken.
60s Meßverzögerung sind für einen Menschen zu langsam.
Und alle 40µs ein neuer Wert ist nicht ablesbar, also viel zu schnell.

Stelle vernünftige Anforderungen, dann klappt das auch mit dem PIC.


Peter
#2787373
Lesenswert?

ausserdem will er " gleitende Mittelwertbildung"

immer über die jeweils letzten 1,5 Mio messwerte

man muss also wohl eher zuerst mal jeweils über 1 sekunde den mittelwert 
rechnen

mit

 y = (y+ mw*(n-1))/n )
wobei da eine klammer fehlt!




(das ganze natürlich mit GLEITKOMMA zahlen!)

oder einfach alles addieren, falls es sich mit longint ausgeht, und erst 
zum schluss durch n dividieren


und  dann eben die letzten  60 messwerte speichen, und darüber nochmal 
den mittelwert..
OP #2787463
Lesenswert?

So langsam verstehe ich das ganze..

mit dem speicher habe ich mich versehen..der uc hat noch einen 3540Byte 
zur verfügung.

Anbei habe ich gerade eine Blockschaltbild gezeichnet.

Die Anwendung habe ich in dem Thread " ADC Mittelwert bilden in C" 
beschrieben.

Es ist für 12 kap. Tasten. Beim Tastendruck wird die Spannung  geringer. 
Das Code war so, dass ich eine Feste Schwelle bestimmt habe und sobald 
dies unterschritten wurde soll die LED leuchten(if(ADCwert < 400) 
LED=ON)

Leider bleibt die Schwelle nicht immer gleich, deshalb wollte ich einen 
dynamische schwelle berechnen über eine bestimmte zeit.

Der Karl hatte mir empfohlen 2 mittelwerte zu bilden.
der eine ist eine kurze mittelwert(ADCWertneu = Summe /16) der auf 
tastendruck reagiert, da es nur 672us dauert.
die zweite ist dann eine lange mittelwert(gleitender mittelwert).
Angehängte Dateien:

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren