Andrean4ik Опубликовано 8 августа, 2014 Поделиться Опубликовано 8 августа, 2014 (изменено) Добрый день, по ходу работы над 7-ми сегментными часами на ATmega8515 вылезла проблема с прерываниями, по счетчику. Перелопатил кучу информации и даташит, но в данном виде программы прерывания не работают, в чем может быть проблема? #define F_CPU 8000000 #include <avr/io.h> #include <util/delay.h> #include <avr/interrupt.h> #define digit_display_time 10 unsigned char milliseconds, seconds, ten_seconds, minutes, ten_minutes, hours, ten_hours; ISR(TIMER1_COMPA_vect) { milliseconds++; TCNT1H=0x00; TCNT1L=0x00; if (milliseconds >= 1000 ) { milliseconds = 0; seconds++; }; if (seconds >= 10) { seconds = 0; ten_seconds++; }; if (ten_seconds >= 6) { ten_seconds = 0; minutes++; }; if (minutes >= 10) { minutes = 0; ten_minutes++; }; if (ten_minutes >= 6) { ten_minutes = 0; hours++; }; if (hours >= 10) { hours = 0; ten_hours++; }; if (ten_hours >= 2 && hours == 4) { ten_hours = 0; hours=0; }; } void timer_init() { //OCR1A=125; OCR1AH = 0b00000000;// 125 OCR1AL = 0b01111101; //Предделитель на х64 TCCR1B = (0<<CS12)|(1<<CS11)|(1<<CS10); //Прерывание по совпадению TC1 A TIMSK=(1<<OCIE1A); sei(); } int main(void) { timer_init(); unsigned char digits[10] = {63,6, 91, 79, 102, 109, 125, 7, 127, 111}; DDRA = 0b11111111; DDRC = 0b11111111; PORTC = 0b00000000; while(1) { PORTA = digits[seconds]; DDRC = 0b00001000; _delay_ms(digit_display_time); PORTA = digits[ten_seconds]; DDRC = 0b00000100; _delay_ms(digit_display_time); PORTA = digits[minutes]; DDRC = 0b00000010; _delay_ms(digit_display_time); PORTA = digits[ten_minutes]; DDRC = 0b00000001; _delay_ms(digit_display_time); } } Clock.rar Изменено 8 августа, 2014 пользователем Andrean4ik 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
COKPOWEHEU Опубликовано 8 августа, 2014 Поделиться Опубликовано 8 августа, 2014 Перелопатил кучу информации и даташит, но в данном виде программы прерывания не работают, в чем может быть проблема?В симуляторе прерывания работают. Как Вы проверяли? Просто по изменению переменных? Если переменные используются как в прерывании, так и в основной программе, их надо объявлять как volatile. 0 Ругался на отсутствие форматирования исходного кода (включая отсутствие осмысленных комментариев и наличие неубранного после конфигуратора мусора) не менее 15 раз. Часть моих наработок. Ссылка на комментарий Поделиться на другие сайты Поделиться
20% скидка на весь каталог электронных компонентов в ТМ Электроникс!Акция "Лето ближе - цены ниже", успей сделать выгодные покупки!Плюс весь апрель действует скидка 10% по промокоду APREL24 + 15% кэшбэк и бесплатная доставка!Перейти на страницу акции Реклама: ООО ТМ ЭЛЕКТРОНИКС, ИНН: 7806548420, info@tmelectronics.ru, +7(812)4094849
Andrean4ik Опубликовано 8 августа, 2014 Автор Поделиться Опубликовано 8 августа, 2014 Перелопатил кучу информации и даташит, но в данном виде программы прерывания не работают, в чем может быть проблема?В симуляторе прерывания работают. Как Вы проверяли? Просто по изменению переменных? Если переменные используются как в прерывании, так и в основной программе, их надо объявлять как volatile. Спасибо, микроконтроллеры да и язык С для меня в новинку, поэтому volatile для меня оказалось неожиданностью =) 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
Выбираем схему BMS для корректной работы литий-железофосфатных (LiFePO4) аккумуляторов Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ, также как и для других, очень важен контроль процесса заряда и разряда, а специализированных микросхем для этого вида аккумуляторов не так много. Инженеры КОМПЭЛ подготовили список имеющихся микросхем и возможных решений от разных производителей. Подробнее>> Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161
COKPOWEHEU Опубликовано 9 августа, 2014 Поделиться Опубликовано 9 августа, 2014 Если есть сомнения в работе какого-то узла (в данном случае - прерываний) так проверять надо именно его. Например, дергать в прерывании ногой, если уж симуляторы не даются или есть подозрения в их некорректной работе. В Вашем случае это выглядело бы как ISR(TIMER1_COMPA_vect){PORTB ^= (1<<0);}, тогда если прерывание вызывается, диодик на этой ноге будет мигать. 0 Ругался на отсутствие форматирования исходного кода (включая отсутствие осмысленных комментариев и наличие неубранного после конфигуратора мусора) не менее 15 раз. Часть моих наработок. Ссылка на комментарий Поделиться на другие сайты Поделиться
Sergey-Ufa Опубликовано 11 августа, 2014 Поделиться Опубликовано 11 августа, 2014 В настройках таймера 1 вы пропустили установку верхнего предела счета. Таймер должен считать до OCR1A и затем сбрасываться в ноль. А у вас он считает до FFFF и далее с нуля. Нужно установить WGM12 в TCCR1B 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
Рекомендуемые сообщения
Присоединяйтесь к обсуждению
Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.
Примечание: Ваш пост будет проверен модератором, прежде чем станет видимым.