#define F_CPU 16000000UL
#include <avr/io.h>
#define SWITCH_PIN PD2
void ADC_Init() {
ADMUX = 64; // Ustawia napięcie referencyjne na AVcc (napięcie zasilania)
ADCSRA = 231; // Włącza ADC i ustawia preskaler na 128
}
void PWM_Init() {
TCCR1A = 131; // Ustawia tryb fast PWM i ustawia ustawienie nieinwazyjne na OC1A
TCCR1B = 3; // Ustawia preskaler na 64
DDRB = 2; // Ustawia pin PB1 (OC1A) jako wyjście
}
void PWM_SetDutyCycle(uint16_t duty_cycle) {
OCR1A = duty_cycle;
}
uint16_t ADC_Read(uint8_t channel) {
ADMUX = (ADMUX & 240) | (channel & 15); // Wybiera kanał wejściowy
ADCSRA |= 64; // Rozpoczyna konwersję
while (ADCSRA & 64); // Czeka na zakończenie konwersji
return ADC; // Zwraca wynik konwersji (10-bitowy)
}
int main() {
ADC_Init();
PWM_Init();
// Ustaw pin PD2 jako wejście
DDRD &= ~(1 << SWITCH_PIN);
// Włącz wbudowany opornik podciągający
PORTD |= (1 << SWITCH_PIN);
while (1) {
if (PIND & (1 << SWITCH_PIN)) {
uint16_t adc_value = ADC_Read(0);
uint16_t pwm_value = adc_value >> 2;
PWM_SetDutyCycle(pwm_value);
} else {
PWM_SetDutyCycle(0);
}
}
return 0;
}