Ich hab mir jetzt folgendes überlegt.
Ich nehme einfach den OCR1B mit dazu und bei jedem Compare soll eine interrupt-routine ausgelöst werden, die meine Variable einen hochzählt. Hab die Funktion umgeschrieben. Die gibt jetzt einen Wert zurück.
Mein Programm gibt auch keine Fehlermeldung raus, nur mein Servo zuckt jetzt ganz schnell in mittelstellung hin und her, aber nur immer paar millimeter in jede richtung.
Kann sich vielleicht noch mal jemand meinen neuen Code ansehen?
Code:
#include <avr/io.h>
#include <stdint.h>
#include <avr/interrupt.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 count;
//---------------------------------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---------------------------------------
int IR_Servoposition(void)
{
ISR(TIMER1_COMPB_vect);
if (a==0)
{
count++;
if (count==50)
{
a=1;
}
}
if (a==1)
{
count--;
if (count==0)
{
a=0;
}
}
return (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 OC1A
TCCR1A |= ((1<<COM1B1)|(1<<COM1B0)); //Inverted Mode OC1B
TCCR1B = (1<<CS12); //Prescaler 256
DDRD |= (1<<PWM_ServoPort);
PORTD |= (1<<PWM_ServoPort);
OCR1B=500; //beliebige zeit (irgendwas unter ner ms)
}
//---------------------------------------Hauptprogramm---------------------------------
int main(void)
{
Initial_ADC0();
Initial_IR_Servo();
a=0;
count=0;
while(1)
{
sei();
helligkeitsmessung();
OCR1A = IR_Servoposition();
cli();
}
}
Wenigstens tut sich jetzt schon mal was
MfG Jan
Lesezeichen