Forum: Offtopic unsigned char zu kurz


von el p. (elpistolero84)


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

von Uhu U. (uhu)


Lesenswert?

Bleistift und Papier.

Alternativ: dein C-Buch mit Verstand lesen.

von el p. (elpistolero84)


Lesenswert?

Ich habe schon unsigned long benutzt, der compiler(C18) macht das aber 
nicht mit! Deshalb suche ich eine Alternative..

von Uhu U. (uhu)


Lesenswert?

Vielleicht solltest du dich mal etwas ausführlicher dazu äußern, was das 
für Daten sind...

von el p. (elpistolero84)


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...

von Uhu U. (uhu)


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.

von Winfried J. (Firma: Nisch-Aufzüge) (winne) Benutzerseite


Lesenswert?

fortschreitend rekursive mittelwertbildung
1
do
2
{
3
y=mw;
4
n=0;
5
for n (1,15000,1) 
6
{
7
y=(y+mw)/n; 
8
}
9
}

von Peter D. (peda)


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

von el p. (elpistolero84)


Lesenswert?

Super danke schön..

Das war sehr hilfreich.

Der Mikrocontroller hat einen einen 24000Byte speicher noch zur 
verfügung und liefert 10Bite Messwert zurück :)

von Mike M. (mikeii)


Lesenswert?

Winfried J. schrieb:
> fortschreitend rekursive mittelwertbildung
>
1
> do
2
> {
3
> y=mw;
4
> n=0;
5
> for n (1,15000,1)
6
> {
7
> y=(y+mw)/n;
8
> }
9
> }
10
>

Sicher dass das funktioniert?

Müsste es nicht in der art

y = (y+ mw*(n-1))/n  sein?

Und warum rekursiv?

von Robert L. (lrlr)


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..

von Peter D. (peda)


Lesenswert?

el pistolero schrieb:
> Der Mikrocontroller hat einen einen 24000Byte speicher noch zur
> verfügung

Laut Michrochip ist der RAM beim PIC18 nur max 4kB.

Wenn Du eine Lösung willst, dann beschreibe mal die Aufgabe. Nur mit 
einer realen Aufgabe kommt man zum Ziel.
Deine bisherigen Forderungen sind einfach zu absurd.


Peter

von el p. (elpistolero84)


Angehängte Dateien:

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).

von Robert L. (lrlr)


Lesenswert?

hättest doch gleich den Karl gefragt, ....

von Johnny B. (johnnyb)


Lesenswert?

Für solche Anwendungen tuts auch ein IIR-Filter. Das braucht praktisch 
keinen Speicherplatz und ist schnell berechnet.
Du brauchst eines, welches als Tiefpassfilter funktioniert. Es verhält 
sich dann im Prinzip gleich wie ein analog aufgebautes RC-Glied.

von el p. (elpistolero84)


Lesenswert?

Ich habe es jetzt mit dem Gleitender Mittelwert Implementiert :)

von Mike M. (mikeii)


Lesenswert?

Robert, jetzt hats ne Klammer zu viel ;)

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.