Ich komm einfach nicht weiter.
Mein Prog sieht jetzt so aus:
Warum geht das bloß nicht???Code:#include <avr/io.h> #include <stdint.h> #include <avr/interrupt.h> #ifndef F_CPU #define F_CPU 16000000 #endif #define Scheinwerfer PD0 #define Rueckleuchten PD1 //#define Impulsgeber PD4 #define PWM_ServoPort PD5 #define IR_Servo OCR1A #define Motor_Links PB3 #define Motor_Rechts PD7 #define Motor_Links_Rueck PC0 #define Motor_Rechts_Rueck PC1 //---------------------------------Globale Variablen---------------------------------- uint8_t count=0; int8_t posi=25, a=1, ADC_Switch=1; uint16_t LDR, memo=2000; uint16_t IR_Messung[51]; //---------------------------------Interruptroutinen---------------------------------- ISR(TIMER1_COMPB_vect) { count++; } ISR(ADC_vect) { if (ADC_Switch) { ADC_Switch=0; LDR = ADC; ADMUX = 0x01; //Auf ADC1 umschalten ADCSRA |= (1<<ADSC); //Nach aufzeichnen Ergebniss in LDR, neue Messung starten } else { ADC_Switch=1; IR_Messung[posi] = ADC; ADMUX = 0x00; //Auf ADC0 umschalten ADCSRA |= (1<<ADSC); //Nach aufzeichnen Ergebniss in IR_Messung, neue Messung starten } } //---------------------------------Helligkeitsmessung--------------------------------- void helligkeitsmessung(void) { if (LDR<=140) { PORTD |= (1<<Scheinwerfer); PORTD |= (1<<Rueckleuchten); } if (LDR>=190) { PORTD &= ~(1<<Scheinwerfer); PORTD &= ~(1<<Rueckleuchten); } } //-------------------------------------IR_Servosteuerung--------------------------------------- int IR_Servoposition(void) { if (a>=1) { posi++; if (posi>=50) { a=0; } } else { posi--; if (posi<=0) { a=1; } } return ((posi)+440); //440=min, 490=max } //--------------------------------------Motorsteuerung----------------------------------------- void Motorsteuerung(void) { uint8_t i, farest=0; OCR0=100; //255=Max (Links) OCR2=100; //255=Max (Rechts) //if (IR_Messung > 150) if (posi<=0) { for (i=0; i<=51; i++) { if (IR_Messung[i] < memo) { memo=IR_Messung[i]; farest=i; } } } if (farest<=15) { PORTC |= (1<<Motor_Rechts_Rueck); } else if (farest>=35) { PORTC |= (1<<Motor_Links_Rueck); } else { PORTC &= ~((1<<Motor_Links_Rueck)|(1<<Motor_Rechts_Rueck)); } } //-------------------------------------initialisierungen--------------------------------------- void Initial_ADC(void) { ADMUX |= 0x00; //AREF, resultat rechtsbündig, ADC-Eingang ADC0 ADCSRA |= ((1<<ADEN) | (1<<ADPS2) | (1<<ADPS1) | (1<<ADPS0)); //ADC eingeschaltet, Teilungsfaktor.. ADCSRA |= (1<<ADIE); 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 TIMSK |= (1<<OCIE1B); DDRD |= (1<<PWM_ServoPort); PORTD |= (1<<PWM_ServoPort); //DDRD |= (1<<Impulsgeber); //PORTD |= (1<<Impulsgeber); //OCR1B=500; //beliebige zeit (irgendwas unter ner ms) } void Initial_Motoren(void) { //Ausgang Initialisieren (OC0) DDRB |= (1<<Motor_Links); //Setzen als Ausgang PORTB |= (1<<Motor_Links); //Pull-Up //Ausgang Initialisieren (OC2) DDRD |= (1<<Motor_Rechts); //Setzen als Ausgang PORTD |= (1<<Motor_Rechts); //Pull-Up //Initialisierung der Ausgänge für Rückwärtsfahren DDRC |= ((1<<Motor_Links_Rueck)|(1<<Motor_Rechts_Rueck)); //Initialisierung PWM für OC0 TCCR0 |= ((1<<WGM01)|(1<<WGM00)); //Fast PWM TCCR0 |= (1<<COM01); //Clear Output on Compare, Set on Top TCCR0 |= ((1<<CS02)|(1<<CS00)); //CLK/1024 (15,625kHz, 64µs/periode) //Compare Register ist OCR0 //Initialisierung PWM für OC2 TCCR2 |= ((1<<WGM21)|(1<<WGM20)); //Fast PWM TCCR2 |= (1<<COM21); //Clear Output on Compare, Set on Top TCCR2 |= ((1<<CS22)|(1<<CS21)|(1<<CS20)); //CLK/1024 (15,625kHz, 64µs/periode) //Compare Register ist OCR2 } //---------------------------------------Hauptprogramm--------------------------------- int main(void) { Initial_ADC(); Initial_IR_Servo(); Initial_Motoren(); ADCSRA |= (1<<ADSC); //Erste Messung starten sei(); //Globales Interrupt gesetzt while(1) { if (count) { count=0; helligkeitsmessung(); IR_Servo = IR_Servoposition(); Motorsteuerung(); } } return 0; //wird nie erreicht }
Eine Kette dreht vorwärts und die andere rückwärts.
Es ändert sich auch nichts und der Sensor reagiert auch auf nichts.
Hoffe das kuckt sich noch jemand an.
@robocat:
Das war schon richtig so. Hab im datenblatt noch mal nachgesehen.
Aber jetzt benutz ich das ja gar nicht mehr.
MfG Jan







Zitieren

Lesezeichen