// В настройках проекта обязательно правильно укажите свою тактовую частоту
#define F_CPU 4000000UL

#include <util/delay.h>
#include <avr/io.h>
#include <avr/iom8.h>
#include <avr/interrupt.h>
#include <avr/pgmspace.h>
#include "libs/n3310.h"
#include "libs/bitMacro.h"

#define RPM_MAX 2000; 

#define LCD_LED_PIN 5 // подсветка экрана
#define LCD_LED_PORT PORTC
#define LCD_LED_DDR DDRC

//-----------------------------------------------------------------------------------------------------------------------------
uint8_t volatile cnt = 0; //используется в INT_TIMER0
/**Счетчик импульсов тахометра. (инкрементируется при срабатывании прерывания INT0 */
uint8_t volatile imp_speed = 0;
uint16_t imp_speed_per_timer = 0;
uint8_t volatile imp_tacho = 0;
uint16_t imp_tacho_per_timer = 0;

char val[6]; //используется как параметр для itoa функций

//--- Прототипы функций -------------------------------------------------------------------------------------------------------
void init_timer (void);

//-----------------------------------------------------------------------------------------------------------------------------
//обработчик прерывания по переполнению 
ISR(TIMER0_OVF_vect){
	cnt++;
}
//функция обработчик внешнего прерывания INT0
ISR( INT0_vect ) {
  imp_tacho++;
}
ISR( INT1_vect ) {
  imp_speed++;
}

void init_wdt() {
	/* Запись лог. 1 в WDCE и WDE */
	WDTCR = (1<<WDCE) | (1<<WDE);
	/* Выкл. сторожевого таймера */
	WDTCR = 0x00;
}
void init_int(){
	DDRD |= (1<<PD2) | (1<<PD3);//INT0(PD2) и INT1(PD3) на вход
	PORTD |= (1<<PD2) | (1<<PD3);//включаем подтяжку на INT0 и INT1
	
	MCUCR |= (1<<ISC01) | (0<<ISC00) | (1<<ISC11) | (0<<ISC10); //Внешнее прерывание INT0(ISC0x) и INT1(ISC1x) по заднему фронту (с 1 на 0)
	//Для того что бы внешние прерывания заработали их надо разрешить, установив в 1 соответствующие биты в регистре GICR.
	GICR |= (1<<INT0) | (1<<INT1); //разрешаем внешнее прерывание INT0 и INT1
}
void init_timer() {
	TCCR0 = (1<<CS02) | (0<<CS01) | (1<<CS00); //тактовая для таймера0 = F_CPU/1024
	TIMSK |= (1<<TOIE0); //разрешить прерывание по переполнению ТС0
}

int main()
{
	DDRB = 0b00000000;
	DDRC = 0b00000000;
	DDRD = 0b00000000;
	init_wdt();
	init_int();
	init_timer();
	LCD_LED_DDR |= (1 << LCD_LED_PIN); //конфигурируем пин подсветки экрана на выход
	SetBit(LCD_LED_PORT, LCD_LED_PIN); //включаем подсветку
	
	sei();//разрешаем прерывания глобально
	
	LcdInit();
	LcdClear();
	
	LcdGotoXYFont(0, 0);
	LcdFStr(FONT_1X, PSTR("Init.."));
	LcdUpdate();
	_delay_ms(2500);
	
	while(1){
		LcdClear();
		//Print tachometer value
		LcdGotoXYFont(0, 2);
		uint16_t rpm = imp_tacho_per_timer * 2 * 70;
		itoa(rpm, val, 10);
		LcdStr(FONT_2X, val);
		//Print tachometer raw value
		LcdGotoXYFont(8,2);
		itoa(imp_tacho_per_timer,val,10);
		LcdStr(FONT_1X,val);
		LcdGotoXYFont(11,2);
		LcdFStr(FONT_1X,PSTR("R"));
		itoa(imp_tacho,val,10);
		LcdStr(FONT_1X,val);
		
		//Print cnt (timer0) value
		LcdGotoXYFont(8,1);
		itoa(cnt,val,10);
		LcdStr(FONT_1X,val);
		
		//imp_tacho=9;//
		LcdUpdate();
  }
  return 0;
}

//-----------------------------------------------------------------------------------------------------------------------------
