
#include <util/delay.h>
#include <avr/pgmspace.h>
#include <avr/interrupt.h>
#include <avr/eeprom.h>
#include "simple_driver.h"

#include "avr/io.h"

#include <stdlib.h>
#include <avr/iom8.h>

#define LEDon	PORTD |= (1<<PIND7)
#define LEDoff  PORTD &= ~(1<<PIND7)

char buffer[7];
volatile int adc=0; 
volatile float volt=0;

void InitPORT() {

//           6543210
    DDRC = 0b1011111;
//  PC5, ADC5 bemenet, többi kimenet
    DDRB = 0xFF;
	//     76543210 
    DDRD=0b10000000;
    PORTD=0xFF;
}

void InitADC() {

//********************************************
//            76543210
    ADMUX = 0b01000000;
//********************************************
//    7  REFS1
//    6  REFS0
//       00 - Referencia az AREF láb, belső referencia lekapcsolva.
//       01 - Referencia az AVCC láb, AREF láb kondenzátorral testre kötve.
//       10 - Foglalt
//       11 - Belső 2.56 Voltos referencia, AREF láb kondenzátorral testre kötve.
//--------------------------------------------
//    5  ADLAR
//--------------------------------------------
//    4  nem használt
//--------------------------------------------
//    3  MUX3
//    2  MUX2
//    1  MUX1
//    0  MUX0
//       ADC port választás.

//********************************************
//           76543210
    ADCSRA = 0b10000111;
//********************************************
//    7  ADEN
//       ADC engedélyezve ha értéke 1, kikapcsolva ha 0.
//--------------------------------------------
//    6  ADSC
//       Egyszeri mérésnél 1-re kell állítani, hogy megtörténjen a mérés.
//       Folyamatos mérésné ha 1-re állítjuk elindul a mérés,
//       ami utánna folyamatosan fut.
//--------------------------------------------
//    5  ADFR
//       Ha 1 akkor folyamatos mérés fut, ha 0 akkor egyszeri.
//--------------------------------------------
//    4  ADIF
//       Interrupt Flag - nem kell piszkálni :)
//       Ha 1 akkor a megszakítás jött létre.
//--------------------------------------------
//    3  ADIE
//       Ha 1 akkor a mérés végén megszakítás jön létre.
//       Ha 0 akkor a megszakítás kikapcsolva.
//--------------------------------------------
//    2  ADSP2
//    1  ADSP1
//    0  ADSP0
//       Előosztás
//       000 - 1
//       001 - 2
//       010 - 4
//       011 - 8
//       100 - 16
//       101 - 32
//       110 - 64
//       111 - 128

} // InitADC

uint16_t ReadADC(uint8_t ch) {

    ch=ch&0b00000111; //Select ADC Channel ch must be 0-7
    ADMUX|=ch;

    ADCSRA|=(1<<ADSC); //Start Single conversion

    while(ADCSRA & (1<<ADSC)); //várok amíg átalakít

    return (ADCL | (ADCH<<8)); //adc kiolvasás

} // ReadADC

//--------------------------------------------
int main() {

    
    
    
    InitPORT();
    lcd_init ();
    
    InitADC();

    _delay_ms(100);
    
    lcd_control (1, 0, 0);
    lcd_cls ();
    lcd_putstr ("   UNDERSPEED   ", LCD_FIRST_LN_ADDR + 0);
    lcd_putstr (" ADC test v1.00 ", LCD_SECND_LN_ADDR + 0);
    _delay_ms(2000);
    lcd_cls ();

    for (;;) {
        lcd_putstr ("ADC test", LCD_FIRST_LN_ADDR + 0);
        lcd_putstr ("adc= ", LCD_SECND_LN_ADDR + 0);
        
        adc = ReadADC(5);
        //adc = ReadADC(5)>>1;
        itoa( adc, buffer, 10);
        lcd_putstr (buffer, LCD_SECND_LN_ADDR + 4);
        
        volt=0.48875*adc;
        itoa( volt, buffer, 10);
        lcd_putstr (buffer, LCD_SECND_LN_ADDR + 9);


        _delay_ms(100);
        lcd_cls();  
    } // for
} // main

