Hallo
Ohne ein paar kleine Fehler (TIMSK2 und servo_init() ) kann man dein Programm fast übersetzen:
Allerdings funktionieren die Zugriffe auf den Port A überhaupt nicht:Code:#include <avr/io.h> // I/O Port definitions #include <avr/interrupt.h> // Interrupt macros #define F_CPU 16000000 #define SERVOPIN 7 #define SERVOPORT PORTA #define DDRSERVO DDRA volatile unsigned char servopos; void servo_init(void) { TIMSK |=(1<<OCIE2); TCCR2 |= (1<<WGM21) | (1<<CS20); //Prescale=1, CTC mode OCR2 = F_CPU/100000; //alle 10µS ein IRQ DDRSERVO|=(1<<SERVOPIN); }; ISR(TIMER2_COMP_vect) { static int count; if(count>servopos) SERVOPORT&=~(1<<SERVOPIN); else SERVOPORT|=(1<<SERVOPIN); if(count<2000+servopos) count++; else count=0; }; int main(void) { DDRA = 0xFF; PORTA = 0x00; sei(); servo_init(); servopos=100; while(1) { } return 0; }
In der iom8.h (die über io.h eingebunden wird) sind die Register für Port A nicht definiert:avr-gcc -mmcu=atmega8 -Os -mno-interrupts -funsigned-char -funsigned-bitfields -Wall -Wstrict-prototypes -ggdb -c -DF_CPU=8000000UL -Wa,-acdhlmns=temp.lst temp.c -o temp.o
temp.c: In function `servo_init':
temp.c:17: error: `DDRA' undeclared (first use in this function)
temp.c:17: error: (Each undeclared identifier is reported only once
temp.c:17: error: for each function it appears in.)
temp.c: In function `__vector_3':
temp.c:25: error: `PORTA' undeclared (first use in this function)
temp.c: In function `main':
temp.c:37: error: `DDRA' undeclared (first use in this function)
temp.c:38: error: `PORTA' undeclared (first use in this function)
make: *** [temp.o] Error 1
Was schlicht daran liegt, dass der Mega8 keinen Port A besitzt. Versuche mal 'nen anderen Port.Code:... /* Port D */ #define PIND _SFR_IO8(0x10) #define DDRD _SFR_IO8(0x11) #define PORTD _SFR_IO8(0x12) /* Port C */ #define PINC _SFR_IO8(0x13) #define DDRC _SFR_IO8(0x14) #define PORTC _SFR_IO8(0x15) /* Port B */ #define PINB _SFR_IO8(0x16) #define DDRB _SFR_IO8(0x17) #define PORTB _SFR_IO8(0x18) ...
Gruß
mic
Lesezeichen