/
main.c
89 lines (75 loc) · 2.4 KB
/
main.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
#include <avr/io.h> //biblioteki podstawowe
#include <util/delay.h> //biblioteki - funkcja _delay
#define LED1 (1<<PD4) //deklaracje pinów (nóżek) do których podpięte są ledy i switch
#define LED2 (1<<PD5)
#define LED4 (1<<PB7)
#define LED3 (1<<PB4)
#define SWITCH (1<<PE6)
void adc_init() // funkcja inicjalizacji ADC
{
ADMUX = (1<<MUX0)|(1<<MUX1); //wybór kanału ADC3
ADCSRA = (1<<ADEN)|(1<<ADPS2)|(1<<ADPS1)|(1<<ADPS0);
//włączenie ADC, taktowanie 8MHz/128
}
uint16_t adc_read(uint8_t ch) //funkcja odczytu wartości rejestrowanej przez adc - argument to numer kanału adc
{
ch &= 0x07; // suma logiczna uniemożliwia wybranie kanału spoza zakresu
ADMUX = (ADMUX & 0xF8)|ch; // clears the bottom 3 bits before ORing, bit ADLAR=0
ADCSRA |= (1<<ADSC); // start konwersji
while(ADCSRA & (1<<ADSC)); // oczekiwanie na osiągniecie przez bit ADSC wartości 0 - ukończenia konwersji
return (ADC); //zwraca wynik (zakres 10bit~1024)
}
int main(){
uint16_t k, min, max, krok, poziom1, poziom2;
DDRB= LED3|LED4; //odpowiednie piny portu B jako wyjścia
DDRD= LED1|LED2; //odpowiednie piny portu D jako wyjścia
DDRE= ~SWITCH; //odpowiedni pin portu E jako wejście
PORTB = 0x00; //zerowanie wartości wyjść
PORTD = 0x00;
PORTE |= SWITCH; //podciągnięcie pinu ze switchem do Vcc przez wewnętrzny rezystor
adc_init(); //inicjalizacja ADC
while(1){
PORTD=LED1|LED2;
PORTB=LED3|LED4;
if (!(PINE&SWITCH)){ //oczekiwanie na naciśnięcie switcha
PORTB=0x00;
PORTD=0x00;
min=adc_read(3); //w przypadku naciśnięcia odczyt wartości ADC do zmiennej min
_delay_ms(1000);
while(1){
if (!(PINE&SWITCH)){ //oczekiwanie na naciśnięcie switcha
max=adc_read(3); //w przypadku naciśnięcia odczyt wartości ADC do zmiennej max
krok=(max-min)/3; //obliczenia granic zapalania się kolejnych diód
poziom1=min+krok;
poziom2=min+2*krok;
while(1){ //działanie programu - odczyt napięcia z ADC
PORTB=0x00;
PORTD=0x00; // i zapalanie odpowiedniej ilości diód
k=adc_read(3);
if(k<min){
PORTB=0x00;
PORTD=0x00;
}
else if(k>=min&&k<poziom1){
PORTB=0x00;
PORTD=LED1;
}
else if(k>=poziom1&&k<poziom2){
PORTB=0x00;
PORTD=LED1|LED2;
}
else if(k>=poziom2&&k<max){
PORTB=LED3;
PORTD=LED1|LED2;;
}
else{
PORTD=LED1|LED2;
PORTB=LED3|LED4;
}
_delay_ms(200);
}
}
}
}
}
}