Форум программистов, компьютерный форум, киберфорум
Микроконтроллеры ATmega AVR
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.50/8: Рейтинг темы: голосов - 8, средняя оценка - 4.50
1 / 1 / 0
Регистрация: 18.02.2014
Сообщений: 29
1

Прерывание каждую секунду - нужен пример

18.02.2014, 23:47. Показов 1570. Ответов 14
Метки нет (Все метки)

Может кто скинуть работающий код и расписать почему именно так?
Ну или просто код и ссылку в каком направлении копать
0

Помощь в написании контрольных, курсовых и дипломных работ здесь.

Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
18.02.2014, 23:47
Ответы с готовыми решениями:

Действие каждую секунду
подскажите пожалуйста как сделать чтоб через каждую секунду выполнялось действие ну там вычесть из...

Обнуленние счётчика каждую секунду
Всем привет,у меня есть переменная count которая подсчитывает количество нажатий левой кнопки мыши,...

Каждую секунду отнимаются очки
Не могу понять в чем ошибка: private int x; private CountDownTimer countDownTimer; ...

Запись значений каждую секунду
Есть программа которая читает данные из прибора. Значения выводятся на экран пользователя....

14
10216 / 6596 / 495
Регистрация: 28.12.2010
Сообщений: 21,164
Записей в блоге: 1
19.02.2014, 01:02 2
Копать в направлении закрепленной темы, там и литература и примеры в ней.
0
1 / 1 / 0
Регистрация: 18.02.2014
Сообщений: 29
20.02.2014, 00:37  [ТС] 3
Мне бы конкретный пример
0
Эксперт быдлокодинга
2086 / 520 / 68
Регистрация: 04.11.2010
Сообщений: 1,293
20.02.2014, 06:56 4
http://g.zeos.in/?q=avr%20%D1%... 0%B5%D1%80
0
1 / 1 / 0
Регистрация: 18.02.2014
Сообщений: 29
21.02.2014, 05:29  [ТС] 5
Как запустить два таймера? Они должны работать с разной скоростью, но не работают

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
31
32
33
34
#define F_CPU 8000000UL 
#include <avr/io.h> 
#include <avr/interrupt.h>
 
void timera_init(void) {
    TCCR1B |= (1 << WGM12); 
    TIMSK |= (1 << OCIE1A);
    OCR1AH = 0b00000000; 
    OCR1AL = 0b10000000;
    TCCR1B |= (1 << CS10); 
}
 
void timerb_init(void) {
    TCCR1B |= (1 << WGM12); 
    TIMSK |= (1 << OCIE1B); 
    OCR1A=0x186a; 
    TCCR1B |= (1<<CS11) | (1<<CS10); 
}
 
ISR(TIMER1_COMPB_vect) {
  // ....
}   
 
ISR(TIMER1_COMPA_vect) {
  // ....
}
 
 
int main(void) {
    Port_init();
    timera_init();
    timerb_init();
    sei();
}
0
966 / 593 / 97
Регистрация: 15.05.2012
Сообщений: 3,503
21.02.2014, 08:49 6
Пропишите комментарии, чтобы уловить вашу мысль.
0
1917 / 1233 / 123
Регистрация: 04.01.2010
Сообщений: 4,418
21.02.2014, 12:07 7
Fanrin, а чего вы мучаете одни и те же регистры управления OCR1 и TCCR1 в обоих случаях настройки таймеров? Для каждого таймера они свои. Для таймера TIM0 - это OCR0 и TCCR0... А в случае TIMSK - он общий, так что с ним все правильно
0
1 / 1 / 0
Регистрация: 18.02.2014
Сообщений: 29
21.02.2014, 17:54  [ТС] 8
А как тогда создать 2 независимых таймера?
0
Эксперт быдлокодинга
2086 / 520 / 68
Регистрация: 04.11.2010
Сообщений: 1,293
21.02.2014, 18:03 9
Цитата Сообщение от Fanrin Посмотреть сообщение
А как тогда создать 2 независимых таймера?
Создать никак. Таймеры там уже есть аппаратно. Их как правило несколько. Восьми битные и шестнадцати. Плюс предделители, плюс внешнее тактирование. Впрочем инфы полно, в том числе на русском, в том числе датишей. Из скрытых засад - предделители. На некоторых таймерах они общие (один на двоих). При сбросе таймера не забывать про сброс предделителя, дабы интервал не плавал.
0
1 / 1 / 0
Регистрация: 18.02.2014
Сообщений: 29
26.02.2014, 11:25  [ТС] 10
Я имел ввиду какие регистры юзать для 2 таймера? Инфы так и не нашел
0
Эксперт быдлокодинга
2086 / 520 / 68
Регистрация: 04.11.2010
Сообщений: 1,293
26.02.2014, 11:37 11
Цитата Сообщение от Fanrin Посмотреть сообщение
Инфы так и не нашел
Да ну?!
Микроконтроллеры AVR семейства Classic фирмы ATMEL А.В.Евстифеев 2006-R.pdf
0
Эксперт быдлокодинга
2086 / 520 / 68
Регистрация: 04.11.2010
Сообщений: 1,293
26.02.2014, 11:49 12
На меги и тиньки тут возьми, полный датиш на русском
Как раздельно сделать инкремент в полутора байтах двухбайтного числа?
0
1917 / 1233 / 123
Регистрация: 04.01.2010
Сообщений: 4,418
27.02.2014, 12:42 13
Fanrin, я ж вроде написал... см.пост №7.
0
0 / 0 / 2
Регистрация: 09.10.2013
Сообщений: 7
28.02.2014, 01:29 14
Лучший ответ Сообщение было отмечено Fanrin как решение

Решение

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
31
32
33
34
35
36
37
38
39
40
41
42
#define BIT(B)                  (1<<B)// преобр. номера бита в позицию в байте
#define SETBIT(ADDRESS,B)       (ADDRESS |= BIT(B))// установка бита
 
#if defined (__AVR_ATmega16__)
    #define F_CPU           32768       //частота микропроцессора
#elif defined (__AVR_ATmega2560__)
    #define F_CPU           8000000     //частота микропроцессора
#endif
 
#include <avr/io.h>
#include <avr/interrupt.h>
 
#define TCNT_TIME 0x0020+1
 
ISR(TIMER1_OVF_vect)
{
#if defined (__AVR_ATmega16__)
    TCNT1 = 0xFFFF - TCNT_TIME;
#elif defined (__AVR_ATmega2560__)
    TCNT1 = 32768 + 1518; //выставляем начальное значение TCNT1
#endif
    PORTC ^= BIT(PORTC0);
}
 
int main()
{
    SETBIT(DDRC,PORTC0);
 
#if defined (__AVR_ATmega16__)
    TCCR1B = (1<<CS12)|(1<<CS10);               // настраиваем делитель
    TIMSK |= (1<<TOIE1);                    // разрешаем прерывание по переполнению таймера
    TCNT1 = 0xFFFF - TCNT_TIME;
#elif defined (__AVR_ATmega2560__)
    TCCR1B = /*(1<<CS12)|*/(1<<CS11)|(1<<CS10);         // настраиваем делитель
    TIMSK1 |= (1<<TOIE1);                   // разрешаем прерывание по переполнению таймера
    TCNT1 = 32768 + 1518;                       // выставляем начальное значение TCNT1
#endif
    sei();                                  // выставляем бит общего разрешения прерываний
    while(1);
    return 0;
}
//---------------------------------------------------------
В готовом устройстве делал так, может поможет.
0
11 / 11 / 0
Регистрация: 04.04.2014
Сообщений: 140
05.08.2014, 10:13 15
Цитата Сообщение от Fanrin Посмотреть сообщение
какие регистры юзать
В даташите есть глава "Таймеры-счетчики" в ней подраздел "Описание регистров" там все должно быть написано. Подозреваю что регистры следующие:TCCRnB, OCRnAH, OCRnAL ,TCCRnB , где "n" номер таймера-счетчика, возможно 0 или 1
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
05.08.2014, 10:13

Помощь в написании контрольных, курсовых и дипломных работ здесь.

Компьютер перезагружается каждую секунду.
Здравствуйте! Великие Гуру, помогите советом! Такая ситуация: есть древний комп: мать Gigabyte (хз...

Действие через каждую секунду
Подскажите, пожалуйста, как выводить document.log(&quot;Прошла секунда&quot;); через каждую секунду?...

Смена цвета каждую секунду
Как сделать переливание цвета, чтобы он каждую секунду менялся ? import pygame import sys ...

Завершение процесса каждую секунду
Программа должна каждую секунду отключать NOTEPAD, но она почему-то не работает. Скажите где...


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

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.