/*****************************************************
This program was produced by the
CodeWizardAVR V1.24.4 Standard
Automatic Program Generator
 Copyright 1998-2004 Pavel Haiduc, HP InfoTech s.r.l.
http://www.hpinfotech.com
e-mail:office@hpinfotech.com

Project :  10
Version : 1
Date    : 07.03.2006
Author  : Belov                           
Company : Home                            
Comments: 
 


Chip type           : ATtiny2313
Clock frequency     : 4,000000 MHz
Memory model        : Tiny
External SRAM size  : 0
Data Stack size     : 32
*****************************************************/

#include <tiny2313.h>
#define klfree 0x77F  //      
#define kzad 3000     //    
#define kandr 30      //  
#define bsize 30      //     

unsigned char flz;   //  
unsigned int bufr[bsize];   //      
#pragma warn-
eeprom unsigned char klen;          //     
eeprom unsigned int bufe[bsize];   //   EEPROM   
#pragma warn+

//     1
interrupt [TIM1_OVF] void timer1_ovf_isr(void)
{
   flz=1;     //   
}

//      A  1
interrupt [TIM1_COMPA] void timer1_compa_isr(void)
{
   flz=1;     //   
}

//     
unsigned int incod (void)
{
   unsigned int cod0=0;  //  
   unsigned int cod1;
   unsigned char k;
   
   for (k=0; k<kandr; k++)   //  
     {
       cod1=PINB&0x7;               //    
       cod1=(cod1<<8)+(PIND&0x7F);  //     
       if (cod0!=cod1)              //    
       {
          k=0;                      //   ,  
          cod0=cod1;                //      
       }
     }
   return cod1;
}


//   
void wait (unsigned char kodz)
{
   if (kodz==1) TIMSK=0x40;     //     
   else TIMSK=0x80;
   TCNT1=0;                    //  
   flz=0;                      //   
   #asm("sei");                //  
   if (kodz!=2) while(flz==0); //  
}


//  
void main(void)
{
unsigned char ii;  //  
unsigned char i;   //  
unsigned int codS; //  

PORTB=0xE7;  //  B
DDRB=0x18;

PORTD=0x7F;  //  D
DDRD=0x00;

TCCR1A=0x00;  // / 1
TCCR1B=0x03;
TCNT1=0;
OCR1A=kzad;

ACSR=0x80;    //  

while (1)
      {
m1:     while (incod() != klfree); //   
        while (incod() == klfree); //   
        ii=0;
m2:     #asm("cli");               //  
        wait(1);                   //  1- 
        codS=incod();              //    ,  
        bufr[ii++]=codS;           //     
        if (ii>=bsize) goto m4;    //   
        
        wait(2);                        //  2- 
m3:     if (incod() != codS) goto m2;   //     
        if (flz==0) goto m3;         //     
        
m4:     if (PINB.7==1) goto comp;       //   

//------------------------------    EEPROM
        klen=ii;                                //   
        for (i=0; i<ii; i++)  bufe[i]=bufr[i];  //    
        goto zamok;

//------------------------------  
comp:   if (klen!=ii) goto m1;              //   
        for (i=0; i<ii; i++)  if (bufe[i]!=bufr[i]) goto m1;  //   


//------------------------------  
zamok:  PORTB.4=1;        //  
        wait(3);          //  3- 
        PORTB.4=0;        //  
      };
}
