И так начну сначала.
Вот решил сделать сибе приборчик на МК что то вроде одно-канального USB осциллографа и перед тем как мучать настоящие железки стал тестить устройство в Proteus 7.7 и столкнулся вот с какой проблемкой при замере частоты до 400герц все работает нормально, а начиная с 400 и до 1000герц измерения начинают брихать на 1герц ну и все что выще 2000герц погрешность 2 герца и тд.
Вот в чем вопрос может ли симулятор давать мне такую лажу или это я все таки напортачил где то?
программа на Pascal
Код:
program asc;
//----------
// LCD module connections
var LCD_RS : sbit at PORTD2_bit;
var LCD_EN : sbit at PORTD3_bit;
var LCD_D4 : sbit at PORTD4_bit;
var LCD_D5 : sbit at PORTD5_bit;
var LCD_D6 : sbit at PORTD6_bit;
var LCD_D7 : sbit at PORTD7_bit;
var LCD_RS_Direction : sbit at DDD2_bit;
var LCD_EN_Direction : sbit at DDD3_bit;
var LCD_D4_Direction : sbit at DDD4_bit;
var LCD_D5_Direction : sbit at DDD5_bit;
var LCD_D6_Direction : sbit at DDD6_bit;
var LCD_D7_Direction : sbit at DDD7_bit;
// End LCD module connections
var
counter, lcd_counter: integer;
text_0, cloc_txt: array[11] of char;
//----------
procedure Timer2Overflow_ISR(); org IVT_ADDR_TIMER2_OVF;
begin
inc(lcd_counter);
end;
procedure Interrupt_2(); iv IVT_ADDR_INT2;
begin
inc(counter);
end;
begin
{ Main program }
OSCCAL:= 0x7F;
//----------
SREG_I_bit:= 1;
INT2_bit:= 1;
TOIE2_bit:= 1;
TCCR2:= 5;
ASSR:= 255;
//----------
Lcd_Init();
Lcd_Cmd(_LCD_CLEAR);
Lcd_Cmd(_LCD_CURSOR_OFF);
ByteToStr(Clock_MHz, cloc_txt);
LCD_Out(1, 2, 'SNG ST - '+cloc_txt+'MHz');
//----------
//DDRB:= 0xFF;
counter:= 0;
lcd_counter:= 0;
while TRUE do
begin
if lcd_counter >= 1 then
begin
TOIE2_bit:= 0;
IntToStr(counter, text_0);
counter:= 0;
LCD_Out(2, 1, text_0+'Hz');
lcd_counter:= 0;
TOIE2_bit:= 1;
end
end
end.
схема
