/*****************************************************
This program was produced by the
CodeWizardAVR V2.03.9 Standard
Automatic Program Generator
© Copyright 1998-2008 Pavel Haiduc, HP InfoTech s.r.l.
http://www.hpinfotech.com

Project : 
Version : 
Date    : 16.06.2013
Author  : Gef
Company : Home
Comments: 


Chip type               : ATmega8L
Program type            : Application
AVR Core Clock frequency: 8,000000 MHz
Memory model            : Small
External RAM size       : 0
Data Stack size         : 256
*****************************************************/

#include <mega8.h>
#include <stdio.h>
#include <lcd.h>
#include <math.h>
#include <stdlib.h>
#include <delay.h>
// SPI functions
#include <spi.h>
#define FQ_UD PORTB.2
#define KONR  PIND.0
#define EncoderDDR DDRD                        /*порт настройки*/
#define EncoderPORT PORTB                    /*порт управления*/
#define EncoderPIN PINB                        /*порт чтения*/
#define EncoderF1 (1<<0)                    /*пины чтения енкодера*/
#define EncoderF2 (1<<1)                    /*пины чтения енкодера*/
#define ADC_VREF_TYPE 0x00
#define pause delay_ms(10);
char u; // Переменная для счетчика для анимации 
char j;  // Переменная для счетчика для анимации
typedef unsigned char byte; // Новый тип переменной для наших символов
// Побитное изображение нашего символа для записи в контроллер дисплея 
 flash byte char0[8]={ 
 0b0000000, 
 0b0000000, 
 0b0000000, 
 0b0000000, 
 0b0000000, 
 0b0000000, 
 0b1111111, 
 0b0000000}; 

 flash byte char1[8]={ 
 0b0000000, 
 0b0000000, 
 0b0000000, 
 0b0000000, 
 0b0000000, 
 0b1111111, 
 0b1111111, 
 0b0000000}; 

 flash byte char2[8]={ 
 0b0000000, 
 0b0000000, 
 0b0000000, 
 0b0000000, 
 0b1111111, 
 0b1111111, 
 0b1111111, 
 0b0000000}; 

 flash byte char3[8]={ 
 0b0000000, 
 0b0000000, 
 0b0000000, 
 0b0000000, 
 0b1111111, 
 0b1111111, 
 0b1111111, 
 0b1111111}; 

 flash byte char4[8]={ 
 0b0000000, 
 0b0000000, 
 0b0000000, 
 0b1111111, 
 0b1111111, 
 0b1111111, 
 0b1111111, 
 0b1111111};
 
 flash byte char5[8]={ 
 0b0000000, 
 0b0000000, 
 0b1111111, 
 0b1111111, 
 0b1111111, 
 0b1111111, 
 0b1111111, 
 0b1111111};
 
 flash byte char6[8]={ 
 0b0000000, 
 0b1111111, 
 0b1111111, 
 0b1111111, 
 0b1111111, 
 0b1111111, 
 0b1111111, 
 0b1111111};    
unsigned long fraq;
float step;
//long fraq;
//long step;
float mega;
char fraq_char[10];
signed char EncoderValue = 0;
enum { State0, StateA, StateB, StateAB };     //состояния энкодера
static char EncPrev;                          //предыдущее состояние энкодера
static char EncPrevPrev;                      //пред-предыдущее состояние энкодера
int adc;
//eeprom int *band_set;
int band;
unsigned long freq;        // частота Гц
// Alphanumeric LCD Module functions
#asm
   .equ __lcd_port=0x12 ;PORTD
#endasm
// Функция записи символа в контроллер дисплея 
 void define_char(byte flash *pc,byte char_code) 
 { 
 byte i,a; 
 a=(char_code<<3)|0x40; 
 for (i=0; i<8; i++) lcd_write_byte(a++,*pc++); 
 } 
//Инициализация энкодера
void Set_band(void)
{
if (band==1){freq=1850000;fraq=1850000;};
if (band==2){freq=3750000;fraq=3750000;};
if (band==3){freq=7050000;fraq=7050000;};
if (band==4){freq=14175000;fraq=14175000;};
if (band==5){freq=21225000;fraq=21225000;};
if (band==6){freq=28850000;fraq=28850000;};
}
void RX_lev(void)
{
if (adc<=30) {lcd_gotoxy(2,1);lcd_putchar(0);lcd_putsf("         ");};
if (adc>=30 & adc<=50) {lcd_gotoxy(2,1);lcd_putchar(0);lcd_putchar(1);lcd_putsf("        ");};
if (adc>=50 & adc<=70) {lcd_gotoxy(2,1);lcd_putchar(0);lcd_putchar(1);lcd_putchar(2);lcd_putsf("        ");};
}
void EncoderInit(void)
{
    EncoderDDR &= ~(EncoderF1 | EncoderF2); //настройка портов на ввод
    EncoderPORT |= EncoderF1 | EncoderF2;   //включение подтягивающих резисторов
    EncPrev = State0;                       //инициализация предыдущего состояния
    EncPrevPrev = State0;                   //инициализация пред-предыдущего состояния
}

// Declare your global variables here
union un_dataword
{
unsigned long dataword_freq;
unsigned char dataword_byte[5];
}un;
//unsigned long freq = 9999000;        // частота Гц
unsigned char i;
float k = 34.359738368;    // коэффициент  4294967296/F = 34.359738368 для 125MHz тактовой 
void set_frq(void)
{
 un.dataword_byte[4]=0b00000000;
 un.dataword_freq = freq*k; 
 FQ_UD =1;
 FQ_UD =0;
 for (i=0; i<5; i++) 
 {
 spi(un.dataword_byte[i]);
 } 
 FQ_UD =1;
 FQ_UD =0;  
}
//Обработка энкодера
void EncoderExe(void)
{
    char EncCur = 0;

    if(! (EncoderPIN & EncoderF1)) 
        EncCur  = StateA; //опрос фазы 1 энкодера
    
    if(! (EncoderPIN & EncoderF2)) 
        EncCur |= StateB; //опрос фазы 2 энкодера
    
    if(EncCur != EncPrev) {                    //если состояние изменилось,
        if(EncPrev == StateAB && EncCur != EncPrevPrev ){//если предыдущее состояние StateAB и текущее и пред-предыдущее не равны,
            if(EncCur == StateB)              //если текущее состояние StateB,
                {EncoderValue ++;            //шаг вверх
                fraq=fraq+step;
                freq=freq+step;
                set_frq();}
            else                              
                {EncoderValue --;            //шаг вниз
                fraq=fraq-step;
                freq=freq-step;
                set_frq();}
        }
        EncPrevPrev = EncPrev;              //сохранение пред-предыдущего состояния
        EncPrev = EncCur;                   //сохранение предыдущего состояния
    }
} 
unsigned int read_adc(unsigned char adc_input)
{
ADMUX=adc_input | (ADC_VREF_TYPE & 0xff);
// Delay needed for the stabilization of the ADC input voltage
delay_us(10);
// Start the AD conversion
ADCSRA|=0x40;
// Wait for the AD conversion to complete
while ((ADCSRA & 0x10)==0);
ADCSRA|=0x10;
return ADCW;
}
void Conv_lcd(void)
{
lcd_gotoxy(0,5);lcd_putsf("mega");
}
void main(void)
{
// Declare your local variables here

// Input/Output Ports initialization
// Port B initialization
// Func7=In Func6=In Func5=Out Func4=In Func3=Out Func2=Out Func1=In Func0=Out 
// State7=T State6=T State5=0 State4=T State3=0 State2=0 State1=T State0=0 
PORTB=0x00;
DDRB=0x2C;

// Port C initialization
// Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In 
// State6=T State5=T State4=T State3=T State2=T State1=T State0=T 
PORTC=0x7F;
DDRC=0x00;

// Port D initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In 
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T 
PORTD=0x00;
DDRD=0x00;

// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: Timer 0 Stopped
TCCR0=0x00;
TCNT0=0x00;

// Timer/Counter 1 initialization
// Clock source: System Clock
// Clock value: Timer 1 Stopped
// Mode: Normal top=FFFFh
// OC1A output: Discon.
// OC1B output: Discon.
// Noise Canceler: Off
// Input Capture on Falling Edge
// Timer 1 Overflow Interrupt: Off
// Input Capture Interrupt: Off
// Compare A Match Interrupt: Off
// Compare B Match Interrupt: Off
TCCR1A=0x00;
TCCR1B=0x00;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;

// Timer/Counter 2 initialization
// Clock source: System Clock
// Clock value: Timer 2 Stopped
// Mode: Normal top=FFh
// OC2 output: Disconnected
ASSR=0x00;
TCCR2=0x00;
TCNT2=0x00;
OCR2=0x00;

// External Interrupt(s) initialization
// INT0: Off
// INT1: Off
MCUCR=0x00;

// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=0x00;

// Analog Comparator initialization
// Analog Comparator: Off
// Analog Comparator Input Capture by Timer/Counter 1: Off
ACSR=0x80;
SFIOR=0x00;

// SPI initialization
// SPI Type: Master
// SPI Clock Rate: 2000,000 kHz
// SPI Clock Phase: Cycle Start
// SPI Clock Polarity: Low
// SPI Data Order: LSB First
SPCR=0x70;
SPSR=0x00;
ADMUX=ADC_VREF_TYPE & 0xff;
ADCSRA=0x84;
// LCD module initialization
lcd_init(16);
// Запись символов char0 - char4 по адресам 0х00 - 0х04 соответственно
define_char(char0,0); 
define_char(char1,1); 
define_char(char2,2); 
define_char(char3,3); 
define_char(char4,4);
define_char(char5,5);
define_char(char6,6); 
//*band_set=4;
band=6;
if (band==0){band=3;};
Set_band();
EncoderInit();
un.dataword_byte[4]=0b00000000;
        un.dataword_freq = freq*k; 
         
               
       FQ_UD =1;
       FQ_UD =0;
        
        for (i=0; i<5; i++) 
        {
        spi(un.dataword_byte[i]);
         } 
         
        FQ_UD =1;
        FQ_UD =0;      
      
set_frq();
//fraq=9999000;
step=10;
//fraq=fraq/1000;
//ftoa(fraq,3,fraq_char);
//snprintf(fraq_char,9,"%f",fraq/100);
//ltoa(fraq,fraq_char);
//sprintf(fraq_char,"%+5u.%03u",fraq/1000,fraq%1000);
lcd_clear();
lcd_gotoxy(0,0);lcd_putsf("VFO:");
lcd_gotoxy(5,0);
lcd_puts(fraq_char);
lcd_gotoxy(0,1);lcd_putsf("RX:");
//lcd_gotoxy(3,1);lcd_putchar(255);
KONR=1;
mega=28;
while (1)
      {
      // Place your code here
      EncoderExe();
      //ftoa((fraq/1000),3,fraq_char);
      //ltoa(fraq/1000,fraq_char);
      //snprintf(fraq_char,4,"%f%f",floor(mega),fraq);
      sprintf(fraq_char,"%+5u.%03u",fraq/1000,fraq%1000);
      lcd_gotoxy(5,0);
      lcd_puts(fraq_char);
      adc=read_adc(0);
      RX_lev();
 //lcd_gotoxy(4,1);lcd_putchar(1);
  };
}
