/*
 * main.cpp
 *
 *  Created on: 12.01.2012
 *      Author: 3DRaven
 */
#define F_CPU 1000000UL

#include <avr/io.h>
#include <avr/interrupt.h>
#include <string.h>
#include <stdint.h>
#include <util/delay.h>

unsigned char digit_ar[17] = { 0b10000001, //0
		0b10111101, //1
		0b01001001, //2
		0b00011001, //3
		0b00110101, //4
		0b00010011, //5
		0b00000011, //6
		0b10111001, //7
		0b00000001, //8
		0b00010001, //9
		0b11111111, // empty
		0b01111111, //-
		0b01110001, //значок градуса
		0b00001101, //d
		0b01000011, //E
		0b01101111, //r
		0b11111110 }; //.


//Номер знакоместа  на выводе порта
unsigned char SPlace_ar[4] = { 0b00010000, 0b00000100, 0b00000010, 0b00000001 };

//Глобальная переменная для хранения строки вывода
unsigned char volatile str[4] = { '-', '-', '-', '-' };
//Номер знакоместа
unsigned char volatile SignPlace = 0;

void init();

int main(void) {
	init();

	while (1) {
		cli();
		//Pull line low and wait for 480uS
		PORTB = 0x00;
		DDRB = 0xFF;
		_delay_us(430); //480 //this must be smaller when moving delay func to other .c file
		//Release line and wait for 60uS
		DDRB = 0x00;
		//PORTB = 0xFF;
		_delay_us(60); //60
		//Store line value and wait until the completion of 480uS period
		char r = PINB;
		_delay_us(420); //420
		//Return the value read from the presence pulse (0=OK, 1=WRONG)
		if (r != 0)
			str[1] = '0';
		sei();
	}
	return (0); // should never happen
}

//Прерывание первого счетчика - выдает на индикатор строку
ISR(TIMER0_OVF_vect)
{
	unsigned char m = 0;

	TCNT0 = 0;
	//#asm("cli");

	switch (str[SignPlace]) {
	case '0':
		m = 0;
		break;
	case '1':
		m = 1;
		break;
	case '2':
		m = 2;
		break;
	case '3':
		m = 3;
		break;
	case '4':
		m = 4;
		break;
	case '5':
		m = 5;
		break;
	case '6':
		m = 6;
		break;
	case '7':
		m = 7;
		break;
	case '8':
		m = 8;
		break;
	case '9':
		m = 9;
		break;
	case ' ':
		m = 10;
		break;
	case '-':
		m = 11;
		break;
	case 'o':
		m = 12;
		break;//Градус
	case 'd':
		m = 13;
		break;
	case 'E':
		m = 14;
		break;
	case 'r':
		m = 15;
		break;
	case '.':
		m = 16;
		break;
	default:
		m = 16;
		break;
	}
	PORTD = digit_ar[m];
	DDRC = SPlace_ar[SignPlace];
	SignPlace = SignPlace + 1;
	if (SignPlace == 4)
		SignPlace = 0;
	sei();
	//Прерывание после обработки этого будут запрещены, разрешим
}

void init() {
	DDRB = 0xFF;//PB2 на выход, остальные на выход
	PORTB = 0xFF;//Низкий потенциал на порту
	//Инициализация портов для индикатора
	DDRD = 0xFF;//Выводы порта D входы
	PORTD = 0xF7;//Выводы не нагружены
	//Нужно питать по очереди. Индикатор пробило поэтому если подать на него питание, он
	//разность потенциалов на всех остальных погасит
	DDRC = 0xFF;//Выводы порта C выходы (нога 26 отрублена, так как на МК не пашет)
	PORTC = 0xFF;//Выводы нагружены
	//Инициализация порта для датчика температуры
	// Timer/Counter 0 initialization
	// Clock source: System Clock
	// Clock value: 125,000 kHz
	TCCR0 = 0x02;//Делитель частоты на 64 (ближе нету, а усложнять не хочется) так как у меня частота 1МГц, а не 4
	TCNT0 = 0x00;//Начальное значение счетчика
	TIMSK = 0x01;//Включаем прерывания от первого счетчика

	//	// 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;
	//
	//	// Analog Comparator initialization
	//	// Analog Comparator: Off
	//	// Analog Comparator Input Capture by Timer/Counter 1: Off
	//	ACSR = 0x80;
	//	SFIOR = 0x00;

	sei();
}
