Вот что получилось:
Код
void init (void)
{
// настройка TMR0 на 100 Hz (сотые доли секунды).
// регистр OPTION
T0CS = 0; // bit 5 TMR0 Выбор источника сигнала 0 - Fosc/4 (внутренний); 1 - подача на T0CKI
T0SE = 0; // bit 4 TMR0 Выбор фронта приращения TMR0 при внешнем тактовом сигнале (0-передний фронт)
PSA = 0; // bit 3 Выбор включения предделителя: 0 - перед TMR0, 1 - перед WDT
PS2 = 1; // bit 2 Настройка предделителя на 15 Гц
PS1 = 1; // bit 1 Настройка предделителя на 15 Гц
PS0 = 1; // bit 0 Настройка предделителя на 15 Гц
TMR0 = 0; // предзагрузка TMR0, сбрасывается при переполнении.
// конец настройки TMR0 на 100 Hz (сотые доли секунды).
}
Код
void interrupt isr (void)
{
if (T0IF) // опрос флага прерывания по переполнению TMR0 (чтобы не сработало от другого источника)
{
while (45 - 1) // выполняется до тех пор, пока ( ) не равно 0. Задержка на 15 Гц * 45. Т.е. на 3 сек.
{
T0IF = 0; // сброс флага прерывания по переполнению TMR0
}
time1 = time1 + 1; // это число выводится 7-сегментный индикатор.
T0IF = 0; // сброс флага прерывания по переполнению TMR0
}
}
Вот только не срабатывает! Как был "0" на индикаторе, так и остался.
Вариант
Код
...
volatile unsigned char tmp100 = 45;
volatile unsigned char time1 = 0;
...
void interrupt isr (void)
{
if (T0IF) // опрос флага прерывания по переполнению TMR0 (чтобы не сработало от другого источника)
{
while (tmp100) // выполняется до тех пор, пока tmp100 не равно 0. Задержка на 15 Гц * 45. Т.е. на 3 сек.
{
tmp100 = tmp100 - 1; // изменение переменной-задержки
T0IF = 0; // сброс флага прерывания по переполнению TMR0
}
time1 = time1 + 1; // это число выводится 7-сегментный индикатор.
tmp100 = 45; // обнуление счетчика
T0IF = 0; // сброс флага прерывания по переполнению TMR0
}
}
не изменяет скорость счета при изменении tmp100.
Попытка написать
Код
void interrupt isr (void)
после main() вызывает ощибку при компиляции.
Сообщение отредактировал loghir - May 30 2011, 14:33