Fehler beim compilieren ... Anfänger braucht hilfe
Also ich habe mal nen kleines Programm in C geschrieben mit nem Timer als verzögerung. Der rest vom Programm funktioniert einwandfrei nur seitdem ich den Timer eingebaut habe schmeiß mich der Compiler mit Fehlermeldungen tot. Ich sehe die Fehler leider net so auf anhieb und brauche recht lange bis ich da mal was entdeckt habe, vielleicht können sich die Experten unter euch das ja mal anschauen und mir ein wenig helfen. Als Plattform dient bei mir ein Atmege128 mit 16 Mherz aber das sollte für das Programm bis auf bei der berechnung der zeit ja keine rolle spielen .
typedef unsigned char BYTE;
typedef unsigned short WORD;
BYTE byte_timer;
void timer_init(void)
{
/*Clear Timer on Compare Match (Initialwert des Bits ist 0)
Wenn dieses Bit gesetzt ist wird nach Übereinstimmung des Datenregisters mit dem
Vergleichswert das Datenregister auf 0 gesetzt.
Clock Select Bits (Intitialwerte der Bits sind alle 0)
Diese 3 Bits bestimmen die Quelle für den Timer
CS10(Bit 0) CS11(Bit 1) CS12(Bit 2) Aktion
0 0 0 Timer wird angehalten
1 0 0 CPU-Takt
0 1 0 CPU-Takt/8
1 1 0 CPU-Takt/64
0 0 1 CPU-Takt/256
1 0 1 CPU-Takt/1024
0 1 1 Externer Pin T0, fallende Flanke
1 1 1 Externer Pin T0, steigende Flanke*/
TCCR1B|=(1<<CS10)|(1<<CS12)|(1<<CTC1);
/*Output Compare Match Interupt Enable (Initialwert des Bits ist 0)
Wenn dieses Bit gesetzt ist wird beim erreichen des Vergleichswertes ein Interupt ausgelöst.*/
TIMSK|=(1<<OCIE1A);
-------- begin --------
avr-gcc (GCC) 3.4.1
Copyright (C) 2004 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
Compiling: test.c
avr-gcc -c -mmcu=atmega128 -I. -gstabs -Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -Wall -Wstrict-prototypes -Wa,-adhlns=test.lst -std=gnu99 -Wp,-M,-MP,-MT,test.o,-MF,.dep/test.o.d test.c -o test.o
test.c: In function `timer_init':
test.c:28: error: `CTC1' undeclared (first use in this function)
test.c:28: error: (Each undeclared identifier is reported only once
test.c:28: error: for each function it appears in.)
test.c:36: error: parse error before "OCR1"
test.c:41: error: parse error before '}' token
test.c: In function `SIG_OUTPUT_COMPARE':
test.c:47: error: parse error before '(' token
test.c: In function `timer_init':
test.c:52: warning: 'main' is normally a non-static function
test.c: In function `main':
test.c:79: error: parse error before "while"
test.c: In function `timer_init':
test.c:86: error: parse error at end of input
make.exe: *** [test.o] Error 1
mach mal nach den ganzen cli() und sei() Strichpunkte hin, das sollte schon mal die Hälfte der Fehler erledigen.
Und nach timer_init() auch.
Die Frage ist, warum CTC1 undeclared ist, ich kenne den Mega 128 nicht.
Hast du die richtige Header-Datei eingebunden und gibts das Register überhaupt (Schreibfehler?)
typedef unsigned char BYTE;
typedef unsigned short WORD;
BYTE byte_timer;
void timer_init(void)
{
/*Clear Timer on Compare Match (Initialwert des Bits ist 0)
Wenn dieses Bit gesetzt ist wird nach Übereinstimmung des Datenregisters mit dem
Vergleichswert das Datenregister auf 0 gesetzt.
Clock Select Bits (Intitialwerte der Bits sind alle 0)
Diese 3 Bits bestimmen die Quelle für den Timer
CS10(Bit 0) CS11(Bit 1) CS12(Bit 2) Aktion
0 0 0 Timer wird angehalten
1 0 0 CPU-Takt
0 1 0 CPU-Takt/8
1 1 0 CPU-Takt/64
0 0 1 CPU-Takt/256
1 0 1 CPU-Takt/1024
0 1 1 Externer Pin T0, fallende Flanke
1 1 1 Externer Pin T0, steigende Flanke*/
TCCR1B|=(1<<CS10)|(1<<CS12)|(1<<CTC1);
/*Output Compare Match Interupt Enable (Initialwert des Bits ist 0)
Wenn dieses Bit gesetzt ist wird beim erreichen des Vergleichswertes ein Interupt ausgelöst.*/
TIMSK|=(1<<OCIE1A);
-------- begin --------
avr-gcc (GCC) 3.4.1
Copyright (C) 2004 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
Compiling: test.c
avr-gcc -c -mmcu=atmega128 -I. -gstabs -Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -Wall -Wstrict-prototypes -Wa,-adhlns=test.lst -std=gnu99 -Wp,-M,-MP,-MT,test.o,-MF,.dep/test.o.d test.c -o test.o
test.c: In function `timer_init':
test.c:28: error: `CTC1' undeclared (first use in this function)
test.c:28: error: (Each undeclared identifier is reported only once
test.c:28: error: for each function it appears in.)
test.c:36: error: `OCR1' undeclared (first use in this function)
test.c: In function `main':
test.c:79: warning: suggest parentheses around assignment used as truth value
make.exe: *** [test.o] Error 1
> Process Exit Code: 2
So das sind die fehler die noch auftauchen ... naja CTC1 müsste es eigentlich geben stand in dem Tut von Microcontroller.net/wiki drin ist clear timer on compare match und OCR1 ist das Output Compare register ...
Beim Mega 128 gibt es kein CTS1 Flag mehr, heißt jetzt WGM12.
also
TCCR1B|=(1<<CS10)|(1<<CS12)| (1<<WGM12);
OCR1=15625; ist beim MEGA 128 ein 16 BIT Register, also
OCR1A=15625;
SIGNAL(SIG_OUTPUT_COMPARE) gibts beim Mega 128 nicht, also
SIGNAL(SIG_OUTPUT_COMPARE1A) sonst stimmt der Inerrupt einsprung
nicht mehr.
In deiner INT Routine SIGNAL(SIG_OUTPUT_COMPARE1A)
{
cli();
/*Timer anhalten*/
TCCR1B&=~((1<<CS10)|(1<<CS12));
byte_timer=1;
}
schaltest du mit cli(); die Interrupts aus, macht keinen Sinn, da GCC das automatisch macht. Beim verlassen der INT Routine wird es aber wieder eingeschaltet, auch in deinem Fall, also aufpassen.
Deine Abfage while(byte_timer=0){} geht so nicht, vergleiche immer mit == , also while(byte_timer==0){}. Zudem muß die Variable byte_timer mit volatile deklariert werden, sonst wird sie weg optimiert.
Danke für eure hilfe! Jetzt tut es soweit. Mal schaun obs auch das richtige im atmega macht! Aber zumindist schonmal keine fehlermeldungen mehr. Naja nen paar fragen habe ich noch. Die Interupts machen mir doch keine probleme mehr da ich den timer ja ausgeschaltet habe oder sollte ich sie nach der whileschleife nochmal wieder komplett deaktivieren? Dann nochmal zu dem mit dem 16-Bit Registern, wenn ich dasmit dem OCR1A mache schreibt der dann in beide register (high und low)? Also nimmt der das dann einfach als 16 Bit ... obwohls ja eigendlich 2 8-Bit register sind? Und was bewirkt das volatile?
Naja jetzt geht das mit dem compilieren zwar ohne Fehlermeldungen, aber leider macht das Programm nicht was es soll. Es soll erstmal die Leds 0,2,4 an PORTA aus machen (alle LEDs bis auf die letzte leuchten) dann soll es 1 sec warten und an PORTB die LEDs 0,2,4 an machen (alle LEDs bis auf die letzte sind an) ... das programm läuft bis zu dem Punkt an dem 1 sec gewartet werden soll dann gehts nicht weiter .
Also die LEDs sind über einen Transistor an die Ports Angeklemmt und Leuchten bei einem High an den Ports. Naja hab es mal angemacht und eine minute gewartet und es tut sich immer noch nix ... das mir dem 0x7e hab ich in 0xfe geändert da hat ich mich vertan . Auch das cli(); hab ich jetzt hinter die schleife gesetzt. Die Fuse Bits hab ich als screenshot mal angehängt ...
1. byte_timer wird nicht auf 0 gesetzt
2. TCCR1B|=(1<<CS10)|(1<<CS12)|(1<<CTC1); doe cs dürfen erst gesetzt werden wenn alle timerbits so gesetzt sind wie sie sein sollen da sie ja den timer anmachen ...
Lesezeichen