Fehler vom WinAVR ist:
> "make.exe" all
avr-gcc -g -Wall -O2 -mmcu=atmega8 -c -o demo.o demo.c
In file included from demo.c:9:
demo.h:18: Fehler: Syntaxfehler vor "actualtime"
demo.h:18: Warnung: »int« ist Standardtyp in Deklaration von
»actualtime«
demo.h:18: Warnung: Datendefinition hat keinen Typ oder Speicherklasse
Wo mache ich den Fehler ?
Kann ich ein struct nicht als volatile deklarieren ?
Danke,
Markus
In C wird eine struct variable immer noch mit dem
Keyword 'struct' definiert.
volatile struct time_t actualtime;
time_t ist übrigens kein sehr guter Name, da es eine Standardstruktur
gleichens Namens gibt.
Danke ;)
Liegt einfach an dem volatile, sonst hätte ich's einfach so gemacht:
1
structtime_t
2
{
3
uint8_thour;// max 23
4
uint8_tminute;// max 59
5
uint8_tsecond;// max 59
6
}actualtime;
Hmmm, geht denn auch:
1
volatilestructtime_t
2
{
3
uint8_thour;// max 23
4
uint8_tminute;// max 59
5
uint8_tsecond;// max 59
6
}actualtime;
????????????
Wobei ich aktuell schon wieder auf'm Schlauch stehe, weil nun:
1
voidshowtime(time_tmytime)
2
{
3
.....
folgenden Fehler produziert:
> "make.exe" all
avr-gcc -g -Wall -O2 -mmcu=atmega8 -c -o demo.o demo.c
demo.c:84: Fehler: Syntaxfehler vor numerischer Konstante
Irgendwie peil ich's gerade nicht mit den structs :(
Muß ich bei Übergabe das ganze als Pointer deklarieren, oder wo hängt
gerade mein Verstand ?
Danke,
Markus
heißen.
Bist Du Dir im Klaren darüber, daß bei diesem Funktionsaufruf die
Struktur als Wert übergeben wird? Das bedeutet, daß die gesamte Struktur
auf den Stack kopiert wird, was zu Problemen führen kann.
Am besten also
@rufus:
Das mit dem struct hatte ich schon probiert, hat den gleichen Fehler
gebracht :(
Und Dein Tipp mit dem Pointer war ja meine Frage ;)
Allerdings scheint mir das der Compiler wegen etwas weiter oben in
meinem Code meckert ...
Dann müßte der eigentliche Fehler hier irgendwo liegen, denn mehr ist
nicht "über" der angemeckerten Funktion:
1
ISR(TIMER0_OVF_vect)
2
{
3
// key debouncing, wait ca. 100ms to store found keys
4
if(newkeys&=PIND)
5
{
6
keytick++;
7
if(keytick==6)// IRQ ca. every 0,016 seconds => 6x ca. 100ms
8
{
9
keytick=0;
10
keyspressed^=newkeys;// store the found new keys
11
}
12
}
13
14
// time in second
15
timetick++;
16
if(timetick==61)
17
{
18
timetick=0;
19
actualtime.second++;
20
21
// debug LED:
22
if(actualtime.second%2)
23
{
24
PORTC|=(1<<PC5);
25
//toggle=0;
26
}
27
else
28
{
29
PORTC&=~(1<<PC5);
30
//toggle=1;
31
}
32
}
33
34
//compute time
35
if(actualtime.second==60)
36
{
37
actualtime.second=0;
38
39
// debug LED:
40
if(actualtime.minute%2)
41
{
42
PORTB|=(1<<PB1);
43
//toggle=0;
44
}
45
else
46
{
47
PORTB&=~(1<<PB1);
48
//toggle=1;
49
}
50
51
52
if(++actualtime.minute>59)
53
{
54
actualtime.minute=0;
55
if(++actualtime.hour>23)
56
{
57
actualtime.hour=0;
58
}
59
}
60
}
61
62
}
Das einzige was ich aktuell geändert habe ist die Einführung von den
structs wegen der Übersichtlichkeit.
Vorher waren das einzelne Variablen und das alte Programm (ohne structs)
läuft aktuell ohne Probs auf dem Mega8.
D.h. alle Sekunde toggelt die eine Debug-LED und jede Minute die zweite
...
Keys sind noch nicht angeschlossen und der Fehler:
avr-gcc -g -Wall -O2 -mmcu=atmega8 -c -o demo.o demo.c
demo.c:84: Fehler: Syntaxfehler vor numerischer Konstante
deutet meiner Meinung nach auf die actualtime ?
Oder habe ich hier schon wieder einen Hammerfehler produziert ?
Danke,
Markus
Hi
stell doch mal dein komplettes Projekt hier ein. Dann kann jeder das mal
durch seinen Compiler jagen und dir evtl. Fehler einfacher aufzeigen.
Matthias
> avr-gcc -g -Wall -O2 -mmcu=atmega8 -c -o demo.o demo.c> demo.c:84: Fehler: Syntaxfehler vor numerischer Konstante
<
> deutet meiner Meinung nach auf die actualtime ?
Kann keiner sagen, da wir nicht wissen welches denn nun
Zeile 84 ist. Und zum Durchsuchen bin ich jetzt zu faul.
> Liegt einfach an dem volatile
Das ändert nichts am Problem: Deinen C Kenntnissen.
Wenn du eine Variable definierst und diese Variable vom
Datentyp eines struct ist, dann ist das Keyword 'struct'
obligatorisch.
Und da ist er schon wieder
> Wobei ich aktuell schon wieder auf'm Schlauch stehe, weil nun:> void showtime(time_t mytime)> {> .....
Selber Fehler. mytime möchtest du vom Datentyp 'struct time_t' haben.
ALso musst du das auch hinschreiben:
void showtime( struct time_t mytime )
{
....
> Das mit dem struct hatte ich schon probiert, hat den gleichen Fehler> gebracht :(
Mag sein. Aber aus einem anderen Grund.
Ich hab' den Fehler gefunden.
Es lag nicht an meinem Code,
sondern einem Header, indem frech ein
1
#define mytime 0
drinstand ...
Und ich hab' mich dauernd gewundert was er mit "numerischer Konstante"
will ...
Nächstes mal werde ich mir ALLE Header im Projekt vorher ansehen.
Oder besser alle selber schreiben !
Danke trotzdem ;)
Bye,
Markus
P.S.: Ich hab's mir zu Herzen genommen, der struct sieht nun so aus
Ja, so ist das korrekte C Syntax.
Da aber das ewige schreiben von 'struct irgendwas'
einem schnell auf den Geist geht gibt es dafür eine
Möglichkeit das abzustellen (jetzt rückt er damit
raus :-)
Du kannst einen typedef machen.
Wie geht das?
Nun definier dir (in Gedanken) eine Variable von
diesem Typ:
struct timestruct TimeStruct;
jetzt setzt du vor das ganze einen typedef
typedef struct timestruct TimeStruct;
und schon hast du einen 'neuen Datentyp' definiert,
der 'TimeStruct' (also der Name der gedanklichen
Variable) heist und der gleichwertig zu struct timestruct
ist.
Damit kannst du jetzt schreiben:
Weil ich ja inzwischen so ziemlich alle möglichen und unmöglichen
C-Seiten und Tutorials abgegrast habe ...
Nur um dann festzustellen das ein lieber Kollege halt mal nebenbei via
define meinen Variablennamen als Konstante definiert hat ...
Ich wollte es ja eigentlich in C++ machen, da lassen sich dann Klassen
schön vererben usw., aber es muß ja der kleinste gemeinsame Nenner sein
:(
Trotzdem danke für Eure Hilfe ;)
Jezt muß ich mir nur noch was für den Capture-Eingang beim timer1
überlegen.
Gibt's da irgendwo ein passendes Tutorial in C ?
weil hier im Tutorial finde ich nur die zu setzenden Register und mit
der Suche werde ich irgendwie nicht fündig :(
Es soll die Frequenz der fallenden Flanke gemessen werden, als Sensor
kommt ein Schließer zum Einsatz, der den Pin auf GND zieht.
Soweit ich das verstanden habe wird der aktuelle Timerwert des Timer1
ins ICR1 gespeichert, wenn der Capture auftritt.
Es geht bei mir um Frequenzen von 1Hz bis zu maximal 500Hz
(Umdrehungsmessung eines Meßrades).
Dann müßte ich doch bei 1MHz Takt und 8bit Timer des Mega8 bei ca. 3906
Timerdurchläufen ein Hz haben und bei ca. 8 (seeehr grob :( ) die 500 Hz
haben, oder rechne ich falsch ?
Also sollte ein struct mit drei Werten, einer für aktuelle Frequenz,
einer für 8bit Zähler bis 256 und einer für ca. 15 als Überlaufwert
reichen ?
Gut sind dann nur 15*256=3840 statt 3906 :(
Die 1MHz sind aber leider vorgegeben :(
Hat jemand einen Tipp damit beim Capturen nicht ein paar Hz Abweichungen
sind ?
Danke,
Markus
Markus wrote:
> sondern einem Header, indem frech ein
1
#define mytime 0
> drinstand ...
Pah. :)
> Nächstes mal werde ich mir ALLE Header im Projekt vorher ansehen.
Naja, in solchen mysteriösen Fällen hilft es, sich die Ausgabe des
C-Präprozessors mal anzusehen. Wenn du das Makefile-Template von
WinAVR benutzt, das hat dafür bereits eine Regel. Wenn deine Datei
zum Beispiel "datei.c" heißt, kannst du die Ausgabe des Präprozessors
mit "make datei.i" erzeugen.
> volatile struct timestruct actualtime;
"actual" gehört zu den sogenannten false friends. Du meinst sicher
nicht die tatsächliche Zeit, sondern die gegenwärtige. Die heißt
"currenttime".
> #define MYSTRUCT struct mystruct
Ginge im gegenwärtigen Fall schon.
Nur irgendwann kommst du auf folgende Idee:
#define P_MYSTRUCT struct mystruct *
typedef struct mystruct * p_MyStruct;
Preisfrage: Welche Variable hat jetzt welchen Datentyp?
P_MYSTRUCT a, b;
p_MyStruct c, d;
Antwort:
a ist ein Pointer auf struct mystruct, b ist ein struct mystruct
c und d sind beides Pointer auf struct mystruct
Mit Makros vorsichtig sein!
Ein mögliches Problem hast du gerade am eigenen Leib erlebt.
Makros nimmt man nur wenns gar nicht anders geht.
> Soweit ich das verstanden habe wird der aktuelle Timerwert des Timer1> ins ICR1 gespeichert, wenn der Capture auftritt.
ganz genau.
> 8bit Timer des Mega8
Moment, der Timer1 ist ein 16-Bit Timer.
@Karl Heinz:
Deswegen hab' ich ja gerade den STRUCT drin gelassen ;)
Ich wette da werden ein paar "Spezialisten" gleich rummeckern und
"optimieren" :(
Das ganze Projekt ist so eine typische eierlegende Wollmilchsau ...
Das Timer1 16bittig ist weiß ich ;)
Nur der soll gleichzeitig für zwei PWMs und den Capture herhalten, ich
sehe schon wohin das führt -> voll an die Wand !
Die PWMs sind 8bit FAST-PWMs und wenn ich jetzt nicht 150%ig
falschliege, bedeutet das das Timer1 als 8bit Timer bis 255 zählt, oder
steh' ich gerade wieder auf'm Schlauch ?
Mal abgesehen davon das Cheffe von jemandem den Floh des DDS ins Ohr
gesetzt bekommen hat :(
Gaaanz einfach mit 'ner Tabelle 'nen sauberen Sinus aus'm PWM zu geben
...
Bis jetzt hat's nur dazu geführt das die 8KB FLASH schon mit 5KB voll
sind und kein Sinus aus den PWMs kommt ...
Zum Glück nicht meine Baustelle, wobei mir übles schwant :(
Naja, der übliche Wahnsinn halt ...
Aprospos DDS via PWM, kennt jemand eine Webseite oder C-Beispiel ?
Der Funktionsgenerator hier hat ja ein R2R-DAC ;)
Wobei wenn ich die Werte statt ins Port-Register ins OCR-Register packe
...
Oder bin ich da wieder vollkommen falsch ?
Mist ich mache schon wieder "vorauseilender Gehorsam" :(
Na mal sehen wohins führt ;)
Danke,
Markus
> Die PWMs sind 8bit FAST-PWMs und wenn ich jetzt nicht 150%ig> falschliege, bedeutet das das Timer1 als 8bit Timer bis 255 zählt,
:-)
Alles klar. Ich muss mich erst drann gewöhnen, dass du Timer1
schreibst wenn du eigentlich Timer0 meinst.
Passiert mir auch. "Rechts, rechts, rechts. Äh. Das andere Rechts"
:-)
// Timer1 full clock, input noise cancel by capture pin
6
TCCR1B=(1<<CS10)|(1<<ICNC1);
7
}
Und nun soll ein beliebiger (!) Sinus via Tabelle aus den PWMs kommen :(
Klar, ganz einfach nur die Stützstellen in der Tabelle berechnen und
hintereinander ausgeben ...
Das es noch nichtmal geht, wenn die Sinustabelle einfach vollständig
ausgegeben werden soll ist ja kein Grund erstmal dieses Problem
anzugehen ...
Wie schon gesagt der ganz "normale" Wahnsinn ...
Aprospos Wahnsinn,
kann es sein das ich bei Port-C des Mega8 kein LCD anschließen kann ?
Es wird die Bibliothek von Peter Fleury benutzt und da bieten sich die
sechs Pins des PortsC einfach sowas von an ;)
Initialisiert ist er wie folgt:
> sechs Pins des PortsC
Schon. Aber für das LCD brauchst du 7 Pins.
RW vom LCD muss ja schliesslich auch bedient werden :-)
Die Fleury-Lib benutzt das Busy-Flag vom LCD und um das
auszulesen, muss sie mit RW wackeln können :-)
Kann man aber auch umschreiben. Einfach die Abfrage des
Busy-Flags gegen eine kleine Warteschleife austauschen.