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:
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
}
}
Aus dem AVR-GCC-Tutorial werde ich irgendwie auch nicht schlau.
MfG Jan
Lesezeichen