#include <inttypes.h>
#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/sleep.h>
#include <util/delay.h>
volatile unsigned char prev_input=0, input=0;
volatile unsigned char flag=0, pot=0;
ISR(PCINT0_vect) {
prev_input = input;
input = PINB;
flag=1;
}
ISR(ADC_vect){
pot = ADCH;
}
void adc_setup (void){
// Set the ADC input to PB2/ADC1
ADMUX |= (1 << MUX0);
ADMUX |= (1 << ADLAR);
// Set the prescaler to clock/128 & enable ADC & ADC interrupts & Auto-trigger enabled
ADCSRA |= (1 << ADPS2) | (1 << ADPS1) | (1 << ADPS0) | (1 << ADEN) | (1 << ADIE) | (1 << ADATE);
// (Auto-trigger) conversion will start by Pin Change Interrupt Request
ADCSRB |= (1 << ADTS2) | (1 << ADTS1);
// disable digital input pin
DIDR0 |= 0x04;
}
int main() {
DDRB = 0b00000010;
PORTB = 0b00011111;
PCMSK |= (1<<PCINT0); // pin change mask
GIMSK |= (1<<PCIE); // enable PCINT interrupt
sei(); // enable Global interrupts
adc_setup();
while (1) {
if(flag) {
flag=0;
if(!(input&0x01)){
char unsigned n;
for(n=pot;n>0;n--){
_delay_us(40);
}
if(!flag && !(input&0x01)){
PORTB &= 0xfd;
if(pot<100){
_delay_us(1000);
} else {
_delay_us(100);
}
PORTB |= 0x02;
}
}
}
}
return 0;
}
this code for dimmer