Форум программистов, компьютерный форум, киберфорум
Микроконтроллеры ATmega AVR
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.55/11: Рейтинг темы: голосов - 11, средняя оценка - 4.55
0 / 0 / 0
Регистрация: 03.11.2016
Сообщений: 51
1

Таймер на Atmega 8 с LED дисплеем

08.06.2018, 20:02. Показов 2281. Ответов 5
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Доброго времени суток. Пытаюсь собрать таймер с LED индикатором на восьмой атмеге. Замысел такой в нулевом таймере крутится динамическая индикация и опрос кнопок, а непосредственно отсчёт 1 секунды идёт в первом таймере. Если использовать только нулевой таймер для индикации и непосредственно отсчёта то всё как бы работает но точности ни какой, при включении прерывания и по первому таймеру выставленное значение постоянно сбрасывается даже если обработчик прерывания TIMER1_COMPA_vect пуст.

более менее рабочий вариант
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
void timer_init(void)                   // Настройка таймера
{                                                              // Настройка таймера 0
    TCCR0 = (1<<CS01)|(1<<CS00);    // Установить пред делитель нулевого таймера 64
    TCNT0 = 0;                  // Сбросить нулевой таймер
    TIMSK = (1 << TOIE0);                   
}
 
 
ISR (TIMER0_OVF_vect)               // Прерывание таймера 0
{
        temp++;                                          // увеличиваем temp 
    LED_Position();                 // Вызываем функцию знакоместа
    BUTTON();                   // Вызываем функцию опроса кнопок
    if (temp >= 610){                              // задержка
    if (StartStop == 1){                 // Если условие старт равно 1
    Seconds --;                 // Отнимаем секунду  
    if (Minutes == 0 && Seconds == 0){  // Если минута и секунда равны 0
    StartStop = 0;}                 // Изменяем стартовое условие на 0
    else{                           // Если минуты и секунды больше 0
    if (Seconds == 0){              // Если секунды равны 0
    Seconds = 59;                   // Устанавливаем секунду в 59
    Minutes--;}}}                   // Отнимаем минуту
        temp = 0;}                                        // Сбрасываем temp
                                                                                            
}
Не рабочий вариант

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
void timer_init(void)                    // Настройка таймера
{                                                               // Настройка таймера 0
    TCCR0 = (1<<CS01)|(1<<CS00);    // Установить пред делитель нулевого таймера 64
    TCNT0 = 0;                  // Сбросить нулевой таймер
// Настройка таймера 1                                  
    TCCR1B = (1<<CS12);         // Устанавливаем делитель 256
    TCNT1 = 34285;              // Выставляем значение TCNT1 для коррекции счетчика, чтобы время было ровно 1 секунда  
    TIMSK |= (1 << TOIE1)|(1 << TOIE0);// Разрешить прерывание при переполнении нулевого и первого таймера TOIE0  TOIE1    
}
 
ISR (TIMER0_OVF_vect)                // Прерывание таймера 0
{
    LED_Position();                 // Вызываем функцию знакоместа
    BUTTON();                   // Вызываем функцию опроса кнопок                                                                                                    
}
 
ISR (TIMER1_COMPA_vect)
{
    TCNT1 = 34285;                                 // Коррекция 1 с
    TCCR1B = 0;                 // Останавливаем таймер
    if (StartStop == 1){                // Если условие старт равно 1
    Seconds --;                  // Отнимаем секунду 
    if (Minutes == 0 && Seconds == 0){  // Если минута и секунда равны 0
    StartStop = 0;}                 // Изменяем стартовое условие на 0
    else{                           // Если минуты и секунды больше 0
    if (Seconds == 0){              // Если секунды равны 0
    Seconds = 59;                   // Устанавливаем секунду в 59
    Minutes--;}}}                   // отнимаем минуту
    TCCR1B |= (1<<CS12);            // Запускаем таймер установив делитель 256      
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
08.06.2018, 20:02
Ответы с готовыми решениями:

ATmega AVR таймер
Извиняюсь за такой вопрос - офтоп, если не выражает модератор. Допустим я хочу изучить...

atmega 8 сторожевой таймер
В каких случаях можно полагаться на сторожевой таймер? Столкнулся с тем, что в контроллере для...

Таймер Atmega 128
Здравствуйте, объясните пожалуйста вот эти строчки поэтапно clr r18 sbi DDRA,1 ldi...

Не хочет работать таймер ATMega 2560
Здравствуйте! Занимаюсь разработкой девайса обменивающегося с периферией по RS485. Работает в...

Таймер УФ-LED с самообучением на 3 пресета на ATtiny13
Перенесено из темы про . Финский. Для изготовления плат методом плёночного фоторезиста удобно...

5
1624 / 806 / 146
Регистрация: 13.06.2015
Сообщений: 3,266
09.06.2018, 00:00 2
chip_exe, а описать назначение устройства (включая "кнопки") и прислать его схему в протеусе вам не позволяет религия, или данный таймер является сверхсекретной разработкой министерства обороны для полного уничтожения США в радиоактивный пепел?
0
3881 / 2479 / 418
Регистрация: 09.09.2017
Сообщений: 10,884
09.06.2018, 10:33 3
А переменные объявлены как volatile?
0
0 / 0 / 0
Регистрация: 03.11.2016
Сообщений: 51
09.06.2018, 16:36  [ТС] 4
Переменные обвалены как unsigned char.
Вот схема и исходники
Миниатюры
Таймер на Atmega 8 с LED дисплеем  
Вложения
Тип файла: zip LED_timer.zip (110.5 Кб, 3 просмотров)
0
3881 / 2479 / 418
Регистрация: 09.09.2017
Сообщений: 10,884
09.06.2018, 19:44 5
А должны быть как volatile unsigned char. Этот модификатор запрещает компилятору кэшировать переменные.
Ну и еще внутри функций (в т.ч. прерываний) стоит подумать об использовании static переменных вместо глобальных.
0
0 / 0 / 0
Регистрация: 03.11.2016
Сообщений: 51
10.06.2018, 15:44  [ТС] 6
Я вот не могу понять оставляю только прерывание по нулевому таймеру
и этот участок кода работает нормально
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
ISR (TIMER0_OVF_vect)               // Прерывание таймера 0
{
        temp++;                                          // увеличиваем temp 
    LED_Position();                 // Вызываем функцию знакоместа
    BUTTON();                   // Вызываем функцию опроса кнопок
    if (temp >= 610){                              // задержка
    if (StartStop == 1){                 // Если условие старт равно 1
    Seconds --;                 // Отнимаем секунду 
    if (Minutes == 0 && Seconds == 0){  // Если минута и секунда равны 0
    StartStop = 0;}                 // Изменяем стартовое условие на 0
    else{                           // Если минуты и секунды больше 0
    if (Seconds == 0){              // Если секунды равны 0
    Seconds = 59;                   // Устанавливаем секунду в 59
    Minutes--;}}}                   // Отнимаем минуту
        temp = 0;}                                        // Сбрасываем temp
                                                                                            
}
Но стоит включить нулевой и первый таймер
C
1
TIMSK |= (1 << TOIE1)|(1 << TOIE0);
как ситуация начинает повторяться сбрасываются переменные в 0

Добавлено через 19 часов 8 минут
У меня оба прерывания по таймеру срабатывали при переполнении но стоило поставить прерывание первого таймера по совпадению как всё начало работать как и задумывалось.
0
10.06.2018, 15:44
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
10.06.2018, 15:44
Помогаю со студенческими работами здесь

Загораются LED CPU; LED VGA; LED DRAM. потом тухнут и компьютер перезагружается
здравствуйте я решил собрать комп комплект такой Процессор: Intel Core i7-2600k 3.4ГГц...

WDT таймер срабатывает без задержки ATmega 328
PORTD=(0&lt;&lt;PORTD7) | (0&lt;&lt;PORTD6) | (0&lt;&lt;PORTD5) | (0&lt;&lt;PORTD4) | (0&lt;&lt;PORTD3) | (0&lt;&lt;PORTD2) |...

Таймер в Atmega 328 не хочет считать до ICR1 (Toggle OC1A)
Всем привет. Столкнулся с непониманием почему таймер не хочет работать в следующем режиме....

Нулевой таймер на срабатывание прерывания раз в сек (Atmega 8515)
Привет народ. Каким образом нужно настроить частоту на таймере 8 битном, чтобы получить прерывание...

При включении красным по очереди загораются DRAM LED, VGA LED, BOOT DEVICE LED. При этом все работает
Всем привет! Материнская плата ASUS P7P55D-E, при включении пк загораются красным по очереди DRAM...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru