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
Ich habe schon unsigned long benutzt, der compiler(C18) macht das aber nicht mit! Deshalb suche ich eine Alternative..
Vielleicht solltest du dich mal etwas ausführlicher dazu äußern, was das für Daten sind...
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...
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.
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 | } |
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
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 :)
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?
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..
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
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).
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.
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.
