Hallo
So vielleicht:
GrußCode:#include <avr/io.h> #include <stdlib.h> #include <inttypes.h> #include <avr/interrupt.h> #include <util/delay.h> volatile unsigned char servopos0; #define SERVO_0_PIN 7 #define SERVOPORT PORTC #define DDRSERVO DDRC #ifndef F_CPU #define F_CPU 8000000UL #endif void servo_init(void) { TIMSK|=(1<<OCIE2); // Interrupt gestatten TCCR2 |= (1<<WGM21) | (1<<CS20); // CTC-Mode, no prescaling (= anstelle von |= wäre sicherer) OCR2 = F_CPU/100000; // 100000kHz DDRSERVO |= (1<<SERVO_0_PIN); } ISR(TIMER2_COMP_vect) { char cSREG; cSREG = SREG; static int scount; if(scount>servopos0)SERVOPORT&=~(1<<SERVO_0_PIN); else SERVOPORT|=(1<<SERVO_0_PIN); if(scount<2000)scount++; else scount=0; SREG = cSREG; } uint16_t readADC(uint8_t channel) { uint16_t result; ADCSRA = (1<<ADEN) | (1<<ADPS2) | (1<<ADPS1); // ADC einschalten, prescal /64 ADMUX = channel; // Kanal wählen ADMUX |= (1<<REFS1) | (1<<REFS0); // + interne 2,56V-Referenz ADCSRA |= (1<<ADSC); // Konvertierung starten while(ADCSRA & (1<<ADSC)); // warten bis Wandlung abgeschlossen result= ADC; // Ergebnis zwischspeichern ADCSRA &= ~(1<<ADEN); // ADC ausschalten return(result); // Ergebnis abliefern } /***************************Hauptprogramm***************************/ int main (void) { DDRD = 0xFF; PORTA = 0b00001111; uint16_t result0 = 0; uint16_t result1 = 0; uint16_t result2 = 0; uint16_t result3 = 0; servo_init(); sei(); while (1) { servopos0 = 100; result0= readADC(4)/3; // /3 ???? result1= readADC(5)/3; result2= readADC(6)/3; result3= readADC(7)/3; if((result0 >=300) && (result1 >= 300) && (result2 >= 300)) // ????????????????? { PORTD |= (1<<PD5); PORTA |= ((1<<PA0) | (1<<PA1) | (1<<PA2) | (1<<PA3)); _delay_ms (100); PORTA |= ((1<<PA0) | (1<<PA2)); PORTA &=~ ((1<<PA1) | (1<<PA3)); _delay_ms (100); PORTA |= ((1<<PA0) | (1<<PA1)); _delay_ms(100); } else { PORTD |= (1<<PD5); PORTA |= ((1<<PA1) | (1<<PA3)); PORTA &=~ ((1<<PA0) | (1<<PA2)); } } }
mic







Zitieren

Lesezeichen