Goodefine писал(а): Timer/Counter1, Output Compare B Match Interrupt не используется
Используется. По
Compare А симистор открывается, по
Compare B закрывается (импульс 25 мкс)
Не легче ли и понятней применить Timer/Counter2 Overflow Interrupt
Не легче. Потому что я с этого и начал. При этом результат тот же.
ШИМ я не использую!!!!!!!! Мне надо выключить подсветку через 10-15 сек "бездействия". И включить при нажатии на любую кнопку (опять же на 10-15 сек). А у меня при нажатии на кнопку подсветка загорается и сразу же гаснет.
Размер кода приличный. Выкладывать всё не имеет смысла. Никто не будет разбираться. Вот основные моменты:
int0, int1, timer0, timer1, timer2.
Почему то так же сбоят часы. Например вместо 11 года устанавливается 14.
И ещё, при удержании кнопки увеличения яркости, часы продолжают идти!!!!! Секунды перерисовываются. Это вообще фантастика. Как??? Если попав в
if (cmd == 0b11111000) { мы крутимся в нем. И к отрисовке секунд не должно переходить. Этого вообще не понимаю. Чудеса какие то
Код: Выделить всё
volatile unsigned int count_RTC = 0;
volatile unsigned int Light_delay = 0;
....
// External Interrupt 0 service routine
interrupt [EXT_INT0] void ext_int0_isr(void)
{
if (start_triac_timer == 1) {
OCR1A = nagruzka[status];
OCR1B = nagruzka[status]+60;
TCNT1 = 0; // сбросили таймер
TCCR1B=0x02;
//GICR| = 0x80; // запретили прерывание INT0 // GIFR = 0x10000000 (или см. строчку ниже)
GICR&=~(1<<6); // запретили прерывание INT0 // GIFR = 0x10000000
}
else {
TCCR1B=0x00;
}
}
// External Interrupt 1 service routine
interrupt [EXT_INT1] void ext_int1_isr(void)
{
TCNT0=0xFA; // запускаем таймер на 96 мкс
TCCR0=0x04; // частота таймера 62.500 кГц
if (tick >= 90 && tick < 98)
...................
// получение команды с пульта
}
// Timer 0 overflow interrupt service routine
interrupt [TIM0_OVF] void timer0_ovf_isr(void)
{
TCNT0=0xFA; //переинициировали таймер - отсчитывает 96 мкс
tick++; //увеличили число тиков
if (tick > 500) { //если прошло более 48 мс
TCCR0=0x00; //сбросили все к исходному состоянию
TCNT0=0x00;
tick = 0;
start_cond = 0;
cmd = 0;
}
}
// Timer 1 output compare A interrupt service routine
interrupt [TIM1_COMPA] void timer1_compa_isr(void)
{
TRIAC_PIN = 0; // открыли симистор
}
// Timer 1 output compare B interrupt service routine
interrupt [TIM1_COMPB] void timer1_compb_isr(void)
{
TRIAC_PIN = 1; // вернулись в режим ожидания
GIFR|=(1<<6); // сбросили флаг прерывания - Флаг сбрасывается ЕДИНИЦЕЙ
GICR|=(1<<6); // разрешаем прерывание INT0.
}
// Timer 2 output compare interrupt service routine
interrupt [TIM2_COMP] void timer2_comp_isr(void)
{
Light_delay++;
if (Light_delay > 3000) {
TCCR2=0x00;
DISPLAY_PIN = 0;
}
}
void backlight_on (void) {
Light_delay=0;
OCR2=0x9C;
//TCCR2=0x07;
TCCR2=0x0F;
DISPLAY_PIN = 1;
}
....
void main(void) {
...
rtc_init (0,0,0);
DS1307_on ();
rtc_set_time (bin2bcd(20),bin2bcd(52),bin2bcd(19));
rtc_set_date (bin2bcd(5),bin2bcd(4),bin2bcd(11));
rtc_get_date(&day,&month,&year); //считать дату
day = bcd2bin(day);
month = bcd2bin(month);
year = bcd2bin(year);
bgcolor = 0x95BF; // дата/время
sprintf(cnt,"%02u.%02u.%02u",day,month,year);
put_string(0, 120, cnt, 0x001F, 1);
while (1) {
count_RTC++;
if (cmd == 0b11111000) { // кнопка "Display" - увеличение яркости
start_triac_timer = 1;
backlight_on ();
status++;
if (status > 97) {
start_triac_timer = 0;
status = 98;
TRIAC_PIN = 0; // полностью включили
sprintf(cnt,"%u",status); // преобразование "яркости" в строку
bgcolor = 0xC7EB; // статус
put_string(power_x, power_y,cnt, 0x001F, 3); // выводим на экран
}
else {
sprintf(cnt,"%u",status); // преобразование "яркости" в строку
bgcolor = 0xC7EB; // статус
if (status < 10) {
put_string(power_x+13, power_y,cnt, 0x001F, 3); // выводим на экран
}
else {
put_string(power_x, power_y,cnt, 0x001F, 3); // выводим на экран
};
delay_ms(delay_);
}
}
if (count_RTC > 1000) { // чтобы не опрашивать DS1307 слишком часто
count_RTC = 0;
rtc_get_time(&hour,&min,&sec); //считать время
sec = bcd2bin(sec);
min = bcd2bin(min);
hour = bcd2bin(hour);
bgcolor = 0x95BF; // дата/время
sprintf(cnt,"%02u:%02u:%02u",hour,min,sec);
put_string(106, 1, cnt, 0x001F, 1);
if (min == 0) {
rtc_get_date(&day,&month,&year); //считать дату
//DayOfWeek = bcd2bin(rtc_read(0x03)); // чтение дня недели
day = bcd2bin(day);
month = bcd2bin(month);
year = bcd2bin(year);
bgcolor = 0x95BF; // дата/время
sprintf(cnt,"%02u.%02u.%02u",day,month,year);
put_string(0, 120, cnt, 0x001F, 1);
}
}
}
}
Нельзя всё знать, достаточно понимать.