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

Wykorzystuje biblioteki Petera Fleury
http://homepage.sunrise.ch/mysunrise/peterfleury/index.html

Modyfikowany -
************************************************************************
*/

#include <avr/io.h>
#include <stdlib.h>
#include "lcd.h"

// Zdefiniowanie uzywanych portów.
#define PORT_AD PORTC // Port z wejściami analogowymi
#define DDR_AD DDRC
#define PORT_F PORTB // Port do którego przyłączony jest przycisk. Bit 4 tego portu
// jest wykorzystany jako flaga naciśnięcia klawisza
#define DDR_F DDRB
#define PIN_F PINB

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
char buffer_n[5]; // Bufor do przechowywania wyniku konwersji z "unsigned int" na ASCII


void Inicjalizacja(void)
{
DDR_AD=
0x00; // Port jako wejścia
PORT_AD=0x00; // Port C wejścia bez podciągania
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

// Inicjalizacja LCD
lcd_init(LCD_DISP_ON); // Inicjalizacja wyswietlacza

// 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
lcd_clrscr();
lcd_puts("Wcisnij przycisk\n");

while(
1)
{
licznik++;
// Liczenie obiegów pętli (tłumienie drgań styków przycisku)
if (licznik==3200)
{
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
lcd_clrscr(); // Czyszczenie wyświetlacza LCD
lcd_puts("Wynik pomiaru: \n");
utoa(wynik, buffer_n, 10); // Konwersja liczby unsigned int do asci
lcd_puts(buffer_n); // Wysłanie na ekran LCD wyniku konwersji
lcd_puts(" Jedn. umownych");
}

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