Example #1
0
/*
@brief		初始化CAPK

@param		无
@return		CAPKERR_xxx
*/
int CAPK_Init(void)
{
	int fp;

	fdel(FILE_CAPK);
	fp = fopen(FILE_CAPK, "w");
	fclose(fp);
	if (fp < 0)
	{
		return(CAPKERR_INIT);
	}
	return(CAPKERR_NONE);
}
Example #2
0
void main(void)
{
// Declare your local variables here

// Crystal Oscillator division factor: 1
#pragma optsize-
CLKPR=(1<<CLKPCE);
CLKPR=(0<<CLKPCE) | (0<<CLKPS3) | (0<<CLKPS2) | (0<<CLKPS1) | (0<<CLKPS0);
#ifdef _OPTIMIZE_SIZE_
#pragma optsize+
#endif

// Input/Output Ports initialization
// Port B initialization
// Function: Bit7=In Bit6=In Bit5=In Bit4=In Bit3=In Bit2=In Bit1=In Bit0=In 
DDRB=(0<<DDB7) | (0<<DDB6) | (0<<DDB5) | (0<<DDB4) | (0<<DDB3) | (0<<DDB2) | (0<<DDB1) | (0<<DDB0);
// State: Bit7=T Bit6=T Bit5=T Bit4=T Bit3=T Bit2=T Bit1=T Bit0=T 
PORTB=(0<<PORTB7) | (0<<PORTB6) | (0<<PORTB5) | (0<<PORTB4) | (0<<PORTB3) | (0<<PORTB2) | (0<<PORTB1) | (0<<PORTB0);

// Port C initialization
// Function: Bit6=In Bit5=In Bit4=In Bit3=In Bit2=In Bit1=In Bit0=In 
DDRC=(0<<DDC6) | (0<<DDC5) | (0<<DDC4) | (0<<DDC3) | (0<<DDC2) | (0<<DDC1) | (0<<DDC0);
// State: Bit6=T Bit5=T Bit4=T Bit3=T Bit2=P Bit1=P Bit0=P
PORTC=(0<<PORTC6) | (0<<PORTC5) | (0<<PORTC4) | (0<<PORTC3) | (1<<PORTC2) | (1<<PORTC1) | (1<<PORTC0);

// Port D initialization
// Function: Bit7=In Bit6=In Bit5=Out Bit4=Out Bit3=Out Bit2=Out Bit1=In Bit0=In 
DDRD=(0<<DDD7) | (0<<DDD6) | (1<<DDD5) | (1<<DDD4) | (1<<DDD3) | (1<<DDD2) | (0<<DDD1) | (0<<DDD0);
// State: Bit7=P Bit6=T Bit5=0 Bit4=0 Bit3=0 Bit2=T Bit1=T Bit0=T 
PORTD=(1<<PORTD7) | (0<<PORTD6) | (0<<PORTD5) | (0<<PORTD4) | (0<<PORTD3) | (0<<PORTD2) | (0<<PORTD1) | (0<<PORTD0);

// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: 16000,000 kHz
// Mode: Fast PWM top=0xFF
// OC0A output: Non-Inverted PWM
// OC0B output: Disconnected
// Timer Period: 0,016 ms
// Output Pulse(s):
// OC0A Period: 0,016 ms Width: 0 us
TCCR0A=(1<<COM0A1) | (0<<COM0A0) | (0<<COM0B1) | (0<<COM0B0) | (1<<WGM01) | (1<<WGM00);
TCCR0B=(0<<WGM02) | (0<<CS02) | (0<<CS01) | (1<<CS00);
TCNT0=0x00;
OCR0A=0x00;
OCR0B=0x00;


// Timer/Counter 1 initialization
// Clock source: System Clock
// Clock value: 16000,000 kHz
// Mode: Normal top=0xFFFF
// OC1A output: Disconnected
// OC1B output: Disconnected
// Noise Canceler: Off
// Input Capture on Falling Edge
// Timer Period: 4,096 ms
// Timer1 Overflow Interrupt: On
// Input Capture Interrupt: Off
// Compare A Match Interrupt: Off
// Compare B Match Interrupt: Off
TCCR1A=(0<<COM1A1) | (0<<COM1A0) | (0<<COM1B1) | (0<<COM1B0) | (0<<WGM11) | (0<<WGM10);
TCCR1B=(0<<ICNC1) | (0<<ICES1) | (0<<WGM13) | (0<<WGM12) | (0<<CS12) | (0<<CS11) | (1<<CS10);
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: 16000,000 kHz
// Mode: Fast PWM top=0xFF
// OC2A output: Disconnected
// OC2B output: Non-Inverted PWM
// Timer Period: 0,016 ms
// Output Pulse(s):
// OC2B Period: 0,016 ms Width: 8,0314 us
ASSR=(0<<EXCLK) | (0<<AS2);
TCCR2A=(0<<COM2A1) | (0<<COM2A0) | (1<<COM2B1) | (0<<COM2B0) | (1<<WGM21) | (1<<WGM20);
TCCR2B=(0<<WGM22) | (0<<CS22) | (0<<CS21) | (1<<CS20);
TCNT2=0x00;
OCR2A=0x00;
OCR2B=0x00;

// Timer/Counter 0 Interrupt(s) initialization
TIMSK0=(0<<OCIE0B) | (0<<OCIE0A) | (1<<TOIE0);

// Timer/Counter 1 Interrupt(s) initialization
TIMSK1=(0<<ICIE1) | (0<<OCIE1B) | (0<<OCIE1A) | (1<<TOIE1);

// Timer/Counter 2 Interrupt(s) initialization
TIMSK2=(0<<OCIE2B) | (0<<OCIE2A) | (0<<TOIE2);

// External Interrupt(s) initialization
// INT0: Off
// INT1: Off
// Interrupt on any change on pins PCINT0-7: Off
// Interrupt on any change on pins PCINT8-14: Off
// Interrupt on any change on pins PCINT16-23: Off
EICRA=(0<<ISC11) | (0<<ISC10) | (0<<ISC01) | (0<<ISC00);
EIMSK=(0<<INT1) | (0<<INT0);
PCICR=(0<<PCIE2) | (0<<PCIE1) | (0<<PCIE0);

// USART initialization
// Communication Parameters: 8 Data, 1 Stop, No Parity
// USART Receiver: On
// USART Transmitter: On
// USART0 Mode: Asynchronous
// USART Baud Rate: 9600
UCSR0A=(0<<RXC0) | (0<<TXC0) | (0<<UDRE0) | (0<<FE0) | (0<<DOR0) | (0<<UPE0) | (0<<U2X0) | (0<<MPCM0);
UCSR0B=(0<<RXCIE0) | (0<<TXCIE0) | (0<<UDRIE0) | (1<<RXEN0) | (1<<TXEN0) | (0<<UCSZ02) | (0<<RXB80) | (0<<TXB80);
UCSR0C=(0<<UMSEL01) | (0<<UMSEL00) | (0<<UPM01) | (0<<UPM00) | (0<<USBS0) | (1<<UCSZ01) | (1<<UCSZ00) | (0<<UCPOL0);
UBRR0H=0x00;
UBRR0L=0x67;

// Analog Comparator initialization
// Analog Comparator: On
// The Analog Comparator's positive input is
// connected to the AIN0 pin
// The Analog Comparator's negative input is
// connected to the AIN1 pin
// Interrupt on Rising Output Edge
// Analog Comparator Input Capture by Timer/Counter 1: Off
ACSR=(0<<ACD) | (0<<ACBG) | (0<<ACO) | (0<<ACI) | (1<<ACIE) | (0<<ACIC) | (1<<ACIS1) | (1<<ACIS0);
ADCSRB=(0<<ACME);
// Digital input buffer on AIN0: On
// Digital input buffer on AIN1: On
DIDR1=(0<<AIN0D) | (0<<AIN1D);

// ADC initialization
// ADC disabled
ADCSRA=(0<<ADEN) | (0<<ADSC) | (0<<ADATE) | (0<<ADIF) | (0<<ADIE) | (0<<ADPS2) | (0<<ADPS1) | (0<<ADPS0);

// SPI initialization
// SPI disabled
SPCR=(0<<SPIE) | (0<<SPE) | (0<<DORD) | (0<<MSTR) | (0<<CPOL) | (0<<CPHA) | (0<<SPR1) | (0<<SPR0);

// TWI initialization
// Mode: TWI Slave
// Match Any Slave Address: Off
// I2C Bus Slave Address: 0x21
twi_slave_init(false,0x21,twi_rx_buffer,sizeof(twi_rx_buffer),twi_tx_buffer,twi_rx_handler,twi_tx_handler);

// Alphanumeric LCD initialization
// Connections are specified in the
// Project|Configure|C Compiler|Libraries|Alphanumeric LCD menu:
// RS - PORTB Bit 0
// RD - PORTB Bit 7
// EN - PORTB Bit 1
// D4 - PORTB Bit 2
// D5 - PORTB Bit 3
// D6 - PORTB Bit 4
// D7 - PORTB Bit 5
// Characters/line: 16
lcd_init(16);
lcd_putsf("  WELCOME!   ");
// Global enable interrupts

ACSR |= (1<<ACIE); // включить перывания от компарат
ACSR &= ~(1<<ACIE); // выкл прер компар

vyh_t0 = 0;             // выкл таймер 0
TCCR0A &= ~(1<<CS00); 



procfreq = 16000000 ;
ton1 = fdel(1080);


for (n = 0; n < 32; n++) 
{
    sost[n] = esost[n];
    twi_tx_buffer[n] = sost[n];
} 
//PORTD.4 = 1;
//delay_ms(100);
//PORTD.4 = 0;
//PORTD.2 = 1;
#asm("sei")
//vyh_plus = 1;
OCR2B=0x00; // выключение преобразователя
//          time = 0;
//          while (time < 1000) #asm("wdr");  // задержка 25 мСек
//
// OCR2B=0x50; // выключение преобразователя
//
//          time = 0;
//          while (time < 1000) #asm("wdr");  // задержка 25 мСек
//
//OCR2B=0x50; // выключение преобразователя
//
//          time = 0;
//          while (time < 1000) #asm("wdr");  // задержка 25 мСек
// vyh_plus = 0;
// vyh_minus = 1;
//
//OCR2B=0xB0; // выключение преобразователя
//
//          time = 0;
//          while (time < 1000) #asm("wdr");  // задержка 25 мСек
//
//
//OCR2B=0xFF; // выключение преобразователя
//

    while (1)
    {   
      for (i = 0 ; i < 128 ; i++)
      {     
          if(kn1&kn3) nagh = 0;  // сброс флага нажатия при отпущеной кнопке      
          if(!kn1) 
          {
            if(!nagh)  // если кнопка только-что нажата 
            {            
                nagh = 1;
                lcd_gotoxy(3,0);
                if (fix)
                {
                    fix  = 0;         // если была включена фиксация, - выключить            
                    lcd_putchar(' ');
                }
                else
                {
                    fix = 1;         // включить фиксацию  
                    page = (i / 32); // на какой странице зафиксировано    
                    if (page == 0) page = 4; 
                    page--;
                    page *= 32;
                    pos = 0;
                    x_dysp = 5;
                    y_dysp = 0;
                    lcd_putchar('F');  
                }

            }               
            
          }    
          if(fix) 
          { 
            if(p10++ == 0)
            { 
            // отображение подч

                    lcd_gotoxy(x_dysp,y_dysp);   
                    lcd_putchar('_'); 
             
            }
            if(p10 == 8)
            {
                // отображение текущего состояние точки n

                                sig_bayt = (pos+page) / 4;    // текущий байт в слове состояния                 
                                sig_bit = ((pos + page) - (sig_bayt * 4)) * 2;   // текущая двухбитовая пара в слове состояния
                                lcd_gotoxy(x_dysp,y_dysp); 
                                if((sost[sig_bayt]&(1<<sig_bit)))
                                {
                                     if((sost[sig_bayt]&(1<<(sig_bit+1)))) lcd_putchar(255); 
                                     else  lcd_putchar('.'); 
                                } else lcd_putchar(' ');
                    
             
            }
            if(p10 > 16)
            {
                p10 = 0;

                if(!kn2)
                {      
                    if(++pos >  30) 
                    {
                        pos = 0;
                        x_dysp = 3;
                        y_dysp = 0;
                    } 
                    else if(pos == 15) pos++;
                    x_dysp++;
                    if(++x_dysp > 15) 
                    {
                        y_dysp++;
                        x_dysp = 1;
                    } 
                    
                } 
                if(!kn3)
                {    
                    if(!nagh)  // если кнопка только-что нажата 
                    {            
                    nagh = 1;
                     // включение - выключение охраны   
                    lcd_gotoxy(x_dysp,y_dysp); 
                                sig_bayt = (pos+page) / 4;    // текущий байт в слове состояния                 
                                sig_bit = ((pos + page) - (sig_bayt * 4)) * 2;   // текущая двухбитовая пара в слове состояния
                                if((sost[sig_bayt]&(1<<sig_bit)))
                                {
                                    sost[sig_bayt] &= ~(1<<sig_bit);     // выкл. охрану
                                    lcd_putchar(' ');
                                } else 
                                {   
                                    sost[sig_bayt] |= (1<<sig_bit);      // включаем охрану
                                    lcd_putchar('.');
                                }
                    }
                }  
            }
          }
          sig_bayt = i / 4;    // текущий байт в слове состояния                 
          sig_bit = (i - sig_bayt * 4) * 2;   // текущая двухбитовая пара в слове состояния               
          OCR0A=0x00;
          a = 49728;  
          TCCR0A |= (1<<CS00);  // включить таймер 0;
          TIMSK0 |= (1<<TOIE0); // 
          time = 0;
          while (time < 6) #asm("wdr");  // задержка 25 мСек
          zvuk = 0;  
          if(i == 0) while (time < 75) #asm("wdr"); // если первый шаг, задержка 300 мСек
          TIMSK0 &= ~(1<<TOIE0); // 
          OCR0A=0x00;
          a = 49728;  
          TCCR0A &= ~(1<<CS00);    // выкл таймер 0                       
          vyh_t0 = 0;            // переключить а вход 
          ACSR |= (1<<ACIE); // включить перывания от компарат   
          time = 0;
          while (time < 9) #asm("wdr");    // 25мСек + 12
          ACSR &= ~(1<<ACIE); // выкл прер компар  
          vyh_t0 = 1;            // переключить а вyход           
          if (flag435) // если был отлет 435 Гц
          { 
            switch (i)
            {
                case 31:  
                    // вывод первой половины на дисп  
                    if (!fix)
                    {
                        clear_lcd();
                        lcd_gotoxy(0,0);
                        lcd_putsf("1   ");
                        n = 1;
                        for (sig_bayt = 0; sig_bayt < 8 ; sig_bayt++)
                        {
                            for(sig_bit = 0; (sig_bayt == 3 || sig_bayt == 7)? sig_bit < 6: sig_bit < 8; sig_bit += 2)
                            {     
                                if(++n>10) n = 1;
                                lcd_putchar(47+n);
                                if((sost[sig_bayt]&(1<<sig_bit)))
                                {
                                     if((sost[sig_bayt]&(1<<(sig_bit+1)))) lcd_putchar(255); 
                                     else  lcd_putchar('.'); 
                                } else lcd_putchar(' ');
                            }
                        }  
                    } 
                    pit_ok = 1;      
                    while (time < 125) #asm("wdr");  // задержка до 0.5 сек
                    break;
                case 15:
                case 47: 
                case 63: 
                case 79: 
                case 95: 
                case 111: 
                case 127:
                    sinc_err = 1;      // ошибка синхронизации
                    zvuk = 1;
                    break;
                default:
                    if (sost[sig_bayt]&(1<<sig_bit))   // если под охраной
                    {    
                        if ((esost[sig_bayt]&(1<<sig_bit) == 0))
                        {
                            //если не был под охр. поставить под охрану.
                            OCR2B=0x50; // выдача на шим
                            vyh_plus = 1;  
                            vyh_t0 = 0;            // переключить а вход 
                            n = 0;
                            while(flag435) 
                            {
                                flag435 = 0; 
                                ACSR |= (1<<ACIE); // включить перывания от компарат   
                                time = 0;
                                while (time < 9) #asm("wdr");    // 25мСек + 12
                                ACSR &= ~(1<<ACIE); // выкл прер компар  
                                 
                                //Ждем прекращения сигнала
                                if (++n > 250) flag435 = 0;
                            }      
                            vyh_t0 = 1;            // переключить Hа вyход 
                                      
                            if(n < 251) 
                            {
                                esost[sig_bayt] |= (1<<sig_bit);      // включаем охрану если сигнал прервался
                                twi_tx_buffer[sig_bayt] = esost[sig_bayt]; // передача состояния
                            }
                            else sost[sig_bayt] &= ~(3<<sig_bit);    // если не взялась, - снять
                        }
                        else
                        {
                        // если объекм был по охраной тревога
                            sost[sig_bayt] |= (1<<(sig_bit+1));    
                            esost[sig_bayt] |= (1<<(sig_bit+1));    
                            twi_tx_buffer[sig_bayt] = esost[sig_bayt]; // передача состояния
                            trevoga = 1;  
                            zvuk = 1;
                        }
                        while(time<375) #asm("wdr");  
                        vyh_plus = 0;
                        OCR2B=0xFF;                 
                    } 
                    else  if (esost[sig_bayt]&(1<<sig_bit))  // не под охр, но был
                    {

                        esost[sig_bayt] &= ~(3<<sig_bit);      //  если был под охр. снять с охр. 

                        twi_tx_buffer[sig_bayt] = esost[sig_bayt]; // передача состояния
                        
                    }

            } 
          } 
          else      // если не было ответа
          { 
            switch (i)
            {
                case 31: 
                    // вкл питание
                     
                    if (!fix)
                    {
                        clear_lcd(); 
                        lcd_gotoxy(0,1);
                        lcd_putsf("Error Pitanie!!!");
                    } 
                    
                    pit_err = 1;
                    pit_ok = 0;
                    break;   
                case 63:  
                    // вывод второй половины на дисп  
                    if (!fix)
                    {
                        clear_lcd();
                        lcd_gotoxy(0,0);
                        lcd_putsf("31  ");
                        n = 1;
                        for (sig_bayt = 8; sig_bayt < 16 ; sig_bayt++)
                        {
                            for(sig_bit = 0; (sig_bayt == 11 || sig_bayt == 15)? sig_bit < 6: sig_bit < 8; sig_bit += 2)
                            {     
                                if(++n>10) n = 1;
                                lcd_putchar(47+n);
                                if((sost[sig_bayt]&(1<<sig_bit)))
                                {
                                     if((sost[sig_bayt]&(1<<(sig_bit+1)))) lcd_putchar(255); 
                                     else  lcd_putchar('.'); 
                                } else lcd_putchar(' ');
                            }
                        }  
                    } 
                    
                    break;
                case 95: 
                    // вывод третьей половины на дисп  
                    if (!fix)
                    {
                        clear_lcd();
                        lcd_gotoxy(0,0);
                        lcd_putsf("61  ");
                        n = 1;
                        for (sig_bayt = 16; sig_bayt < 24 ; sig_bayt++)
                        {
                            for(sig_bit = 0; (sig_bayt == 19 || sig_bayt == 23)? sig_bit < 6: sig_bit < 8; sig_bit += 2)
                            {     
                                if(++n>10) n = 1;
                                lcd_putchar(47+n);
                                if((sost[sig_bayt]&(1<<sig_bit)))
                                {
                                     if((sost[sig_bayt]&(1<<(sig_bit+1)))) lcd_putchar(255); 
                                     else  lcd_putchar('.'); 
                                } else lcd_putchar(' ');
                            }
                        }  
                    } 
                    break;
                case 127:  
                    // вывод четвертой половины на дисп  
                    if (!fix)
                    {
                        clear_lcd();
                        lcd_gotoxy(0,0);
                        lcd_putsf("91  ");
                        n = 1;
                        for (sig_bayt = 24; sig_bayt < 32; sig_bayt++)
                        {
                            for(sig_bit = 0; (sig_bayt == 27 || sig_bayt == 31)? sig_bit < 6: sig_bit < 8; sig_bit += 2)
                            {     
                                if(++n>10) n = 1;
                                lcd_putchar(47+n);
                                if((sost[sig_bayt]&(1<<sig_bit)))
                                {
                                     if((sost[sig_bayt]&(1<<(sig_bit+1)))) lcd_putchar(255); 
                                     else  lcd_putchar('.'); 
                                } else lcd_putchar(' ');
                            }
                        }  
                    } 
                    break;
                case 15: 
                case 47: 
                case 79: 
                case 111: 
                    break;
                default:
                    if ((sost[sig_bayt]&(1<<sig_bit)) == 0) 
                    {                                           
                        if (esost[sig_bayt]&(1<<sig_bit))  // не под охр, но был  
                        {
                            //если был под охр. снять с охр.  
                            esost[sig_bayt] &= ~(3<<sig_bit);      //  снять с охр.             
                            twi_tx_buffer[sig_bayt] = esost[sig_bayt]; // передача состояния
                        } 
                    } 
                    else  if ((esost[sig_bayt]&(1<<sig_bit)) == 0) //если под охраной, но не был
                    {
                        esost[sig_bayt] |= (1<<sig_bit);   // включаем охрану 
                        twi_tx_buffer[sig_bayt] = esost[sig_bayt]; // передача состояния
                    }                    
            }             
          } 
          flag435 = 0;             
          if (pit_ok)
          { 
            while (time < 125) #asm("wdr");
            pit_ok = 0;       
          }               
          
//          if (trevoga) //while (time < 375);
//          trevoga = 0;         
          if (sinc_err)  
          {
            sinc_err = 0;  
            if (!fix)
            {
                clear_lcd();
                lcd_gotoxy(0,1);
                lcd_putsf("  Error Sync!!! ");
            } else 
            {
                lcd_gotoxy(3,0); 
                lcd_putchar('F');   
            }
            break;
          }          
      }  
      

    }
    
}