/*
Szoftveres UART + ADC
Hardware: ATmega8 @ 7.372800MHz
LDR: PC5-os labon
Soros LCD: PC0-as labon
*/
#define F_CPU 7372800UL // rendszer orajel: 7.3728 MHz
#define offset 18
#include <avr/io.h>
#include <inttypes.h>
#include <util/delay.h> //Idozito, keslelteto rutinokat tartalmazo fajl
volatile int LDR = 0;
unsigned int idoalap;
void Konfig8bitADC() // ADC konfiguralas (beallitas)
{
ADMUX |= (1<<REFS0)|(1<<ADLAR); // Vcc mint referencia, balra rendezett ADC eredmeny
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 ki_b(char _bit,char _dat) /* ki_b(x,y) fuggveny definialasa PORTB-re. PORTB x. labara 0V-ot vagy 5V-ot adunk, attol fuggoen hogy y erteke 0 vagy 1 */
{
DDRB |= _BV(_bit); // PORTB x. lab kimenet
if(_dat)
PORTB |= _BV(_bit); // ha y=1, az x. labra 5V-ot ad
else
PORTB &= ~_BV(_bit); // ha y=0, az x. labra 5V-ot ad
}
void ki_c(char _bit,char _dat) /* ki_c(x,y) fuggveny definialasa PORTC-re */
{
DDRC |= _BV(_bit);
if(_dat)
PORTC |= _BV(_bit);
else
PORTC &= ~_BV(_bit);
}
void ki_d(char _bit,char _dat) /* ki_d(x,y) fuggveny definialasa PORTD-re */
{
DDRD |= _BV(_bit);
if(_dat)
PORTD |= _BV(_bit);
else
PORTD &= ~_BV(_bit);
}
void KonfigSzoftUART(char tx) // Szoftveres UART beallitasa
{
ki_c(tx,1);
TCCR0 = 0; // Stop Timer0
TIFR |= (1<<TOV0); // Tulcsordulas jelzobit torlese
idoalap = 255-(96 - offset);
}
void kesleltetes(unsigned int _tick) // Szoftveres UART beallitasa
{
TCNT0 = _tick; //
TCCR0 = (1<<CS01); // Start Timer0, CLK/8
while (!(TIFR & (1<<TOV0))); // varakozas amig a szamlalo eleri a kivant erteket
TIFR |= (1<<TOV0); // Tulcsordulas jelzobit torlese
TCCR0 = 0; // Stop Timer0
}
void SzoftUARTKuld(char tx, unsigned char adat) //
{
int i;
ki_c(tx,0); // Start bit
kesleltetes(idoalap); // kesleltetes a megadott idoalap-ig (104us)
for (i=0;i<8;i++)
{
ki_c(tx,adat & 0x01); // adatbit kuldese
kesleltetes(idoalap); // kesleltetes a megadott idoalap-ig (104us)
adat = adat>>1; // eltolas a kovetkezo bitre
}
ki_c(tx,1); // Stop bit
kesleltetes(idoalap); // // kesleltetes a megadott idoalap-ig (104us)
}
void SzoftUARTKuldSzoveg(unsigned char tx, char *p) // Szovegkuldo fuggveny definialasa
{
while(*p)
{
SzoftUARTKuld(tx, *p++);
}
}
int main(void) // Foprogram
{
DDRC &= ~(1<<PC5); // PC5-os lab bemenet (LDR)
PORTC = 0x00; // PORTC osszes laban a felhuzoellenallasok kikapcsolva
KonfigSzoftUART(0); // Szoftveres UART Konfiguralasa a PC0 labra
Konfig8bitADC(); // ADC beallitas lefuttatasa
while(1)
{
LDR = Beolvas8bitADC(5);
SzoftUARTKuldSzoveg(0,"?f"); // ?f soros LCD parancs: LCD torlese
SzoftUARTKuldSzoveg(0,"Szoftveres UART"); // Szoveg kiirasa
SzoftUARTKuldSzoveg(0,"?m"); // ?m soros LCD parancs: ugras a sor elejere
SzoftUARTKuldSzoveg(0,"?k"); // ?k soros LCD parancs: kurzor lefele
SzoftUARTKuldSzoveg(0,"Adc: "); // Szoveg kiirasa
SzoftUARTKuld(0,'0'+(LDR/100) % 10); // Szazasok ertekenek kiirasa
SzoftUARTKuld(0,'0'+(LDR/10) % 10); // Tizesek ertekenek kiirasa
SzoftUARTKuld(0,'0'+LDR % 10); // Egyesek ertekenek kiirasa
SzoftUARTKuldSzoveg(0,"?m"); // ?m soros LCD parancs: ugras a sor elejere
SzoftUARTKuldSzoveg(0,"?j"); //// ?j soros LCD parancs: kurzor felfele
_delay_ms(1000); // várakozás 1 másodpercig
}
}