, светодиоды как бы взамен соленоидам реле, схема подключения кнопок резистивно-параллельная. Столкнулся с тем - что есть коротковременные срабатывания других портов выхода, которые в данный момент времени должны оставаться в покое. К примеру на картинке изображен случай когда нажатие коротковременно кнопки водительского стекла ВВЕРХ - почем то сработал еще порт для команды ВНИЗ вод.стекла. Так же может сработать и порты для пассажирского стекла... пример следующий
- где нажимал кнопка водительского стекла ВНИЗ и были коротковременные срабатывания портов выхода для пассажирского стекла. Принципиально использую два порта АЦП для обработки нажатий кнопок, один для вод. двери другой для пассажирской. Попытался побороть с помошью флагов событий но без успешно. Прошу помощи как правильней обработать нажатие кнопки.
Код: Выделить всё
*****************************************************
#include <tiny13.h>
#include <delay.h>
unsigned int adc0, adc2;
unsigned int adc_tmp0, adc_tmp2;
char adc_counter0, adc_counter2;
bit f1, f2, f3, f4, f5, f6;
#define FIRST_ADC_INPUT 0
#define LAST_ADC_INPUT 2
unsigned int adc_data[LAST_ADC_INPUT-FIRST_ADC_INPUT+1];
// Bandgap Voltage Reference: Off
#define ADC_VREF_TYPE ((0<<REFS0) | (0<<ADLAR))
// ADC interrupt service routine
// with auto input scanning
interrupt [ADC_INT] void adc_isr(void)
{
static unsigned char input_index=0;
// Read the AD conversion result
adc_data[input_index]=ADCW;
// Select next ADC input
if (++input_index > (LAST_ADC_INPUT-FIRST_ADC_INPUT))
input_index=0;
ADMUX=(FIRST_ADC_INPUT | ADC_VREF_TYPE)+input_index;
// Delay needed for the stabilization of the ADC input voltage
delay_us(10);
// Start the AD conversion
ADCSRA|=(1<<ADSC);
}
// Timer 0 overflow interrupt service routine
interrupt [TIM0_OVF] void timer0_ovf_isr(void)
{
TCNT0=0x6A;
if(adc_counter0 < 20){ adc_tmp0+= adc_data[0]; adc_counter0++;} //аля антидребезг
else {adc0 = adc_tmp0/20; adc_counter0=0; adc_tmp0=0;}
if(adc_counter2 < 20){ adc_tmp2+= adc_data[2]; adc_counter2++;}
else {adc2 = adc_tmp2/20; adc_counter2=0; adc_tmp2=0;}
}
void reley(void){
//Водительскя дверь------------------------------
//Водительское стекло-------------------
if(f1==0 && f4==0 && f6==0){ //Если флаги f1 и f4 пассажиского стекла вод двери
if(adc2>220 && adc2<300) {PORTB.0=1; f5=1;}
else {PORTB.0=0;f5=0;}
}
if(f1==0 && f4==0 && f5==0){
if(adc2>320 && adc2<370) {PORTB.3=1; f6=1;}
else {PORTB.3=0;f6=0;}
}
//Пассажирское стекло-------------------
if(f2==0 && f3==0 && f5==0 && f6==0){
if(adc2 > 400 && adc2 < 460) {f1=1;PORTB.1=1;}
else {PORTB.1=0;f1=0;}
}
if(f2==0 && f3==0 && f5==0 && f6==0){
if(adc2 > 490 && adc2 < 515) {f4=1;PORTB.2=1;}
else {PORTB.2=0;f4=0;}
}
//-----------------------------------------------------------
//Пассажирская дверь-Пассажирское стекло
if(f1==0 && f4==0 && f3==0){
if(adc0 > 400 && adc0 < 460) {f2=1;PORTB.1=1;}
else {PORTB.1=0;f2=0;}
}
if(f4==0 && f1==0 && f2==0){
if(adc0 > 490 && adc0 < 515) {f3=1;PORTB.2=1;}
else {PORTB.2=0;f3=0;}
}
}
void main(void)
{
// 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: Bit5=In Bit4=In Bit3=Out Bit2=Out Bit1=Out Bit0=Out
DDRB=(0<<DDB5) | (0<<DDB4) | (1<<DDB3) | (1<<DDB2) | (1<<DDB1) | (1<<DDB0);
// State: Bit5=T Bit4=T Bit3=0 Bit2=0 Bit1=0 Bit0=0
PORTB=(0<<PORTB5) | (0<<PORTB4) | (0<<PORTB3) | (0<<PORTB2) | (0<<PORTB1) | (0<<PORTB0);
// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: 150,000 kHz
// Mode: Normal top=0xFF
// OC0A output: Disconnected
// OC0B output: Disconnected
// Timer Period: 1 ms
TCCR0A=(0<<COM0A1) | (0<<COM0A0) | (0<<COM0B1) | (0<<COM0B0) | (0<<WGM01) | (0<<WGM00);
TCCR0B=(0<<WGM02) | (0<<CS02) | (1<<CS01) | (1<<CS00);
TCNT0=0x6A;
OCR0A=0x00;
OCR0B=0x00;
// Timer/Counter 0 Interrupt(s) initialization
TIMSK0=(0<<OCIE0B) | (0<<OCIE0A) | (1<<TOIE0);
// ADC initialization
// ADC Clock frequency: 150,000 kHz
// ADC Bandgap Voltage Reference: Off
// ADC Auto Trigger Source: ADC Stopped
// Digital input buffers on ADC0: On, ADC1: On, ADC2: On, ADC3: On
DIDR0|=(0<<ADC0D) | (0<<ADC2D) | (0<<ADC3D) | (0<<ADC1D);
ADMUX=FIRST_ADC_INPUT | ADC_VREF_TYPE;
ADCSRA=(1<<ADEN) | (1<<ADSC) | (0<<ADATE) | (0<<ADIF) | (1<<ADIE) | (1<<ADPS2) | (1<<ADPS1) | (0<<ADPS0);
ADCSRB=(0<<ADTS2) | (0<<ADTS1) | (0<<ADTS0);
#asm("sei")
while (1){
reley();
}
}



