Hallo liebe Mikrocontroller Gemeinde,
ich habe folgendes Problem: ein Ringpuffer soll 40 ADC Werte speichern
und anschließend wieder ausgeben. Verwendete µC ist ein ATMEGA16
programmiert in c.
Zur Ausgabe der Werte verwende ich ein USB Monitor Tool. Probleme habe
ich nur, die ADC Werde in den Ringpuffer zu bringen und auch wieder
heraus.
Hier mein bisheriger Code:
1
intmain(void)
2
{
3
charline[101];
4
init();
5
DDRC=0xFF;
6
usbInit();// init USB stack
7
sei();// set enable interrupt on
8
for(;;)// the main event loop
9
{
10
staticunsignedcharringbuffer[256];
11
staticunsignedshortgetindex=0;
12
staticunsignedshortputindex=0;
13
staticunsignedshortbuffersize=20;
14
15
intputring(intuin)
16
{
17
//if ( buffersize >= sizeof ringbuffer )
18
// return -1;
19
20
uin=read_ADC(5);
21
uin=uin;
22
23
ringbuffer[putindex]=uin;
24
putindex++;
25
if(putindex>=sizeofringbuffer)
26
putindex=0;
27
buffersize++;
28
return0;
29
}
30
31
intgetring(void)
32
{
33
//if ( !buffersize )
34
// return -1;
35
{
36
buffersize--;
37
c=ringbuffer[getindex];
38
getindex++;
39
if(getindex>=sizeofringbuffer)
40
getindex=0;
41
returnc;
42
}
43
}
44
45
PORTC=uin;
46
sprintf(line,"Wert = %4d \n",c);
47
outprint(line);
48
}
49
return0;
50
}
Nochmals zur Verständlichkeit: Die ADC Wandlung an sich funktioniert.
Ohne den Ringpuffer kann ich die ADC Werte wunderbar über USB anzeigen
lassen. Nur in Zusammenspiel mit dem Ringpuffer klappts nicht.
Danke für eure Hilfe!!
MfG
Gehe zurück auf "Los". Ziehe keine 4000 Euro ein.
Dir fehlen massiv C-Grundlagen.
Ausserdem nimmst Du die Situation nicht ernst genug. Der vorliegende
Code lässt sich nicht kompilieren. Statt uns aber entweder den
kompletten Code zu zeigen oder die Fehlermeldungen zu nennen, schreibst
Du nur "Geht nicht".
So können wir Dir nicht helfen.
>Entschuldigt bitte, wenn ich euch zu wenig Infos gegeben habe.
Die Entschuldigung kannst Du Dir in die Haare schmieren. ;-)
Was fehlt sind Infos, Fehlermeldungen und Problembeschreibungen.
Und so ein Archiv zu entpacken ist erstmal unnötig aufwendig für uns
(wenn es auch einige gibt die das machen), wenn man den kompletten
Quellcode direkt lesen kann.
Es geht ja nicht primär darum, das wir zuwenig Informationen haben,
sondern darum, das Du lernen musst ein Problem zu analysieren. Dazu
gehört ersteinmal es zu beschreiben : Das Du es dann oft trotzdem noch
nicht allein lösen kannst liegt an einem fehlenden weiteren Lernschritt.
Aber die Beschreibung einer Situation ist der ersten Schritt.
"Nomen est Omen", "Am Anfang war das Wort und das Wort war Geist" etcpp.
uin=uin ???
Hä ??
Weißt du eigentlich was ein Ringpuffer ist ??
Man benutzt ihn so : Wenn er am Ende angekommen ist dann soll er zum
Anfang gehen ! (Das machst du zwar aber danach machst du den Buffer
Größer, also jedesmal wenn du durchgelaufen bist solange bis kein
Speicher mehr da ist bzw. er den Stack oder deine Variablen
überschreibt)
und wo zum Teufel sind eigentlich die Aufrufe für getring und putring.
Also wenn du die nicht aufrufst werden die auch nichts machen außerdem
dürfen die nicht ind der main funktion stehen (Funktionen die Funktionen
enthalten ?!?!!!!)
also
1.verstehen wie nen Ringbuffer funktioniert
2.verstehen was Pointer,Adressen,FIFOs ,stack,usw sind
3.Sich ne Einfürung in C durchlesen (für so ein programm solte ne
einführung schon reichen)
4. loslegen
is noch kein Meister vom Himmel gefallen
while(!(ADCSRA&(1<<ADIF)));// auf Abschluss der Konvertierung warten (ADIF-bit)
37
38
ADCSRA&=~(1<<ADEN);// ADC deaktivieren
39
ADC_value=ADC;
40
41
returnADC_value;
42
}
43
44
intmain(void)
45
{
46
charline[101];
47
init();
48
DDRC=0xFF;
49
usbInit();// init USB stack
50
sei();// set enable interrupt on
51
for(;;)// the main event loop
52
{
53
//uin = read_ADC(5); // Port A.5
54
//uin=uin;
55
56
// Kontroll LED
57
//if(uin > 500)
58
// PORTC=0xFF;
59
//else
60
// PORTC=0x00;
61
62
staticunsignedcharringbuffer[40];
63
staticunsignedshortgetindex=0;
64
staticunsignedshortputindex=0;
65
staticunsignedshortbuffersize=0;
66
67
intputring(intuin)
68
{
69
//if ( buffersize >= sizeof ringbuffer )
70
// return -1;
71
72
uin=read_ADC(5);
73
uin=uin;
74
75
ringbuffer[putindex]=uin;
76
putindex++;
77
if(putindex>=40)
78
putindex=0;
79
buffersize++;
80
return0;
81
}
82
83
intgetring(void)
84
{
85
//if ( !buffersize )
86
// return -1;
87
{
88
buffersize--;
89
c=ringbuffer[getindex];
90
getindex++;
91
if(getindex>=40)
92
getindex=0;
93
returnc;
94
}
95
}
96
97
PORTC=uin;
98
sprintf(line,"Wert = %4d \n",c);
99
outprint(line);
100
}
101
return0;
102
}
Beim Build kommen keine Fehlermeldungen. Mein Problem ist es, dass ich
die Werte, die ich mittels read_ADC() auf uin gebe nicht in den
Ringpuffer gespeichert werden. Nach dem auslesen des Ringpuffers bekomme
ich nur 0 zu sehen. Also wird dieser wohl leer sein.
Soll heißen, dass ich keine Werte dort hinein bekomme. Ich glaube, dass
die der Fehler in diesen Zeilen steckt:
>Mein Problem ist es, dass ich>die Werte, die ich mittels read_ADC() auf uin gebe nicht in den>Ringpuffer gespeichert werden.
Woran merkst Du das?
>Nach dem auslesen des Ringpuffers bekomme ich nur 0 zu sehen.
An welcher Stelle im Ablau bekommst Du nur 0 zu sehen? Durch welches
Mittel?
Simulator? Glaskugel?
> Also wird dieser wohl leer sein.
Aha. Wieder Glaskugel?
>Ich glaube, dass
die der Fehler in diesen Zeilen steckt:
Und nun kommt noch die Religion in's Spiel.
Nun ich will DIch nicht weiter quälen.
Sie Dir mal die Ausgabe der Variable von c am Ende von main an.
Beantworte mir folgende Frage? Welchen Wert soll c haben und durch
welche Zuweisung? Qual Dich nicht. Ich weiss.
Aber frage Dich folgendes "Wird durch die Definition einer Funktion auch
gleichzeitig bewirkt, das die Funktion an der Stelle aufgerufen wird"?
Irgendwas solltest Du mal selbst beantworten.
Um dich mal auf den richtigen Weg zu bringen ...
Weisst du, worin sich eine Funktionsdefinition von einem Funktionsaufruf
unterscheiden ?
Eine Funktionsdefinition sieht folgendermaßen aus:
1
uint8_tfunktion(uint8_tvariable){
2
returnvariable+1;
3
}
Ein Aufruf dieser Funktion eher so:
1
funktion(2);
Dein Problem liegt darin, dass du innerhalb der main-Funktion deine
Funktionen getring und setring definierst, aber nicht aufrufst.
Eine Funktionsdefinition innerhalb einer Funktion sollte soviel ich weiß
direkt zu einem Compilerfehler führen ( darum auch die vielen Nachfragen
deswegen hier ).
getring und setring werden in der jetzigen Version gar nicht aufgerufen,
daher wird auch nichts am Puffer geändert und auch gar nichts mit dem
ADC gemessen.