/*
************************************************************************
Nazwa pliku - ADC_przyk2.c
Autor - Wojciech Chojnacki
http://www.tkdami.net/~voytek/
voytek@tkdami.net
Data - 21-04-2005
Procesor Atmel ATmega
Przykład serii konwersji wyzwalanej przyciskiem. Obliczenie średniej.
Wynik wyświetlany na ośmiu diodach.
Licencja - GPL
Modyfikowany -
************************************************************************
*/

#include <avr/io.h>
// Zdefiniowanie uzywanych portów.
#define PORT_AD PORTC // Port z wejściami analogowymi
#define DDR_AD DDRC
#define PORT_OUT PORTB // Port do którego przyłączone są diody LED
#define DDR_OUT DDRB
#define PORT_F PORTD // Port do którego przyłączony jest przycisk. Bit 4 tego portu
// jest wykorzystany jako flaga naciśnięcia klawisza
#define DDR_F DDRD
#define PIN_F PIND

unsigned int licznik; // Zmienna do zliczania obiegów pętli
unsigned int pomiar; // Zmienna do przechowywania wyniku pomiaru
unsigned char i; // Ilośc pomiarów dokonywanych po nacisnięciu przycisku
unsigned int wynik; // Zmienna do liczenia średniej z wyników pomiaru



void Inicjalizacja(void)
{
DDR_AD=
0x00; // Port jako wejścia
PORT_AD=0x00; // Port C wejścia bez podciągania
DDR_OUT=0xFF; // Port jako wyjścia
PORT_OUT=0xFF; // Wyjścia w stanie wysokim
DDR_F=0xF0; // Młodsza połowa portu jako wejścia starsze cztery bity jako wyjścia
PORT_F=0xFF; // Wejścia z podciąganiem wyjścia w stanie wysokim

// Wybranie wewnętrznego żródła napięcia odniesienia
ADMUX |= _BV(REFS0);
ADMUX |=
_BV(REFS1);
// Wybranie sposobu zapisu wyniku z wyrównaniem do lewej (osiem starszych bitów wyniku w rejestrze ADCH)
ADMUX |= _BV(ADLAR);
// Zezwolenie na konwersję
ADCSRA |= _BV(ADEN);
// Wybranie częstotliwości dla taktowania przetwornika (1/8 częstotliwosci zegara kontrolera)
ADCSRA |= _BV(ADPS0);
ADCSRA |=
_BV(ADPS1); //
}


int main(void)
{
Inicjalizacja(); // Inicjalizacja kontrolera

while(
1)
{
licznik++;
// Liczenie obiegów pętli (tłumienie drgań styków przycisku)
if (licznik==3000)
{
licznik=
0; // Zerowanie licznika obiegów pętli
PORT_F=PORT_F |= _BV(4); //
}

if ((
bit_is_set(PORT_F, 4))&&(bit_is_clear(PIN_F, 2))) // Jesli naciśnięto przycisk i
// flaga przycisnięcia klawisza nie jest wyzerowana to:
{
PORT_F &= ~
_BV(4); // Wyzerowanie flagi naciśnięcia klawisza
wynik=0;
i=
9;
while(i)
{
ADCSRA |=
_BV(ADSC); // Rozpoczęcie przetwarzania
while(bit_is_set(ADCSRA,ADSC)) // Oczekiwanie na zakończenie przetwarzania
{};
pomiar=ADCH;
// Zapisanie starszych 8 bitów wyniku konwersji do
// zmiennej "pomiar"
wynik=wynik+pomiar; // Sumowanie wyników pomiarów dokonywanych w serii
i--;
}
wynik=wynik/
9; // Wyliczenie średniej
PORT_OUT=~wynik; // Wyświetlenie średniej z wyników pomiarów
}

if (
bit_is_clear(PIN_F, 2)) // Sprawdzenie czy klawisz jest wcisnięty
{
licznik=
0;
}
}
}