народ! Я тут тоже делаю частотомер на авр ат tiny2313
выложу в форум схему и программку, пообсуждайте, может кому и понравиться. у меня сразу вопрос. мс КС193ПЦ1 - делитель. ни кто не сталкивался, что-то делить не хочет. в остальном схема работает (и программа тоже)
Вот текст программы на с для указанной микры:
/************************************************** ***
Project : Freq_Counter
Version : 1.0
Date : 21.09.2007
Author : Panda
Frequnsy counter
Chip type : ATtiny2313
Clock frequency : 8,000000 MHz
Memory model : Tiny
Data Stack size : 32
************************************************** ***/
#include ‹tiny2313.h›
#include ‹delay.h›
// Alphanumeric LCD Module functions
#asm
.equ __lcd_port=0x18 ;PORTB
#endasm
#include ‹lcd.h›
//Global vaiable defination
char dg[10] = {'0','1','2','3','4','5','6','7','8','9'};
char fq[10];
float freq;
void display(void)
{//Вот тут будем отображать измеренные значения частоты
unsigned int tmp, tmp1;
unsigned char cnt;
lcd_clear();
lcd_gotoxy(0,0);
lcd_putsf("F (Hz) = ");
tmp = freq; //сделаем неявное привидение типа и отрежем дробную часть
cnt = 9;
while (tmp › 0)
{
tmp1 = tmp;
tmp1 = tmp1/10;
//lcd_putchar(dg[tmp-tmp1*10]);
fq[cnt] = dg[tmp-tmp1*10];
cnt--;
tmp = tmp1;
};
lcd_puts(fq+cnt+1);
delay_ms(500);
}
// External Interrupt 0 service routine
interrupt [EXT_INT0] void ext_int0_isr(void)
{
if (TCCR1B == 0) //если таймер остановлен, тогда начнем счет
{ TCNT1H = 0; //Обнулим внутренние счетные регистры таймера
TCNT1L = 0;
TCCR1A = 0; //просто обнуляем, там ничего не должно быть
TCCR1B = 2; //Кдел = 8, 1 тик = 1 мкс
}
else
{
//Если таймер работал, то остановим его и вычислим частоту
TCCR1B = 0; //Остановили таймер
//В TCNT1H и TCNT1L должны находиться значения длительности периода
//из расчета 1 тик = 1 мкс
GIMSK &= ~(1 ‹‹ 6); //прерывание на время измерения можно запретить
freq = 1000000/TCNT1; //Частоту посчитал
display();
EIFR = 0x40;
GIMSK |= (1 ‹‹ 6); //разрешаем прерывание
};
}
// Declare your global variables here
void main(void)
{
// Declare your local variables here
// Crystal Oscillator division factor: 1
#pragma optsize-
CLKPR=0x80;
CLKPR=0x00;
#ifdef _OPTIMIZE_SIZE_
#pragma optsize+
#endif
// Port D initialization
// Func6=In Func5=In Func4=Out Func3=Out Func2=In Func1=Out Func0=In
// State6=T State5=P State4=0 State3=0 State2=T State1=0 State0=T
PORTD=0x21;
DDRD=0x1A;
TCCR1A=0x00;
TCCR1B=0x00;
// External Interrupt(s) initialization
// INT0: On
// INT0 Mode: Rising Edge
// INT1: Off
// Interrupt on any change on pins PCINT0-7: Off
GIMSK=0x40;
MCUCR=0x03;
EIFR=0x00;
// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=0x00;
// LCD module initialization
lcd_init(16);
// Global enable interrupts
#asm("sei")
//подождем, пока пользователь отпустит кнопку
lcd_putsf("Hello...");
while ((PIND &0x01) == 1);
while (1)
{
// Place your code here
if ((PIND & 0x01) == 1)
PORTD = 0x22;
};
}
и вот схема:
‹center›
-- Прилагается рисунок: --
‹IFRAME src = "nuke/users_images/01122007/5351430.GIF" frameborder="0" name="fr6435953" scrolling="yes" width="470" height="1305" align="bottom"›[img]nuke/users_images/01122007/5351430.GIF[/img]
‹font color=red›Рисунок не умещается на странице и поэтому сжат!‹/font›
Для того, чтобы просмотреть его полностью, щелкните здесь.
‹/IFRAME›
‹/center›