Ich könnte echt durchdrehen.
kann das sein das man den Interrupt wieder löschen muss?
Der Servo bleibt in einer Stellung stehen. Und zwar immer in der wo (Count+440) steht zB. bei 440. wenn man Count+490 eingibt fährt er auf 490.
Das heißt Count wird nicht hochgezählt.
Ich weiß nicht warum.
Hab das Programm nochmal leicht umgeschrieben.
Hier der Code:
Aus dem AVR-GCC-Tutorial werde ich irgendwie auch nicht schlau.Code:#include <avr/io.h> #include <stdint.h> #include <avr/interrupt.h> //#include <util/delay.h> #ifndef F_CPU #define F_CPU 16000000 #endif #define Scheinwerfer 0 #define Rueckleuchten 1 #define PWM_ServoPort 5 //Globale Variablen uint8_t a; uint16_t i; //uint16_t count; //hier geändert (wegkommentiert) //void IR_Servosteuerung(uint16_t i); //hier geändert (wegkommentiert) //---------------------------------Interrupt-routinen--------------------------------- ISR(TIMER1_OVF_vect) //Diese Routine soll bei Overflow von Timer1 ausgeführt werden { while (a==0) { //IR_Servosteuerung(i); //hier geändert (wegkommentiert) i=i+1; if (i==50) { a=1; } } while (a==1) { //IR_Servosteuerung(i); //hier geändert (wegkommentiert) i=i-1; if (i==0) { a=0; } } } //---------------------------------Helligkeitsmessung--------------------------------- void helligkeitsmessung(void) { uint16_t LDR; ADCSRA |= (1<<ADSC); while (ADCSRA & (1<<ADSC)) { ; } LDR = ADCL; LDR += (ADCH<<8); if (LDR<150) { PORTD |= (1<<Scheinwerfer); PORTD |= (1<<Rueckleuchten); } if (LDR>160) { PORTD &= ~(1<<Scheinwerfer); PORTD &= ~(1<<Rueckleuchten); } } //-------------------------------------IR_Servosteuerung--------------------------------------- void IR_Servosteuerung(uint16_t count) //hierher wird der Wert von i //übergeben { OCR1A=(count+440); //440=min, 490=max } //-------------------------------------initialisierungen--------------------------------------- void Initial_ADC0(void) { ADMUX = 0x00; //AREF, resultat rechtsbündig, ADC-Eingang ADC0 ADCSRA = ((1<<ADEN) | (1<<ADPS2) | (1<<ADPS1) | (1<<ADPS0)); //ADC eingeschaltet, Teilungsfaktor.. DDRD |= ((1<<Scheinwerfer) | (1<<Rueckleuchten)); } void Initial_IR_Servo(void) { TCCR1A = ((1<<WGM11)|(1<<COM1A1)|(1<<COM1A0)); //9-Bit PWM, Inverted Mode TCCR1B = (1<<CS12); //Prescaler 256 DDRD |= (1<<PWM_ServoPort); PORTD |= (1<<PWM_ServoPort); } //---------------------------------------Hauptprogramm--------------------------------- int main(void) { Initial_ADC0(); Initial_IR_Servo(); a=0; i=0; while(1) { cli(); //hier geändert helligkeitsmessung(); IR_Servosteuerung(i); //hier geändert sei(); //hier geändert } }
MfG Jan







Zitieren

Lesezeichen