Таймер упорно не работает: (счет не начинается)
Код
// MK pic16f72
#include <pic.h>
__CONFIG (XT & WDTDIS & PWRTDIS & BOREN & UNPROTECT);
#define all_1 RC4 // общие провода 1-4 разрядов
#define all_2 RC5
#define all_3 RC6
#define all_4 RC7
unsigned char time1 = 0; // объявляем глобальные переменные счетчика 1-4 разрядов и обнуляем их.
unsigned char time2 = 0;
void podgot (void)
{
ADCON1 = 0x07; // отключение АЦП
TRISA = 0b111111; // (0/1 - выход/вход, нумерация битов в регистре справо-налево)
TRISB = 0b00000000; // (0/1 - выход/вход, нумерация битов в регистре справо-налево)
TRISC = 0b00000000; // (0/1 - выход/вход, нумерация битов в регистре справо-налево)
RBPU = 1;
PORTA = 0;
PORTB = 0b11111111;
PORTC = 0b11111111;
}
// для общего анода, КИПЦ-09.
const unsigned char arr_seg [10] =
{
/* начало массива
0bABCDEFGH – расположение сегментов по битам */
0b00000011, // «0» ! (справа-налево) 0-горит
0b10011111, // «1» !
0b00100101, // «2» !
0b00001101, // «3» !
0b10011001, // «4» !
0b01001001, // «5» !
0b01000001, // «6» !
0b00011111, // «7» !
0b00000001, // «8» !
0b00001001, // «9» !
};
void init (void)
{
// общие настройки таймеров
// регистр INTCON
GIE = 1; // разрешены все немаскированные прерывания
PEIE = 1; // разрешены все немаскированные прерывания от переферийных модулей
// настройка TMR1 для 1,90735 Hz
// регистр T1CON
T1CKPS1 = 1; // выбор коэфф. деления предделителя
T1CKPS0 = 1; // выбор коэфф. деления предделителя
T1OSCEN = 0; // выключить внутренний тактовый генератор модуля TMR1
TMR1CS = 0; // 1 - выбран внешний (0 - внутренний, Fosk/4) источник тактового сигнала модуля TMR1
TMR1H = 0x0; // preset for timer1 MSB register
TMR1L = 0x0; // preset for timer1 LSB register
// конец настройки TMR1 для 1,90735 Hz
}
void main (void)
{
podgot();
for(;;)
{
all_1 = 0; // общий анод
PORTB = arr_seg [time1];
if (RA0 == 0) // запуск TMR1
{
// регистр PIE1
TMR1IE = 1; // Разрешение прерывания по переполнению TMR1
TMR1ON = 1; // включить TMR1
}
if (RA1 == 0) // останов TMR1
{
// регистр PIE1
TMR1IE = 0; // Запрет прерывания по переполнению TMR1
TMR1ON = 0; // выключить TMR1
}
while (TMR1IF == 0) // (пауза 1,90735 Hz) ожидание флага по переполнению TMR1
{}
TMR1IF = 0;
time2 = time2 + 1;
if (time2 == 2) // деление частоты превывания TMR1 на 2
{
time2 = 0;
time1 = time1 + 1;
}
if (time1 > 9) // чтобы "time1" не вышла за пределы массива
{
time1 = 0;
}
}
}
где ошибка?!
На RA0 и RA1 подается +5В через резистор 4к7. Кнопка замыкает линии порта на "массу".
Сообщение отредактировал loghir - May 23 2011, 10:01