/*
ADC + UART
Hardware: ATmega8 @ 7.372800MHz
PC Software:Hyper terminal @ 9600 baud, Nincs Paritas Bit, 1 Stop Bit, Flow Control = NONE
*/
#define F_CPU 7372800UL // rendszer orajel: 7.3728 MHz
#define USART_BAUDRATE 9600 // soros kommunikacio sebessege: 9600 bps
#define UBRR_ERTEK ((F_CPU / (USART_BAUDRATE * 16UL)) - 1) // UBRR
#include <avr/io.h>
#include <inttypes.h>
volatile int LDR = 0;
void Konfig8bitADC() // ADC konfiguralas (beallitas)
{
// ADMUX = 0b01100000; // Vcc mint referencia, balra rendezett ADC eredmeny
ADMUX |= (1<<REFS0)|(1<<ADLAR); // Vcc mint referencia, balra rendezett ADC eredmeny
// ADCSRA = 0b10000011; // ADC engedelyezese, ADC eloosztas = 8 (125 KHz)
ADCSRA = (1<<ADEN) | (1<<ADPS1) | (1<<ADPS0); // ADC engedelyezese, ADC eloosztas = 8 (125 KHz)
}
unsigned char Beolvas8bitADC(unsigned char csatorna)
{
ADMUX = (ADMUX & 0b11110000) | csatorna;
ADCSRA |= (1<<ADSC); // ADC konverzio elinditasa
while (ADCSRA & (1<<ADSC)); // varas az atalakitasra
ADCSRA |= (1<<ADSC); // konverzió elindítás
while (ADCSRA & (1<<ADSC)); // varas az atalakitasra
return (ADCH); // ADC ertek visszaadasa (csak a felso 8 bit (ADCH), az also 2 zajos bit elhagyasa)
}
void KonfigUART() // UART beallitasa
{
// 9600 bps soros kommunikacio sebesseg beallitasa
UBRRL = UBRR_ERTEK; // UBRR_ERTEK also 8 bitjenek betoltese az UBRRL regiszterbe
UBRRH = (UBRR_ERTEK>>8); // UBRR_ERTEK felso 8 bitjenek betoltese az UBRRH regiszterbe
// Aszinkron mod, 8 Adat Bit, Nincs Paritas Bit, 1 Stop Bit
UCSRC |= (1 << URSEL) | (1 << UCSZ0) | (1 << UCSZ1);
//Ado es Vevo aramkorok bekapcsolasa + az RX interrupt engedelyezese
UCSRB |= (1 << RXEN) | (1 << TXEN); //
}
char UARTAdatFogad() // Ez a fuggveny a beerkezo adatokat kiolvassa az UDR regiszter bejovo pufferebol
{
while(!(UCSRA & (1<<RXC))) // Varakozas amig nincs uj bejovo adat
{
//Varakozas
}
//Most mar van beerkezett adat, amit kiolvasunk a pufferbol
return UDR;
}
void UARTAdatKuld(char data) // Ez a fuggveny a kuldendo adatot beirja az UDR regiszter kimeno pufferjebe
{
while(!(UCSRA & (1<<UDRE))) // Varakozas amig az Ado kesz nem lesz az adatkuldesre
{
//Varakozas
}
// Az Ado mar kesz az adatkuldesre, a kuldendo adatot a kimeno pufferjebe irjuk
UDR=data;
}
int main(void) // Foprogram
{
char data;
KonfigUART(); // UART Konfiguralasa
DDRC &= ~(1<<PC5); // PC5-os lab bemenet (jobb LDR)
PORTC = 0x00; // PORTC osszes laban a felhuzoellenallasok kikapcsolva
Konfig8bitADC(); // ADC beallitas lefuttatasa
while(1)
{
data = UARTAdatFogad(); // A berekezo bajt fogadasa
if(data == 'm') // Ha a fogadott bajt a 'm'-mel egyezik meg, megmerjuk a fenyerosseget
{
LDR = Beolvas8bitADC(5);
UARTAdatKuld('L');
UARTAdatKuld('D');
UARTAdatKuld('R');
UARTAdatKuld(' ');
UARTAdatKuld('A');
UARTAdatKuld('D');
UARTAdatKuld('C');
UARTAdatKuld(':');
UARTAdatKuld('0'+(LDR/100) % 10); // Szazasok ertekenek kiirasa
UARTAdatKuld('0'+(LDR/10) % 10); // Tizesek ertekenek kiirasa
UARTAdatKuld('0'+LDR % 10); // Egyesek ertekenek kiirasa
UARTAdatKuld('\n'); // Kovetkezo sor
UARTAdatKuld('\r'); // Ugras a sor elejere
}
}
}