Но столкнулся с проблемой:при работе 2 датчиков одновременно устройство выдает не корректные данные(показания постоянно то увеличиваются, то уменьшаются). Пока программа не отображает частоту(т.к в принципе устройство представляет собой частотомер с 2-мя каналами), а кол-во тактов счетчика.
Помогите разобраться.
Код: Выделить всё
#include <mega8.h>
// Alphanumeric LCD Module functions
#asm
.equ __lcd_port=0x18 ;PORTB
#endasm
//#define TimeRefresh 1000000
#include <lcd.h>
#include <stdio.h>
#include <delay.h>
unsigned long r;
volatile unsigned long f,TC0_ovf,TC1_ovf,TC2_ovf,Time1,counter=0,TimeRefresh=100000,i,g;
char buffer[20];
unsigned long tmp;
//char CDI[30][30] ;
// External Interrupt 0 service routine
interrupt [EXT_INT0] void ext_int0_isr(void)
{
if(TCCR0==0x0) //если тс\0 выключен
{
TCNT0=0; //обнуляем счетчик
TC0_ovf=0; // и счетчик переполнений
TCCR0=0x04 ; // включаем счетчик
i=0;
}
else
{
TCCR0=0x0; // выключаем счетчик
Time1=TCNT0; // считываем показания
GICR=0x0; //отключаем прерывания INT
i=1;
}
}
interrupt [EXT_INT1] void ext_int1_isr(void)
{
if(TCCR2==0x0) //если тс\0 выключен
{
TCNT2=0; //обнуляем счетчик
TC2_ovf=0; // и счетчик переполнений
TCCR2=0x07; // включаем счетчик
g=0;
}
else
{
TCCR2=0x0; // выключаем счетчик
f=TCNT2; // считываем показания
GICR=0x0; // отключаем прерывания INT
g=1;
}
}
interrupt [TIM0_OVF] void timer0_ovf_isr(void)
{
TC0_ovf++; //счетчик переполнений
}
interrupt [TIM1_OVF] void timer1_ovf_isr(void)
{
TC1_ovf++ ;
}
interrupt [TIM1_COMPA] void timer1_compa_isr(void)
{
OCR1A+=TimeRefresh;
if(counter==0)
{
GICR=0x80; //разрешаем прерывания int1
counter=1;
}
else
{
GICR=0x40; //разрешаем прерывания int0
counter=0;
}
}
// Timer1 output compare B interrupt service routine
interrupt [TIM1_COMPB] void timer1_compb_isr(void)
{
// Place your code here
}
// Timer2 overflow interrupt service routine
interrupt [TIM2_OVF] void timer2_ovf_isr(void)
{
TC2_ovf++;
}
// Declare your global variables here
void main(void)
{
// Declare your local variables here
// 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=T
PORTB=0x00;
DDRB=0x00;
// Port C initialization
// Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTC=0x00;
DDRC=0x00;
// Port D 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=T
PORTD=0x00;
DDRD=0x00;
// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: 31,250 kHz
TCCR0=0x0;
//TCCR0=0x04;
TCNT0=0x00;
// Timer/Counter 1 initialization
// Clock source: System Clock
// Clock value: 1000,000 kHz
// Mode: Normal top=FFFFh
// OC1A output: Discon.
// OC1B output: Discon.
// Noise Canceler: Off
// Input Capture on Falling Edge
// Timer1 Overflow Interrupt: On
// Input Capture Interrupt: Off
// Compare A Match Interrupt: On
// Compare B Match Interrupt: On
TCCR1A=0x00;
TCCR1B=0x02;
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: 7,813 kHz
// Mode: Normal top=FFh
// OC2 output: Disconnected
ASSR=0x00;
TCCR2=0x0;
//TCCR2=0x07;
TCNT2=0x00;
OCR2=0x00;
// External Interrupt(s) initialization
// INT0: On
// INT0 Mode: Rising Edge
// INT1: On
// INT1 Mode: Rising Edge
GICR=0x0;
MCUCR=0x0F;
GIFR=0x0;
// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=0x5D;
// Analog Comparator initialization
// Analog Comparator: Off
// Analog Comparator Input Capture by Timer/Counter 1: Off
ACSR=0x80;
SFIOR=0x00;
// LCD module initialization
lcd_init(20);
// Global enable interrupts
#asm("sei")
while (1)
{
if(g!=0)
{
r=(unsigned long)f+(unsigned long)TC2_ovf*0x100; // находим суммарное значение счетчика (unsigned long)f+
}
if(i!=0)
{
tmp=(unsigned long)Time1+(unsigned long)TC0_ovf*0x100; //(unsigned long)Time1+
//tmp=(unsigned long)1000000/(2*tmp);
//r=(unsigned long)1000000/r; // вычисляем частоту
}
sprintf(buffer,"HZ %u %u",r,tmp); // записываем ее в буфер
lcd_clear();
lcd_gotoxy(1,0);
lcd_puts(buffer);
delay_ms(300);
f=0;
//access=0;
// Time2=0;
};
}


