HiSER, Я вам очень благодарен. Добавлено (07.02.2010, 21:44)
---------------------------------------------
Все таки от в этом месте хотелось бы поподробнее.
void tmr_start() {
TCNT1=0; //Обнуляем счетчик
//Устанавливаем делитель 64
//Частота МК 1000KHz/64=15.625KHz
//15625 тиков в секунду, промежуток времени до переполнения 65536/15625=4.1943s
TCCR1B=0x03;
}
Не пойму как здесь фигурирует цифра 64.
Связанны ли настройки таймера с частотой мк. Я вот хочу работать на 8 мгц.
Просто я собрал эту схему в протеусе, только семисегментник заменил на rs232
Прерывание срабатывает только 1 раз.
И переменная show_data выводится со значением 0.
Частота мк в протеусе 8 мгц. когда ставлю на 1 не работает данная прошивка.
*********
Вот код.
#include <mega8.h>
#include <stdio.h>
#include <delay.h>
int show_data=0; //Отображаемое число
void tmr_start() {
TCNT1=0; //Обнуляем счетчик
//Устанавливаем делитель 64
//Частота МК 1000KHz/64=15.625KHz
//15625 тиков в секунду, промежуток времени до переполнения 65536/15625=4.1943s
TCCR1B=0x03;
}
void tmr_stop(void) {
TCCR1B=0x00; //Выключаем счетчик
}
//Внешнее прерывание
interrupt [EXT_INT0] void ext_int0_isr(void) {
tmr_stop(); //Останавливаем счетчик
//[Счетчик]/(15625/1000)=промежуток в ms
//Сохраняем для отображения в переменой show_data
show_data=TCNT1/15.625;
printf("time= %i\r",show_data);
tmr_start(); //Включаем счетчик
}
//Прерывание переполниния счетчика 1
interrupt [TIM1_OVF] void timer1_ovf_isr(void) {
tmr_stop(); //Останавливаем счетчик
TCNT1--; //Устанавливаем максимальное значение счетчика
}
void main(void) {
UCSRA=0x00;
UCSRB=0x08;
UCSRC=0x86;
UBRRH=0x00;
UBRRL=0x33;
DDRB=7; //Выход для семи-сегментника
TCCR1A=0x00; //Устанавливаем нормальный режим счетчика, максимальное значение 0xffff
//Устанавливаем внешнее прерывание INT0, по поднятию уровня
GICR=0x40;
MCUCR=0x03;
GIFR=0x40;
TIMSK=0x04; //Прерывание для счетчика 1
#asm("sei") //Разрешаем прерывание
while (1)
{
delay_ms(1);
}
}