#include <avr/io.h>
#include <avr/interrupt.h>
#include "usart.h"
#include "usart.c"


//макросы для работы с битами
#define InvBit(reg, bit)	 	 reg ^= (1<<(bit))
#define ClearBit(reg, bit)       reg &= (~(1<<(bit)))
#define SetBit(reg, bit)         reg |= (1<<(bit))	
#define BitIsSet(reg, bit)     ((reg &  (1<<bit)) != 0)


//переменные для подсчета количества переполнений 
volatile unsigned char sub_time_pin0 = 0;
//переменная для антидребезга
unsigned char CountDreb;
//сколько циклов опроса кнопка должна удерживаться
#define THRESHOLD 20

// количество сенсоров
#define SENSOR 9 //10. 0 тоже число
//  переменная счётчик сенсорных площадок
volatile unsigned char iSens;
// массив данных калибровки выводов
volatile int Kalibrovka[];
// переменная счётчик
int Count;
 //проверка нажатия кнопки через структуру где numb - переменная цикла
#define Clear_DDR(numb)   		( *(VirtDDR[numb].DDR_BUT) &=  (~(1<<VirtDDR[numb].BUT1)) ) 
#define Set_DDR(numb)			( *(VirtDDR[numb].DDR_BUT) |=  (1<<VirtDDR[numb].BUT1) )
#define Check_PIN(numb)         ( (*(VirtPIN[numb].PIN_BUT)&(1<<VirtPIN[numb].BUT))!=0 ) 

// структура/массив пинов сенсорных площадок
struct _STRUCT_PIN      
{
	volatile	unsigned char   *PIN_BUT;         //порт кнопки   (PIND, PINA...)
				unsigned char   BUT;              //пин кнопки   (PD0, PA1...)
};

struct _STRUCT_PIN  VirtPIN[] = 
{
	{&PIND,PD3},
	{&PINB,PB1},
	{&PINB,PB4},
	{&PIND,PD2},
	{&PINB,PB0},
	{&PINB,PB3},
	{&PIND,PD4},
	{&PINB,PB2},
	{&PINB,PB5},
//	{&PIND,PD5},	//<--- нет 1Мом резистора на выводе
	{&PIND,PD6},
//	{&PINB,PB6}		//<--- нет 1Мом резистора на выводе
};

// структура/массив регистров направления сенсорных площадок
struct _STRUCT_DDR      
{
	volatile	unsigned char   *DDR_BUT;         //порт кнопки   (DDRD, DDRA...)
				unsigned char   BUT1;              //пин кнопки   (PD0, PA1...)
};

struct _STRUCT_DDR  VirtDDR[] = 
{
	{&DDRD,PD3},
	{&DDRB,PB1},
	{&DDRB,PB4},
	{&DDRD,PD2},
	{&DDRB,PB0},
	{&DDRB,PB3},
	{&DDRD,PD4},
	{&DDRB,PB2},
	{&DDRB,PB5},
//	{&DDRD,PD5},	//<--- нет 1Мом резистора на выводе
	{&DDRD,PD6},
//	{&DDRB,PB6}		//<--- нет 1Мом резистора на выводе
};


int main( void )
{ 
  // инициализация пинов контроллера для работы с сенсорными площадками
  // устанавливаем выводы на выход (DDR = 1) и в устанавливаем ноль (PORT = 0)
	DDRD  |= (1<<PD2)|(1<<PD3)|(1<<PD4)|(1<<PD6); 
	PORTD &= (1<<PD2)&(1<<PD3)&(1<<PD4)&(1<<PD6); 
	DDRB  |= (1<<PB0)|(1<<PB1)|(1<<PB2)|(1<<PB3)|(1<<PB4)|(1<<PB5);
	PORTB &= (1<<PB0)&(1<<PB1)&(1<<PB2)&(1<<PB3)&(1<<PB4)&(1<<PB5);
	USART_Init();
	//разрешаем прерывания  x
	sei();
	USART_SendStr("Button: "); 
   
// калибровочная часть НАЧАЛО 
// выполняется один раз после инициализации периферии
//++++++++++++++++++++++++++++++++++++++++++++++++++
for (iSens=0; iSens<=SENSOR; iSens++)
	 {
		Clear_DDR(iSens);						// сбросили ёмкость на сенсоре
		Count = 0;								// обнулили счётчик
		Set_DDR(iSens);							// начали заряжать ёмкость сенсорной площадки
		while(!Check_PIN(iSens))				// инкременировать счётчик до тех пор пока не выйдет из нуля в единицу. значит ёмкость зарядилась
		{
			Count++;							// проверка счётчика. если счётчик равен ff значит пин контроллера и ёмкость сенсорной площадки калибровку не прошли. а значит бида-бида.
			if (Count==0xFF)
			{
				break;
			}
			
		}		
		Clear_DDR(iSens);						// сбросили ёмкость на сенсоре и переходим к следующему сенсору
		Kalibrovka[iSens]=Count+1;				// сохранили показание счётчика в массиве калибровки. с этими значениями будет проверяться нажата "кнопка или нет"
	 } 
//++++++++++++++++++++++++++++++++++++++++++++++++++
// калибровочная часть КОНЕЦ
  return 0;
}
//  рабочая часть НАЧАЛО
//++++++++++++++++++++++++++++++++++++++++++++++++++    
/*
  while(1)
  {
	for (iSens=0; iSens<=SENSOR; iSens++)
		 {
			Clear_DDR(iSens);						// сбросили ёмкость на сенсоре
			Count = 0;								// обнулили счётчик
			Set_BIT(iSens);							// начали заряжать ёмкость сенсорной площадки
			while(!Check_PIN(iSens))				// инкременировать счётчик до тех пор пока не выйдет из нуля в единицу. значит ёмкость зарядилась
			{
				Count++;							// проверка счётчика. если счётчик равен ff значит пин контроллера и ёмкость сенсорной площадки калибровку не прошли. а значит бида-бида.
				if (Count==0xFF)
				{
					break;
				}
			}
			Clear_DDR(iSens);						// сбросили ёмкость на сенсоре и переходим к следующему сенсору
			if (Count > Kalibrovka[iSens])			
			{
			
				USART_SendStr(iSens);
			}
													
		 } 
  }
  */
//++++++++++++++++++++++++++++++++++++++++++++++++++   
//  рабочая часть КОНЕЦ



