klucky
31.10.2004, 13:41
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 ;).
#include <avr/io.h>
#include <inttypes.h>
#include <avr/interrupt.h>
#include <avr/signal.h>
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);
/*Output Compare Register beschreiben*/
cli()
OCR1=15625;
/*Timer Datenregister zurrücksetzen*/
TCNT1=0;
sei()
}
SIGNAL(SIG_OUTPUT_COMPARE)
{
cli()
/*Timer anhalten*/
TCCR1B&=~((1<<CS10)|(1<<CS12));
byte_timer=1;
}
int main(void)
{
/*Alle LEDs als Ausgänge*/
DDRA=0xFF;
DDRB=0xFF;
DDRC=0xFF;
DDRD=0xFF;
DDRE=0xFF;
DDRF=0xFF;
DDRG=0xFF;
/*Alle LEDs an PORTA an bis auf die letzte,alle LEDs an PORTD auf
bis auf die letzte und alle LEDs an PORTG an.*/
PORTA=0x7E;
PORTB=0x80;
PORTC=0x0;
PORTD=0x0;
PORTE=0x0;
PORTF=0x0;
PORTG=0xFF;
/*Led 0,2,4 an PORTA aus*/
PORTA&=~((1<<DDA0)|(1<<DDA2)|(1<<DDA4));
timer_init()
while(byte_timer=0){}
/*LED 0,2,4 an PORTB an*/
PORTB|=((1<<DDB0)|(1<<DDB2)|(1<<DDB4));
while(1){}
}
> "make.exe" all
-------- 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.
Size before:
test.elf :
section size addr
.data 0 8388864
.text 268 0
.bss 0 8388864
.noinit 0 8388864
.eeprom 0 8454144
.stab 756 0
.stabstr 1240 0
Total 2264
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
> Process Exit Code: 2
#include <avr/io.h>
#include <inttypes.h>
#include <avr/interrupt.h>
#include <avr/signal.h>
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);
/*Output Compare Register beschreiben*/
cli()
OCR1=15625;
/*Timer Datenregister zurrücksetzen*/
TCNT1=0;
sei()
}
SIGNAL(SIG_OUTPUT_COMPARE)
{
cli()
/*Timer anhalten*/
TCCR1B&=~((1<<CS10)|(1<<CS12));
byte_timer=1;
}
int main(void)
{
/*Alle LEDs als Ausgänge*/
DDRA=0xFF;
DDRB=0xFF;
DDRC=0xFF;
DDRD=0xFF;
DDRE=0xFF;
DDRF=0xFF;
DDRG=0xFF;
/*Alle LEDs an PORTA an bis auf die letzte,alle LEDs an PORTD auf
bis auf die letzte und alle LEDs an PORTG an.*/
PORTA=0x7E;
PORTB=0x80;
PORTC=0x0;
PORTD=0x0;
PORTE=0x0;
PORTF=0x0;
PORTG=0xFF;
/*Led 0,2,4 an PORTA aus*/
PORTA&=~((1<<DDA0)|(1<<DDA2)|(1<<DDA4));
timer_init()
while(byte_timer=0){}
/*LED 0,2,4 an PORTB an*/
PORTB|=((1<<DDB0)|(1<<DDB2)|(1<<DDB4));
while(1){}
}
> "make.exe" all
-------- 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.
Size before:
test.elf :
section size addr
.data 0 8388864
.text 268 0
.bss 0 8388864
.noinit 0 8388864
.eeprom 0 8454144
.stab 756 0
.stabstr 1240 0
Total 2264
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
> Process Exit Code: 2