#ifndef MCU // Welcher AVR genutzt wird, wird i.A. im Makefile definiert #define MCU atmega48P #endif #ifndef F_CPU // kann auch im Makefile definiert sein #define F_CPU 800000UL // Takt als LONG definieren, da zu groß für Integer #endif #define true 1 #define false 0 #define STK500 false #include // Namen der IO Register #include // Funktionen zum warten #include #include #include #include #include #include //PORTB als Ausgang void portb(void) { DDRB = 0xFF; DDRC = 0x00; } //globale Variable für die PWM uint16_t pwmtable_8[8] PROGMEM = {0,4,8,16,32,64,128,255}; #define ARRAY_SIZE(x) (sizeof(x)/sizeof(*x)) //long delays void my_delay(uint16_t milliseconds) { for(; milliseconds>0; milliseconds--) _delay_ms(1); } //8-Bit PWM in 8 Stufen void pwm_8_8(uint16_t delay) { int16_t tmp; #if STK500 TCCR1A = 0x81; //non-inverted PWM on OC1A, 8 Bit Fast PWM -->1000 0001 #else TCCR1A = 0xC1; //inverted PWM on OC1A, 8 Bit Fast PWM --> 1100 0001 #endif TCCR1B = 0x08; //-->0000 1000 TCCR1B &= ~0x70; //clear clk setting TCCR1B = (0<ADC void ADC_Init(void) { uint16_t result; // interne Referenzspannung als Refernz für den ADC wählen: ADMUX = (1<Hauptprogramm int main(void) { uint16_t adcval; ADC_Init(); portb (); int16_t i; int16_t step_time=100; while(1) { adcval = ADC_Read(0); //Pin0 if (adcval > 30) { OCR1A = 0; } else if (adcval < 29) { OCR1A = 250; } else { for (i=0; i<1; i++) pwm_8_8(step_time/2); } } return 0; }