|
SoutKiipir
|
|
mega8 - таймер управления нагрузкой(нид хелп)18.04.2010, 16:08. Показов 11659. Ответов 17
Метки нет (Все метки)
Доброго времени суток, Уважаемые форумчане
начал свой первый проект на авр. (прошу сильно не пинать за ламерство :) ) суть девайся в том что есть некоторая нагрузка, которую нужно включать на определенное время (допустим 15 мин). я её включаю с помощью твердотельного реле. этим реле управляет МК, фоном он должен на 4 7-seg(естественно в динамике) индикатора выводить так сказать "обратный отсчет" времени таймера. в девайсе есть 3 кнопки: старт\стоп, плюс, минус. старт - начинает отсчет, +\- - увеличивают\уменьшают значение таймера до запуска с дискретностью 5 сек при однократном нажатии, и хотелось бы "быструю перемотку" реализовать при удержании клавиши. девайс должен запоминать последнее установленное время и при включении выводить его (ну это понятно что с помошью EEPROM). опрос клавиатуры и вывод на индикацию я планирую по переполнению таймера[timer0_OVF] (5 мс время переполнения). собсно всё... теперь начинаются вопросы как связать таймер(не тот который timer0) с реальным временем? т.е. как организовать сами "часы?". и как организовать вывод на индикацию? покурил литературу, там в основном всё описано через подпрограмму задержки, а мне нужно по переполнению таймера. там же получается при каждом переполнении должен браться следующий индикатор. вот как осуществить этот "следующий" не понятно. (сегменты висят на пинах не попорядку lsl непрокатит). надеюсь на помошь в алгоритмическом понимании работы сей приблуды. заранее всем спасибо пс пишу на асме. ппс в железе девайс уже готов, печатку если надо выложу, кусок кода уже написан, но там ничего толком и нету... на всяк случ выкладываю, мож чем поможет [5.23 Кб] |
|
| 18.04.2010, 16:08 | |
|
Ответы с готовыми решениями:
17
PinBoard II R2, LCD и mikroPascal – ай нид хелп Нид хелп! Ай нид хелп |
|
0 / 0 / 0
Регистрация: 30.01.2010
Сообщений: 641
|
|
| 18.04.2010, 16:28 | |
|
Ну, часы организовать можно на таймере 2 (повесив на xtal часовой кварц, а МК запустив от внутреннего генератора), если МК уже тактуется от кварца- организовать программный таймер на том же т0 (прерывание раз в 5мс- за секунду их будет 200- просто считаем, когда счетчик (любой регистр) дойдет до 200- у нас тик). Второй метод в долгосрочной перспективе недолговечен, отсчет времени будет неточный, но для таймера на небольшие выдержки сгодится.
Динамическая индикация. Тут хорошо бы, если все линии "восьмерки" (которые a,b,c,d,e,f,h) сидели на одном порту, проще будет выводить (всё равно, в каком порядке, дешифрация в семисегментный код программная- что хочу, то будет). Заводим в оперативке 4 ячейки, по прерыванию таймера гасим индикатор (устанавливая (или сбрасывая- зависит, общий катод или анод у индикатора) выводы "столбцов"- могут быть на любых пинах, тут всё равно, куда цеплять), берем из памяти значение цифры А, перекодируем в семисегментный код, выводим в порт, зажигаем циферку А (соотв. вывод "столбца"). По следующему прерыванию то же с цифрой Б, итд. В листинге через виртуальный порт- тоже работать будет. Не совсем понятно управление реле- не проще ли SBI/CBI PORTC,1 (1- пин, на котором висит реле)?
0
|
|
|
SoutKiipir
|
|
| 18.04.2010, 17:00 | |
|
спасбо что откликнулись!
мк уже тактируется от внешнего кварца...остается второй метод. так. если я правльно понимаю нужен регистр который будет содержать время таймера. т.е. мне грубо говоря мои 10 минут нужно перевести в секунды и убавлять по одной каждые 200 переполнений? по индикации: индикаторы с ОА. как мне сделать так чтобы каждое прерываение обрабатывало следующий индикатор? т.е опять же нужен регистр счетчик прерываний или как? т.е. если у нас первое прерывание - зажигаем первый, второе - второй. да.. так будет проще, спасибо, просто писалось всё это уже под утро) к тому же пока слабо владею всем списком мнемоник... |
|
|
0 / 0 / 0
Регистрация: 06.04.2010
Сообщений: 1,088
|
|
| 18.04.2010, 17:05 | |
|
Заведи регистр для индикации, в каждом прерывании сдвигай в нем единицу. В основном цикле в соответствии с тем, на каком месте единица - выводишь на соответствующий индикатор. Если сдвинулся за пределы кол-ва индикаторов - обнулил и снова то же.
0
|
|
|
0 / 0 / 0
Регистрация: 30.01.2010
Сообщений: 641
|
|
| 18.04.2010, 17:43 | |
|
Можно регистр- счетчик прерываний, можно взять регистр и сдвигать в нем единицу- суть одна. Обрабатывать это можно и в прерывании, тут не слишком длинный обработчик получится, но для этого нужно хранить в оперативке уже переведенные в семисегментный код циферки, чтоб не тратить время в прерывании.
Щелкает прерывание- сохраняем SREG, регистры, смотрим регистр, выводим в виртуальный порт байт из соотв. ячейки в оперативке, зажигаем нужный разряд, попутно тикаем счетчиком времени и RETI. Регистры и SREG на место положить не забываем. В основном цикле будем смотреть на счетчик времени (дотикал до 200- обнулить, соответственно прибавить/убавить время, разложить 16 бит на минуты и секунды (десятки и единицы отдельно), перевести в семисегментный код, сунуть в оперативку, дальше забота прерывания), опрашивать клавиатуру, управлять реле.
0
|
|
|
SoutKiipir
|
|
| 18.04.2010, 18:06 | |
|
2 вопроса: зачем сохранять SREG и регистры?
сохрянять в стек командой push? |
|
|
0 / 0 / 0
Регистрация: 06.04.2010
Сообщений: 1,088
|
||
| 18.04.2010, 18:14 | ||
in r7,sreg push r7 ...... ...... pop r7 out sreg,r7 reti если не сохранишь, то получишь х.з. что. Т.к. на выходе у тебя будет совсем другое состояние, чем на входе - в прерывании изменится, а надо вернуться в точку входа в прерывание с тем же состоянием SREG. И обычные регистры надо сохранять, если ты их в прерывании используешь..
0
|
||
|
SoutKiipir
|
|
| 18.04.2010, 19:56 | |
|
спасибо, с этим вроде разобрался. "разложить 16 бит на минуты и секунды (десятки и единицы отдельно)" теперь вот это как понять? :) ( да я знаю что я лошара)) ) получается по пол байта на разряд? (4 бита-десятки минут, 4бита- десятки секунд, 4бита - единицы минут, 4 бита- единицы секунд) или по байту (десятки секунд и минут вместе итд)
|
|
|
0 / 0 / 0
Регистрация: 06.04.2010
Сообщений: 1,088
|
||
| 18.04.2010, 20:08 | ||
0
|
||
|
0 / 0 / 0
Регистрация: 06.04.2010
Сообщений: 1,088
|
||
| 18.04.2010, 20:15 | ||
0
|
||
|
0 / 0 / 0
Регистрация: 23.01.2010
Сообщений: 204
|
|
| 18.04.2010, 20:19 | |
|
"...(нид хелп)"
а что, на РУССКОМ языке попросить помощи НИКАК?
0
|
|
|
SoutKiipir
|
||
| 18.04.2010, 20:58 | ||
p.s. в правилах форума есть такое ограничение по поводу языка? я не увидел.. |
||
|
SoutKiipir
|
|
| 19.04.2010, 12:33 | |
|
попробовал наколупать часы...выкладываю листинх :) поругайте\подскажите что не так, заранее спасибо
пс. они пока что никуда не выводятся, просто должны тикать поидее... еще не дебагил, только написал (аврстудии на работе нету) спасибо за замечания, листинг исправлен. новая версия. темп1 - единицы секунд темп2 - десятки секунд темп3 - единицы минут темп4 - десятки минут [6.34 Кб] |
|
|
0 / 0 / 0
Регистрация: 24.01.2010
Сообщений: 727
|
||
| 19.04.2010, 13:40 | ||
ldi OVF_count, 0 ; risit interrupts counter ldi temp1, r1 cpi temp1, 0 brmi time1 dec temp1 cpi temp1, 0 brmi time1 mov LEDS, r1 rcall decoder sts digit, tids ret time1: ldi r1, 9 ... 1. ldi - загрузка в регистры r16..r31 константы. Так ее использовать нельзя 2. ret используется для возврата из подпрограмм, вызванных call. Ты просто прыгнул на метку time, по-этому назад тоже должен просто прыгнуть 3. читай п.1
0
|
||
|
0 / 0 / 0
Регистрация: 06.04.2010
Сообщений: 1,088
|
||
| 19.04.2010, 13:45 | ||
0
|
||
|
SoutKiipir
|
||
| 19.04.2010, 16:29 | ||
насчет макроса: да, так проще но я пока что хочу научиться правильно кодить..., т.е. применять соответствующие мнемоники, макрос всегда успею включить... тем более я не совсем с ним разобрался. что значит символ "@" в коде? |
||
|
0 / 0 / 0
Регистрация: 06.04.2010
Сообщений: 1,088
|
|
| 19.04.2010, 16:46 | |
|
что значит символ "@" в коде?[/quote]
Вот тебе примеры, чтобы меньше писанины было: .macro LddZ ; lddZ 10000 загрузить в регистр Z число 10000 ldi zl,low(@0) ldi zh,high(@0) .endmacro .macro LddY ; lddY 10000 ldi yl,low(@0) ldi yh,high(@0) .endmacro .macro LddX ; lddX 10000 ldi xL,low(@0) ldi xh,high(@0) .endmacro В итоге так и пишешь: lddz 10000 ; в регистр Z загрузится число 10000 lddx 10000 lddy 10000 .macro OUTI ;OUTI UCSRC, (1<<URSEL)|(1<<UCSZ0) ldi tmp, @1 out @0, tmp .endmacro На последнем макросе - - вместо @0 в макросе подставится, то что после названия макроса идет первым, в данном случае - регистр UCSRC, вместо @1 -то, что после запятой, в данном случае - (1<<URSEL)|(1<<UCSZ0). Может быть и @2,@3,@4,@5 если они в макросе используются. Не знаю сколько может быть передаваемых в макрос параметров максимально, у меня больше пяти нет. Т.е. твою инициализацию порта В с макросом запишем так OUTI DDRb, 0b00011111 ;port B set всего одна строчка Только макросы надо объявить до основной программы, или отдельный файл включить, в котором они прописаны.
0
|
|
|
0 / 0 / 0
Регистрация: 24.01.2010
Сообщений: 727
|
|||||||
| 19.04.2010, 17:30 | |||||||
например.ymstude <m8def.yms> ... .cseg .ymstude "vectorsM8.asm" RESIT: ... Символ @ в макросе обозначает обращение к параметру, который передается макросу. Параметров может быть 10 - от @0 до @9. Нумеруются они по-порядку.
0
|
|||||||
| 19.04.2010, 17:30 | |
|
Помогаю со студенческими работами здесь
18
Нид Хелп задачка на Си, ай нид хелп Ай нид хелп....чайник . Notesuiview и свойство Documents НИД ХЕЛП! Модуль управления индуктивной нагрузкой Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
||||
|
Новый ноутбук
volvo 07.12.2025
Всем привет.
По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне:
Ryzen 5 7533HS
64 Gb DDR5
1Tb NVMe
16" Full HD Display
Win11 Pro
|
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
|
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
|
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов
На странице:
https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/
нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
|
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов.
. . .
|
|
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
|
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
|
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут.
В век Веб все очень привыкли к дизайну Single-Page-Application .
Быстренько разберем подход "на фреймах".
Мы делаем одну. . .
|
Фото: Daniel Greenwood
kumehtar 13.11.2025
|
Расскажи мне о Мире, бродяга
kumehtar 12.11.2025
— Расскажи мне о Мире, бродяга,
Ты же видел моря и метели.
Как сменялись короны и стяги,
Как эпохи стрелою летели.
- Этот мир — это крылья и горы,
Снег и пламя, любовь и тревоги,
И бескрайние. . .
|