
#include <mega8.h> 
#include <stdlib.h>
#include <ctype.h>
#include <delay.h>
#include <string.h>


#asm
    .equ __w1_port=0x18
    .equ __w1_bit=2
#endasm

#include <1wire.h>
//#include <onewire.h>
#include <ds1820.h> 
         
#define MAX_DEVICES 8
unsigned char rom_codes[MAX_DEVICES][9];

unsigned char digit_ar[17]      =  {0b00111111,     //0
                                    0b00000110,     //1
                                    0b01011011,     //2
                                    0b01001111,     //3
                                    0b01100110,     //4
                                    0b01101101,     //5
                                    0b01111101,     //6
                                    0b00000111,     //7
                                    0b01111111,     //8
                                    0b01101111,     //9
                                    0b10000000,     //.
                                    0b00000000,     // empty
                                    0b01000000,     //-
                                    0b01100011,     //значок градуса
                                    0b01011110,     //d
                                    0b01111001,     //E
                                    0b00110000};    //r


//Номер знакоместа  на выводе порта
unsigned char SPlace_ar[4]      = { 0b00001000,
                                    0b00000100, 
                                    0b00000010,
                                    0b00000001};

//Глобальная переменная для хранения строки вывода
unsigned char str[4];
//Номер знакоместа
unsigned char SignPlace = 0;



void avr_init(void); 
//unsigned char search_DS18S20(void);


//Timer 0 interrupt
interrupt [TIM0_OVF] void timer0_ovf_isr(void)
{
    unsigned char m;
    bit c;
    
    TCNT0  = 0; 
    //#asm("cli");

    if (str[SignPlace] == '.') {
        m = 10;
        c   = 1;
    };
    if (str[SignPlace] == '+') {
        m = 13;
        c   = 1;
    };
    if (str[SignPlace] == '-') {
        m = 12; 
        c   = 1;
    };    
    if (str[SignPlace] == 'd') {
        m = 14; 
        c   = 1;
    };
    if (str[SignPlace] == 'E') {
        m = 15; 
        c   = 1;
    };        
    if (str[SignPlace] == 'r') {
        m = 16; 
        c   = 1;
    };
    if (isprint(str[SignPlace]) == 0) {
        m = 11; 
        c   = 1;
    };
    
    if (c == 0) {
        m   = toint(str[SignPlace]);
    }

    PORTD   =   digit_ar[m];
    PORTC   =   SPlace_ar[SignPlace];
   
    SignPlace = SignPlace + 1;
    if (SignPlace == 4) SignPlace = 0;
    //#asm("sei")
}  

// unsigned char search_DS18S20(void)
// {   
//     unsigned char presence;
//     PORTB.2 = 0;  //Выставляем логическую 1 на линии данных
//     delay_us(550); //Ждем не менее 480 мксек
//     PORTB.2 = 1;
//     delay_us(70);
//     presence = PINB.2;
//     return (presence);        
// }

void main(void)
{
    float znach;
    unsigned char i, n,devices;
    unsigned char str1[3];

    avr_init(); 
    #asm("cli");
    devices=w1_search(0xf0,rom_codes);  
    #asm("sei");
    
    //Сообщаем сколько датчиков нашли    
    itoa(devices, str);
    str1[0] = 'd';
    strcat(str, str1);
    
    //Ждем
    delay_ms(500); 
    
    if (devices == 0) {
        str[0] = 'E';    //Выводим сообщение об ошибке.
        str[1] = 'r';
        str[2] = 'r';
        str[3] = '';
        while (1){
            //Ходим по кругу.
       };
    } else {
        str[0] = '';
        str[1] = '';
        str[2] = '';
        str[3] = '';
    };
    delay_ms(500);
//    delay_ms(1000);
//         str[0] = '';
//         str[1] = '';
//         str[2] = '';
//         str[3] = '';
//     delay_ms(500);
//         str[0] = 'd';
//         str[1] = 'd';
//         str[2] = 'd';
//         str[3] = 'd'; 
        
//     delay_ms(500);
//     #asm("cli"); 
//     devices =   search_DS18S20();
//       itoa(devices, str);
//     str1[0] = 'd';
//     strcat(str, str1); 
//     #asm("sei"); 
    while (1)
            {
                 for (i=0;i<devices;i++)
                 {  
                   
                    //#asm("nop");
                    #asm("cli"); 
                    #asm("nop");
                    znach=ds1820_temperature_10(&rom_codes[i][0])/10;
                    #asm("sei");
                    #asm("nop");
                    n = i + 1;
                    itoa(n, str);
                    str1[0] = 'd';
                    strcat(str, str1);
                    delay_ms(250);  
                    
                    if (znach == -999) {
                        str[0] = 'E';
                        str[1] = 'r';
                        str[2] = 'r';
                        str[3] = '';
                    } else {
                        itoa((int)znach, str);
                        str1[0] = '+';
                        strcat(str, str1);
                    };
                    
                    delay_ms(1000);
                    
                    str[0] = '';
                    str[1] = '';
                    str[2] = '';
                    str[3] = '';
                    //devices = 2 * devices;
                    delay_ms(5);
                };
            };


   
}

void avr_init(void)
{
// Input/Output Ports initialization
// Port B initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In 
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=P 
PORTB=0x00;
DDRB=0x04;

// Port C initialization
// Func6=Out Func5=Out Func4=Out Func3=Out Func2=Out Func1=Out Func0=Out 
// State6=T State5=T State4=T State3=T State2=T State1=T State0=T 
PORTC=0x00;
DDRC=0xFF;

// Port D initialization
// Func7=Out Func6=Out Func5=Out Func4=Out Func3=Out Func2=Out Func1=Out Func0=Out 
// State7=0 State6=0 State5=0 State4=0 State3=0 State2=0 State1=0 State0=0 
PORTD=0x00;
DDRD=0xFF;

// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: 125,000 kHz
TCCR0=0x02;
TCNT0=0x00;

// 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;

// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=0x01;

// Analog Comparator initialization
// Analog Comparator: Off
// Analog Comparator Input Capture by Timer/Counter 1: Off
ACSR=0x80;
SFIOR=0x00;

//#asm("sei") 
}
