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

ATmega128. Отсчет длительного интервала времени

25.11.2012, 13:40. Показов 2577. Ответов 4
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Добрый вечер форумчане,

Обращаюсь к Вам с просьбой помочь мне в одном задании, необходимо запрограммировать 8-разрядный МК семейства ATMEL ATmega, точнее ATmega128.
Суть задания такова:
С помощью Таймера 0 выполнить отсчёт длительного интервала времени (например 3 секунды). Отсчёт начать в момент отпускания кнопки "3" в конце мигнуть (100мс) светодиодом.

Так как таймер 0 за одно полное переполнение в режиме 1024 может дать мне только 0.0326 мс ожидания, необходимо совершать переполнения 93 раза, что и будет равно 3 секундам. Надо записывать это в отдельный регистр и ждать пока он не станет равным 0 (как я понял по объяснению), а после уже мигнуть. Как то так:
1. Опрос кнопки
2. Таймер
3. Ждем R20, 0
4. Мигнуть

Вот что мне удалось навоять, гляньте пожалуйста опытным глазом, дайте совет или направьте на путь истинный в реализации.

Assembler
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
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
.device ATmega128
.include    "m128def.inc"
;=============================================================
;Определения регистров и битов
;=============================================================
.def    temp = R16
.org    $70
.org    0x0020
rjmp    TM0_ovf
Start:
;=============================================================  
;Инициализация стека
;=============================================================
    ldi temp,High(RAMEND)
    out SPH,temp        ;устанавливаем указатель стека       
    ldi temp,Low(RAMEND)    ;на конечный адрес ОЗУ контроллера
    out SPL,temp
 
    cbi PORTD, 0
;=============================================================
;Кнопка
;=============================================================
butt:
    sbic PIND, 6
    rjmp TM0_ovf
    rjmp butt   
;=============================================================
;Настройка Таймера 0
;=============================================================
    ldi temp, 163
    out tcnt0,temp      ;устанавливает Таймер 0 значение 163
    ldi temp, $07
    out tccr0,temp      ;Таймер 0 включить на 1024
;=============================================================
;Разрешение прерывания по переполнению Таймера 0
;=============================================================
    ldi     temp, $01
    out     timsk,temp  ;Разрешение прерывания по совпадению Таймера 0
 
    sei
;=============================================================
;Ждем R20 пока не станет 0
;=============================================================
TM0_ovf:
    ldi r20, 163
M1: in r16, tcnt0
    cpi r16, 0
    breq M1
 
    dec r20
    brne M1
 
    clr r16
    out tccr0, r16
;=============================================================
;мигнуть
;=============================================================
diod:
    sbi DDRE, 7
    sbi PORTE, 7
    nop
    cbi PORTE, 7
 
    reti
За ранее, спасибо.
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
25.11.2012, 13:40
Ответы с готовыми решениями:

Определение времени работы кода для ATmega128
Здравствуйте. Подскажите как можно узнать время работы кода для контроллера ATmega128 за 1 цикл....

Отсчет временного интервала
На прокатном стане объект попадает под первый фотодатчик и начинается отсчет времени, а когда он...

Вывести на label обратный отсчёт времени до определенной даты и времени
Здравствуйте, необходимо вывести на lable обратный отсчёт от текущий даты до 05.09.2020 01:01,...

Соединения с mysql на протяжении длительного времени
Как установить для соединения с mysql autoReconnect?

4
97 / 92 / 0
Регистрация: 24.04.2010
Сообщений: 275
25.11.2012, 19:30 2
Затактировать от частоты 32768 Гц, счетчик тмро0 и прескалер на 64, получаем переполнение через 256*64=16384 такта, это 0.5 секунд c высокой точностью, зависит от кварца.
Шесть отсчетов переполнения и получаем 3 секунды.
Нужно на асме?

Добавлено через 32 минуты
на асме под авр не силен, на си могу подсказать.
0
Модератор
Эксперт по электронике
8908 / 6677 / 918
Регистрация: 14.02.2011
Сообщений: 23,521
25.11.2012, 19:36 3
Цитата Сообщение от MrRom4ke Посмотреть сообщение
Так как таймер 0 за одно полное переполнение в режиме 1024 может дать мне только 0.0326 мс ожидания,
почему нельзя взять 16 битный таймер(timer1) ?

Добавлено через 2 минуты
и что то не увидел я у тебя процедуры прерывания таймера 0
0
MrRom4ke
26.11.2012, 00:26 4
Цитата Сообщение от russo turisto Посмотреть сообщение
Нужно на асме
Да нужно в AVR Studio на asm'е

Цитата Сообщение от ValeryS Посмотреть сообщение
почему нельзя взять 16 битный таймер(timer1) ?
По заданию надо использовать таймер 0

Цитата Сообщение от ValeryS Посмотреть сообщение
и что то не увидел я у тебя процедуры прерывания таймера 0
код так, легко сказать, "сырой" Поэтому и прошу помощи, чего добавить и как.
97 / 92 / 0
Регистрация: 24.04.2010
Сообщений: 275
27.11.2012, 13:34 5
В книге Ревича есть пример для таймера затактированого от 4 мгц на асме.
https://www.cyberforum.ru/elec... 26610.html
1
27.11.2012, 13:34
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
27.11.2012, 13:34
Помогаю со студенческими работами здесь

Могут ли в течении длительного времени излучать свет два сцепленных атома?
Могут ли в течении длительного времени одновременно излучать свет два сцепленных атома? Будут ли...

Отсчет времени
Сор, пишу не в той теме, просто не знаю в какой написать. Как происходит программный счет времени в...

Отсчет времени
есть временной диапазон (пример) от 25-MAY-12 11.35.02.000000000 PM до 27-JUN-12...

Отсчет времени
Доброго времени суток. Задался вопросом, как сделать чтобы приложение отсчитывало время от...

Отсчет времени
Здравствуйте. Возможно ли отсчитывать время в c++(в сек или 1/1000 сек), например при ожидании...

Отсчет времени
Собственно, нужно реализовать отсчет времени, сколько работает программа и вывести в лэйбл, как это...


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

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