
/* Name: main.c
      Проект, демонстрирующий отладку с помощью SWI отладчика программы, написанной на С.
	  Не делает ни чего полезного, но зато демонстрирует переменные разных типов.
*/

#include <string.h>
#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/pgmspace.h>
#include <avr/wdt.h>
#include <avr/eeprom.h>
#include <util/delay.h>
#include <util/delay_basic.h>
#include "debug.h"

unsigned int FCnt1; //буфер рагистра

unsigned char TimerCnt2;

unsigned long long F;

double p = 0.0;


typedef int TArray[5];

union TObj
{
    TArray Array;
	int B;
};

struct St
{
    union TObj List[5];
	int * IntArray[5];
} StVar;


ISR(TIMER0_OVF_vect)
{// счетчик переполнений для входного счетчика
   FCnt1++;
   //Dbg(); 
}


ISR(TIMER1_OVF_vect)
{// счетчик переполнений для входного счетчика
   
   if (TimerCnt2 == 30)
   {
       TCCR1B= 0;// останавливаем счет 
       TCCR0 = 0; 	   

       Dbg();
	   unsigned char FCnt0 = TCNT0;
	   unsigned int TimerCnt0 = TCNT1;

       Dbg();
	   if (FCnt0 < 20) // конкретное число надо подобрать по быстродействию
	   {
	       Dbg();

		   if (TIFR & 2) // если был флаг переноса
		   {
		       FCnt1++;
			   Dbg();
		   }
	   }

       int i;
	   for (i = 0; i < 5; i++)
	   {
	       StVar.List[i].Array[0] = i;
		   StVar.List[i].Array[1] = i + 1;
		   StVar.List[i].Array[2] = i + 2;
		   StVar.List[i].Array[3] = i + 3;
		   StVar.List[i].Array[4] = i + 4;
		   Dbg();
		   StVar.IntArray[i] = &(StVar.List[i].B);	
		   Dbg();
	   }
	   
	   unsigned long Tikes = (unsigned long)FCnt0 + (unsigned long)256 * FCnt1;
	   Dbg();

	   unsigned long Time = ((unsigned long)0x1E0000 | TimerCnt0);
	   Dbg();

	   unsigned long long X = (unsigned long long)20000000 * Tikes;	
	   Dbg();

       F = X / Time;
	   p = 1;
	   Dbg();
       
	   TimerCnt2 = 0;
	   //остановим счет
	   

	   TCNT1 = 0;
	   Dbg();

       TCNT0 = 0;
	   Dbg();

       FCnt1 = 0; 
	   Dbg();
       
	   TIFR &= 2;// сбрасыаем признак прерывания таймера 0, буде оно успело сформироваться
	   Dbg();
	   
	   TCCR1B= 1; // запуск счета
       TCCR0 = 7; // исп-ся вход тактировки

	   
   }
   else
   {
       TimerCnt2++;
   } 
}

int main(void)
{
   TIMSK = 0x82; // прерывания на переполнение первого и второго счетчиков
   Dbg();
   //  подготовительные установки: оба счетчика будут считать с 0 в 0-м режиме
   //  прескалер будет у 0-го на 8, у 1-го - 1.
   TCCR1A = 0;      				 
   Dbg();
   sei();
   Dbg();
   TCCR1B= 1; // запуск счета
   TCCR0 = 7; // исп-ся вход тактировки
   while (1);
   
}




