/*
************************************************************************
Nazwa pliku - ADC_przyk1.c
Autor - Wojciech Chojnacki.
Data - 21-04-2005
Procesor Atmel ATmega
Przykład jednokrotnej konwersji wyzwalanej przyciskiem.
Wynik wyświetlany na ośmiu diodach.
Licencja - GPL
Modyfikowany -
************************************************************************
*/

#include <avr/io.h>

#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


void Inicjalizacja(void)
{
DDR_AD=
0x00; // Port jako wejścia
PORT_AD=0x00; // 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
ADCSRA |= _BV(ADPS0);
ADCSRA |=
_BV(ADPS1);
}


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

while(
1)
{
licznik++;
// Liczenie obiegów pętli
if (licznik==4000)
{
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śnieto przycisk i
// flaga przyciśnięcia klawisza nie jest wyzerowana to:
{
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"
PORT_OUT=~pomiar; // Wyswietlenie wyniku pomiaru
PORT_F &= ~_BV(4); // Wyzerowanie flagi naciśnięcia klawisza
}
if (
bit_is_clear(PIN_F, 2)) // Sprawdzenie czy klawisz jest jeszcze wciśnięty
{
licznik=
0;
}
}
}