MIKR/learning/comparator_led_state.c

47 lines
962 B
C
Raw Normal View History

2024-04-16 20:18:18 +02:00
#include <avr/io.h>
#include <avr/interrupt.h>
volatile uint8_t current_led = 3;
// czyscimy czy zapalamy
volatile uint8_t reverse = 0;
void update_led(){
// przesuwamy wybrany led
uint8_t next = current_led + 1;
if (next > 3){
next = 0;
reverse = (reverse + 1) % 2;
}
if (!reverse){
// zapalamy kolejna
PORTC |= (1<<next);
}else{
// gasimy kolejna
PORTC &= ~(1<<next);
}
current_led = next;
}
int main(void){
// ustawienie C0-C3 jako wyjscie
DDRC |= 0b00001111;
uint8_t last_state = ACSR & (1<<ACO);
for(;;){
// pobieramy stan komparatora
uint8_t comparator_state = ACSR & (1<<ACO);
// jesli stan sie zmienil na wysoki to przesun ledy
if (comparator_state != last_state && last_state == 0){
update_led();
}
// zaktualizuj ostatni stan
last_state = comparator_state;
}
return 1;
}