/*****************************************************
This program was produced by the
CodeWizardAVR V2.05.3 Standard
Automatic Program Generator
© Copyright 1998-2011 Pavel Haiduc, HP InfoTech s.r.l.
http://www.hpinfotech.com

Project : Спортивный браслет 
Version : 
Date    : 22.04.2014
Author  : Шадрин Дмитрий
Company : 
Comments: 


Chip type               : ATmega8
Program type            : Application
AVR Core Clock frequency: 8,000000 MHz
Memory model            : Small
External RAM size       : 0
Data Stack size         : 256
*****************************************************/

#include <mega8.h>

// Подключаем файл I2C протокола
#include <i2c.h>
//Подключаем файл для термодатчика Lm75
#include <lm75.h>
//Подключаем файл задержек
#include <delay.h>
//Подключаем файл работы с экраном

#include "D:\Мусор\flex_lcd.c"
#define Temp "Темпр. "
#define degree "C" 
#define Puls "Пульс"
#define Razmernost "уд/сек"
#define hello "Здраствуйте!"

// Глобальные переменные
register bit comp_flag; //флаг компатора
unsigned int adccol=0; //переменная-счётчик для АЦП
unsigned char i=0;
unsigned char value[150]; //массив значений АЦП
unsigned char k;
int temperature;
int frequency;


interrupt[ANA_COMP] void Comp(void)
{if (0<<ACO) comp_flag = 0; //если компатор пишет 0, то флаг компатора устанавливаем 0
 else comp_flag=1; //иначе флаг компатора устанавливаем 1
}

interrupt [TIM0_OVF] void Opros (void)
{
TCNT0= 0b00000000;  //Выставляем счётчик на 0
temperature=lm75_temperature_10(1); //Считываем температуру в глобальную переменную
}

interrupt [ADC_INT] void ADC (void)
{
adccol++;
if (adccol==5208) 
    {if (i<150)
        {
         value[i]=ADCH;
         i++;
         } 
     else i=0;
     adccol=0;
    }
}

int step(unsigned char b)
{
unsigned char e,ten=1;
for (e=0;e<b;e++)
    ten=ten*10;
return(ten);
}

void main(void)
{
unsigned char time1=0,time2=0,time3=0;
unsigned char j;
//Влючаем компатор, подключаем внутренний источник опорного напряжения,
//разрешаем прерывания компатора, устанавливаем, что прерывание срабатывает
//при любом изменении состояния
ACSR = (0<<ACD)|(1<<ACBG)|(1<<ACIE)|(0<<ACIS1)|(0<<ACIS0); 
SFIOR= (0<<ACME);
//Инициализируем прерывания Timer/Counter0, делитель 1024
TIMSK= (1<<TOIE0);
TCCR0= (1<<CS02)|(0<<CS01)|(1<<CS00);
TCNT0= 0b00000000;
//Инициализируем АЦП:Питание - Внутренний 2.56В  источник, с внешним конденсатором на AREF, верхний регистр заполнен полностью, вход АЦП ADC0 
ADMUX= (1<<REFS1)|(1<<REFS0)|(1<<ADLAR)|(0<<MUX3)|(0<<MUX2)|(0<<MUX1)|(0<<MUX0);
ADCSR= (1<<ADEN)|(1<< ADFR)|(1<< ADIE)|(1<<ADPS2)|(1<<ADPS1)|(1<<ADPS0);  
//Разрешаем глобальные прерывания
#asm("sei") 
i2c_init(); //Инициализация шины I2C
lm75_init(0,37,39,0); //Инициализация термометра
lcd_init();  //Инициализация экрана
lcd_puts(hello); //Выводим приветственное сообщение
delay_ms(1000);    //Задержка в 1 секунду
while (1)
      {  
      //Блок расчёта пульса
      ADCSR= (0<< ADIE);
      for (j=0;j<150;j++)
         if (value[j]>990)
            break;                      
      time1=j;
      j=j+10;
      for (j;j<150;j++)
         if (value[j]>990)
            time2=j-time1;
      time1=j;
      j=j+10;
      for (j;j<150;j++)
         if (value[j]>990)
            time3=j-time1;
      time1=(time2+time3)/2;
      frequency=83/time1;
      ADCSR= (1<< ADIE);
      // Блок вывода на экран
      lcd_clear(); //очищаем экран
      lcd_puts(Temp); //Выведим слово "Темпр. " 
      for (k=2;k>0;k--) //Выводим значение температуры
        {
         j=(temperature%step(k)+48);
         lcd_putchar(j);
        }
      lcd_puts(degree);  //Выводим "С"
      lcd_gotoxy(0,1);  //Устанавливаем курсор на 2 строку 1 символ (номерация с 0)
      lcd_puts(Puls);  //  Выводим слово "Пульс"
      for (k=2;k>0;k--)   // Выводим частоту пульса
        {
         j=(frequency%step(k)+48);
         lcd_putchar(j);
        }  
      lcd_puts(Razmernost);  // Выводим размерность "уд/сек"
      }
}

