Hallo leute,
Ich versuche gerade ein c programm im CCS Compiler zu schreiben um dem
Mittelwert eine Schwingungs signal zu brechnen.Ich arbeite mit dem
Pic18F2026 und benutze ein CCS compiler, dennoch sollte ich den Programm
so erweitern so dass man die Amplitude des Signals im bezug auf
Mittelwert auch berechnen kann .
Das Programm schreibe ich neu.Es geht darum einen C Programm zu
schreiben zur Abtastung ein 100 Hz Signal.Das Programm soll zum beispiel
100 werte einlesen ,dann den Mittelwert geben und dann die Amplitude im
Bezug auf dem Mittelwert zu berechnen.
Das programm muss ich danach im CCS Compiler schreiben und dann über den
Pic 18F2620 einspielen. Der Pic ist mit eienem Sensor verbunden , durch
schütteln der Sensor soll er zum beispiel 100 werte ausgeben , den der
Mittelwert berechnen, als auch die Amplitude.
Ich bin gerade ein Anfänger und brauche dringend ein C Code Programm
MFG
Med
Wenn es sich tatsächlich immer um ein Sinus-Signal handelt, wäre es doch
besser mittels Spitzenwertgleichrichtung diesen zu erfassen, und daraus
den Mittelwert zu rechnen. Das würde zwar etwas Hardware bedeuten ist
aber bzgl. der Erfassung dann wiederum einfacher.
Ich habe das Gefühl, dass Du einen fertigen Code suchst ! Dann bleibst
Du aber immer Anfänger ! Mach Dir doch zuerst mal Gedanken darüber, mit
welcher Abtastrate Du mindestens Abtasten must (Shannon) und danach wie
die Mittelwertbildung in Psuedo-Code bzw. im Ablaufdiagramm aussehen
müsste. Die Amplitudenberechnung ist auch interessant, da hier z.B. ein
Faktor z.B. *1.414 ins Spiel kommt.
Dein Problem hört sich nach einer Hausaufgabe (Schule, Studium) an.
Diese solltest Du besser selbst lösen. Hier kannst Du nur Tipps
erwarten.
Ich habe das Gefühl, dass Du einen fertigen Code suchst ! Dann bleibst
Du aber immer Anfänger ! Mach Dir doch zuerst mal Gedanken darüber, mit
welcher Abtastrate Du mindestens Abtasten must (Shannon) und danach wie
die Mittelwertbildung in Psuedo-Code bzw. im Ablaufdiagramm aussehen
müsste. Die Amplitudenberechnung ist auch interessant, da hier z.B. ein
Faktor z.B. *1.414 ins Spiel kommt.
Dein Problem hört sich nach einer Hausaufgabe (Schule, Studium) an.
Diese solltest Du besser selbst lösen. Hier kannst Du nur Tipps
erwarten.
Es handelt es sich um ein Projekt!!Fertige Programme halt ich nichts
davon !! nur dass ich zum erstmal mit einem Pic programmierung
zusammensetze , und das ist nicht einfach!!
Abtastrate habe ich mich 500us ausgesucht damit kriege ich mindestens 20
Abtastpunkte pro Periode bei einem 100Hz frequenz!!
Welchen Teil des Programms kriegst du selbst hin
und bei welchem Teil, konkret, hast du Probleme?
Mittelwertbildung habe ich schon geschafft, das Problem ist das Min Max
bei einem Amplitudenberchnung , der Compiler schmeißt er mir immer
irgendwelche werte!!
Da es sich C-Code handelt, ist es uninteressant ob du zum ersten mal mit
einem PIC arbeitest. Der gleiche C-Code auf einem PC würde den gleichen
Müll herauswerfen.
med wrote:
> Welchen Teil des Programms kriegst du selbst hin> und bei welchem Teil, konkret, hast du Probleme?>> Mittelwertbildung habe ich schon geschafft, das Problem ist das Min Max> bei einem Amplitudenberchnung , der Compiler schmeißt er mir immer> irgendwelche werte!!
Wo liegt das Problem?
Die Funktion ist doch eigentlich ziemlich einfach, wenn du
die Werte mal in einem Array hast
1
Min=Array[0];
2
Max=Array[0];
3
4
for(i=1;i<100;++i){
5
if(Array[i]<Min)
6
Min=Array[i];
7
8
if(Array[i]>Max)
9
Max=Array[i];
10
}
Also einfach mal annehmen das erste Array Element wäre das
Minimum bzw. Maximum. Danach alle anderen Array Elemente
durchgehen und nachsehen, ob sie nicht vielleicht doch kleiner
sind als das bisherige Minimum. Wenn ja, dann kann das bisherige
Minimum offensichtlich nicht das wahre sein, sondern es gibt ein
neues Minimum. Ist man durch das Array durch, so hat man den
kleinsten Wert gefunden, welcher dann das Minimum der Werte im
Array darstellt.
Selbiges sinngemäß für Maximum und der Größer-Beziehung.
med wrote:
> der Compiler schmeißt er mir immer irgendwelche werte!!
Der Compiler schmeißt Dir irgendwelche Werte?!
Oder war's der Linker, oder vielleicht doch der Editor?
>>> der Compiler schmeißt er mir immer irgendwelche werte!!>>>> Der Compiler schmeißt Dir irgendwelche Werte?!>> Oder war's der Linker, oder vielleicht doch der Editor?> ich glaube der Compiler(debugger)
Na, dann musst du in Deckung gehen. Nicht dass er dich noch
erwischt!
(Sorry, aber das war ein Aufgelegter. Ich hätte nicht schlafen
können, wenn ich den ausgelassen hätte)
> der Compiler schmeißt er mir immer irgendwelche werte!!
Diesen Satz bitte einmal langsam auf der Zunge zergehen lassen.
Was will uns diese willkürliche Kombination von Worten und Buchstaben
eigentlich sagen?
Zugegeben, das mit den Pronomen ist schwer...
>>ich den Programm [ ] nein, falsch.>>einen C Programm [ ] leider auch noch nicht richtig.>>Das Programm [x] Treffer, am Ende hat es geklappt!
Es ist eine ganz schlechte Idee, mit einer Fremdsprache (c) anzufangen,
bevor man die Muttersprache kennt!
Jochen Müller
Jochen Müller wrote:
> Es ist eine ganz schlechte Idee, mit einer Fremdsprache (c) anzufangen,> bevor man die Muttersprache kennt!
Woher weißt Du Schlaumeier eigentlich, dass deutsch seine/ihre
Muttersprache ist? Ich schätze mal, dem ist eher nicht so! Und Leute wie
Du sollten hier einfach mal den Rand halten, wenn sie nur
unqualifiziertes Zeug von sich zu geben haben (gleiches gilt
selbstverständlich auch für den "gast" von 18:36)!
Hallo,
Du druckst momentan die "Ergebnisse" bei jedem Durchlauf der
min/max-Such-Schleife aus. Stelle die Ausgabe so um, dass die
Suchschleife zunächst vollständig durchlaufen wird; dann kommt auch das
raus, was Du möchstest.
Gruß
Fred
Bei der Maximalwertberechnung und Ausgabe stimmt etwas mit den Klammern
nicht! Bitte formatiere den Code mal und mache die Einrückungen richtig,
so dass zusammengehörende Klammern untereinander stehen. Dann müsstest
Du sehen, dass die erste der beiden for-Schleifen keine schließende
Klammer hat (zumindest nicht an der richtigen Stelle)...
med wrote:
> void main()> {> int16 value[],
Warum sagst du deinem Compiler nicht, dass du ein
Array mit 100 Einträgen haben willst?
int16 value[100],mittel,min,max;
Das musst du schon machen, woher soll der Compiler sonst
wissen wieviel Speicher er dafür reservieren soll?
Die Schleife ist falsch verschachtelt.
Du machst mit der Ausgabe unten den Schleifenzähler von oben kaputt!
Jochen Müller
for(i=0;i<100;i++)
{
if (value[i]>max)
{
max=value[i];
}
if(value[i]<min)
{
min=value[i];
}
for(i=0;i<100;i++)
{
printf("%Li\n", value[i]);
}
}
Und dann solltest du dir nochmal Gedanken darüber machen,
was wohl passieren wird, wenn all deine Schleifenvariablen
immer i heissen.
Vor allen Dingen in Fällen, wie diesem:
1
for(i=0;i<100;++i){
2
3
...
4
for(i=0;i<100;++i){
5
6
...
7
}
8
}
Die ausserste Schleife wird nur einmal durchlaufen, nicht
100 mal. Denn beim ersten Schleifendurchlauf wird das i
von der inneren Schleife bis auf 100 hochgezählt, wodurch
die Abbruchbedingung für die äussere Schleife ebenfalls
erfüllt ist.
// Annahme: in value[0] steht bereits der kleinste
41
// bzw. grösste Wert
42
min=value[0];
43
max=value[0];
44
45
// jetzt die Annahme überprüfen, ob nicht doch einer
46
// der anderen Werte kleiner oder grösser ist
47
for(i=0;i<NR_VALUES;i++)
48
{
49
if(value[i]>max)
50
max=value[i];
51
52
if(value[i]<min)
53
min=value[i];
54
}
55
56
// das wars: die Ergebnisse ausgeben
57
for(i=0;i<NR_VALUES;i++)
58
printf("%Li\n",value[i]);
59
60
printf("mittelwert %li\n",mittel);
61
printf("min %Li\n",min);
62
printf("max %Li\n",max);
63
printf("Summe %Lu\n",sum);
64
}
65
}
66
}
Macht doch gleich einen Unterschied, wenn das ganze vernünftig
formatiert und eingerückt ist. Dann findet man auch solche
Fehler viel leichter.
Mit ein paar Funktionen wirds allerdings noch einfacher
zu durchschauen
1
#define NR_VALUES 100
2
3
int16value[NR_VALUES];
4
int16mittel
5
int16min,max;
6
7
voidSetupHardware()
8
{
9
setup_adc_ports(AN0_TO_AN1|VSS_VDD);
10
setup_adc(ADC_CLOCK_DIV_4|ADC_TAD_MUL_16);
11
setup_spi(SPI_SS_DISABLED);
12
setup_wdt(WDT_OFF);
13
setup_timer_0(RTCC_INTERNAL);
14
setup_timer_1(T1_DISABLED);
15
setup_timer_2(T2_DISABLED,0,1);
16
setup_comparator(NC_NC_NC_NC);
17
setup_vref(FALSE);
18
}
19
20
voidReadValues()
21
{
22
int16i;
23
24
// vom Kanal 1 mal die Messewerte einlesen
25
set_adc_channel(1);
26
for(i=0;i<NR_VALUES;i++)
27
{
28
value[i]=read_adc();
29
delay_us(500);
30
}
31
}
32
33
voidBerechneMittel()
34
{
35
unsignedint16sum;
36
int16i;
37
38
// Mittelwert berechnen:
39
// Zuerst die Summe aller Messwerte bestimmen
40
// und durch die Anzahl der Messwerte dividieren
41
sum=0;
42
for(i=0;i<NR_VALUES;i++)
43
sum=sum+value[i];
44
mittel=sum/NR_VALUES;
45
}
46
47
voidBerechneMinMax()
48
{
49
int16i;
50
51
// Minimum und Maximum bestimmen
52
// Annahme: in value[0] steht bereits der kleinste
53
// bzw. grösste Wert
54
min=value[0];
55
max=value[0];
56
57
// jetzt die Annahme überprüfen, ob nicht doch einer
58
// der anderen Werte kleiner oder grösser ist
59
for(i=0;i<NR_VALUES;i++)
60
{
61
if(value[i]>max)
62
max=value[i];
63
64
if(value[i]<min)
65
min=value[i];
66
}
67
}
68
69
voidPrintErgebnisse()
70
{
71
int16i;
72
73
// das wars: die Ergebnisse ausgeben
74
for(i=0;i<NR_VALUES;i++)
75
printf("%Li\n",value[i]);
76
77
printf("mittelwert %li\n",mittel);
78
printf("min %Li\n",min);
79
printf("max %Li\n",max);
80
printf("Summe %Lu\n",sum);
81
}
82
83
voidmain()
84
{
85
86
inti;
87
88
SetupHardware();
89
90
while(1)
91
{
92
if(input(pin_b1)==1)
93
{
94
ReadValues();
95
BerechneMittel();
96
BerechneMinMax();
97
98
PrintErgebnisse();
99
}
100
}
101
}
Schau wie einfach dadurch das Hauptprogramm wird. Es ist unmittelbar
zu sehen, dass da kein Logikfehler mehr drinnen sein kann.
AUch die einzelnen Funktionen sind einfach genug, dass man auf
Anhieb sieht, dass da kein Logikfehler enthalten sein kann.
Vielen Dank an alle,
Es hat endlich funktionniert!! Problem lag an der Struktur ,die erste
ausgabe hat die Min Max suche verhindert
und besondere Dank an kbuchegg ,das programm was sie geschrieben haben
ist sehr klar und ausführlich!!
>>und besondere Dank an kbuchegg ,
das programm was sie geschrieben haben ist sehr klar und ausführlich!!
Ja, sicher.
Aber helfen würde es dem Jungen sicher mehr, wenn er seine Fehler SELBST
findet und keine fertige Schonkost VORGEKAUT bekommt, so gut das auch
gemeint sein wird.
Und der Fehler IN DIESEM FALL war so simpel, dass er ihn auch ganz ohne
Forum gefunden hätte, wenn er das als SELBSTVERSTÄNDLICH zu erwartende
Minimum an Aufmerksamkeit und Sorgfalt aufgewendet hätte.
Fertige Häppchen zum Abtippen helfen da ganz sicher nicht!
Jochen Müller
Jochen Müller wrote:
> Fertige Häppchen zum Abtippen helfen da ganz sicher nicht!
Ab und zu muss man dem Nachwuchs auch mal konkret zeigen, wie
man es besser machen kann.
> Sorry, aber das war ein Aufgelegter. Ich hätte nicht schlafen> können, wenn ich den ausgelassen hätte> Ab und zu muss man dem Nachwuchs auch mal konkret zeigen, wie> man es besser machen kann.
Einen hätt' ich dann auch noch...
Was passiert wohl in BerechneMittel, wenn NR_VALUES höher gesetzt wird
oder die ADC-Ergebnisse z.B. um 700 herum liegen?
>Ja, sicher.>Aber helfen würde es dem Jungen sicher mehr, wenn er seine Fehler SELBST>findet und keine fertige Schonkost VORGEKAUT bekommt, so gut das auch>gemeint sein wird.
darum geht es doch gar nicht. kbuchegg freut sich über solche anfänger,
je unselbstständiger, desto besser, dann fragen sie wenigstens nix,
wofür kbuchegg länger als eine stunde recherchieren muss. und eine
stunde, selbstlos für andere verschwendet, ist durchaus angemessen,
damit er sein unvorstellbares können unter beweis stellen kann!
>damit er sein unvorstellbares können unter beweis stellen kann!
Obiger Kommentar ist mal wieder ein Argument für die "Gast-Postings
verbieten" Fraktion.
Die Beiträge von Karl heinz Buchegger gehören zu den wenigen in diesem
Forum, aus denen man etwas lernen kann. Man sollte daher für seine
Hilfsbereitschaft dankbar sein. Ob es wirklich sinnvoll ist, anderen
Leuten komplette Hausaufgaben oder Teile ihrer Diplomarbeit hier
vorzukauen ist ein anderes Thema.
Hallo,
gäbe es noch eine netten Weg die globalen Variablen zu vermeiden? Weil
die sind ja in C etwas verpönt. Ich habe leider noch keinen Weg gefunden
sowas elegant zu lösen. (Das mehere Funktionen auf die gleichen Daten
zugreifen)
Datenkapselung in ANSI-C kann man erreichen, indem man zu kapselnde
Daten in einer C-Datei static definiert.
Z.B. am Dateianfang:
1
staticint16value[NR_VALUES];
2
staticint16mittel
3
staticint16min,max;
Als Schnittstelle kann man je eine get- und/oder set-Funktion
implementieren (oder es lassen, wenn der Zugriff nur innerhalb des
Moduls erfolgen soll).
Gruß
Martin
> Ob es wirklich sinnvoll ist, anderen Leuten komplette> Hausaufgaben oder Teile ihrer Diplomarbeit hier> vorzukauen ist ein anderes Thema.
Mein erster Gedanke beim Lesen der Überschrift.....
"Bis hierher konnte ich mich so durchmogeln"
Gruss Otto
<!-- --> wrote:
> darum geht es doch gar nicht. kbuchegg freut sich über solche anfänger,> je unselbstständiger, desto besser, dann fragen sie wenigstens nix,> wofür kbuchegg länger als eine stunde recherchieren muss. und eine> stunde, selbstlos für andere verschwendet, ist durchaus angemessen,> damit er sein unvorstellbares können unter beweis stellen kann!
Ja natürlich, es gibt immer wieder einen, der alles mies machen muß.
kbuchegg ist ja nicht erst seit gestern hier.
Ich halte ihn durchaus für fähig, selber abschätzen zu können, wieviel
Aufwand er in eine Antwort steckt.
Hier sind keine Antwortmaschinen am Werk.
Wenns einem Spaß macht, kann ne Antwort durchaus mal ausführlicher sein.
Peter
Peter wrote:
> Hallo,> gäbe es noch eine netten Weg die globalen Variablen zu vermeiden? Weil> die sind ja in C etwas verpönt. Ich habe leider noch keinen Weg gefunden> sowas elegant zu lösen. (Das mehere Funktionen auf die gleichen Daten> zugreifen)
Wenn du globale Variablen vermeiden willst, dann führt dich der
Weg zu Funktionsargumenten bzw. Returnvalues.
Ein oder mehrere Werte wird an eine Funktion (in Form von
Argumenten) übergeben. Damit hat die Funktion alles was sie braucht
um ihre Berechnungen anstellen zu können. Um das Ergebnis dieser
Berechnung zurück zum Aufrufer zu bringen, gibt es 2 Möglichkeiten.
Handelt es sich um einen Wert, dann kann man dafür den Return Wert
der Funktion benutzen. Hat man mehrere Ergebnisse, dann wird dafür
meist nicht der Return Wert benutzt, sondern der Rückfluß findet
ebenfalls über die Argumentschnittstelle der Funktion statt.
Hier verweise ich dich aber an dein C-Buch. Das jetzt im Detail
mit allen Feinheiten auszuführen würde zu weit führen. Das
Beispiel abgewandelt und auf die Mittlewertsfunktion angewendet,
würde so aussehen:
------------------------------------------------------------
@<!-- --> (Gast)
Das ist einfach nur armselig was du da von dir gibst.
Selbst zu faul jemandem weiterzuhelfen, aber rummosern.