Форум программистов, компьютерный форум, киберфорум
Электроника для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.65/63: Рейтинг темы: голосов - 63, средняя оценка - 4.65
SoutKiipir

mega8 - таймер управления нагрузкой(нид хелп)

18.04.2010, 16:08. Показов 11659. Ответов 17
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброго времени суток, Уважаемые форумчане

начал свой первый проект на авр. (прошу сильно не пинать за ламерство :) )
суть девайся в том что есть некоторая нагрузка, которую нужно включать на определенное время (допустим 15 мин). я её включаю с помощью твердотельного реле. этим реле управляет МК, фоном он должен на 4 7-seg(естественно в динамике) индикатора выводить так сказать "обратный отсчет" времени таймера. в девайсе есть 3 кнопки: старт\стоп, плюс, минус. старт - начинает отсчет, +\- - увеличивают\уменьшают значение таймера до запуска с дискретностью 5 сек при однократном нажатии, и хотелось бы "быструю перемотку" реализовать при удержании клавиши.
девайс должен запоминать последнее установленное время и при включении выводить его (ну это понятно что с помошью EEPROM). опрос клавиатуры и вывод на индикацию я планирую по переполнению таймера[timer0_OVF] (5 мс время переполнения). собсно всё... теперь начинаются вопросы

как связать таймер(не тот который timer0) с реальным временем? т.е. как организовать сами "часы?". и как организовать вывод на индикацию? покурил литературу, там в основном всё описано через подпрограмму задержки, а мне нужно по переполнению таймера. там же получается при каждом переполнении должен браться следующий индикатор. вот как осуществить этот "следующий" не понятно. (сегменты висят на пинах не попорядку lsl непрокатит).

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

пс пишу на асме.
ппс в железе девайс уже готов, печатку если надо выложу, кусок кода уже написан, но там ничего толком и нету... на всяк случ выкладываю, мож чем поможет

[5.23 Кб]
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
18.04.2010, 16:08
Ответы с готовыми решениями:

PinBoard II R2, LCD и mikroPascal – ай нид хелп
Взял стандартный пример от mykroPascal 6.0.1. Оттуда же – схему коммутации. Но вот что-то «крокодил не ловится, не растет кокос». На...

Нид хелп!
Доброго времени суток! Знаю что уже обсуждалось, но все же. Есть база, есть документ, пользователь не ридер и соответственно не может...

Ай нид хелп
Значится есть сайтик SportForMen.com На сайте есть ссылки вида http://www.sportformen.com/post/index.php?topic=80 тоесть где только...

17
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
Цитата Сообщение от SoutKiipir
2 вопроса: зачем сохранять SREG и регистры?
сохрянять в стек командой push?
Да, на входе в прерывание сохраняй командой push , а на выходе в обраnном порядке извлекай из стека командой pop.

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
Цитата Сообщение от SoutKiipir
( да я знаю что я лошара)) ))
Ты достаточно самокритичен!)))) Тебе проще сделать так, чтобы понятнее было. Выдели под свои 4 разряда не 2 байта, а четыре. Напиши простенькую программку, которая при каждом 200 твоем прерывании добавляет единичку в младший разряд (секундный). Тут же проверяй его содержание, если равен 60 то добавляй единицу в следующий разряд (десятки секунд), а этот обнуляешь, также и с последующими. Ну в часовом, естественно, надо ловить верхние 24 часа, а не 60. Это примитивный, конечно , алгоритм, но для новичка более просто и понятно. Можно обойтись и двумя байтами, но там усложнять надо процедуру пересчета. Для уже "умных" - смешно, а начинающему не так просто разобраться со всеми этими преобразованиями. А так тебе не надо будет даже преобразовывать ничего.
0
0 / 0 / 0
Регистрация: 06.04.2010
Сообщений: 1,088
18.04.2010, 20:15
Цитата Сообщение от R_uro
Цитата Сообщение от SoutKiipir
если равен 60 то добавляй единицу в следующий разряд (десятки секунд), а этот обнуляешь, также и с последующими .
Прошу прощения, ошибся. Не 60, а 10 надо контролировать, как верхний предел - один разряд может индицировать только до 9 .. Ну и с часовыми тоже самое. Хотя получается уже не 4 байта, а 6 = дес.часов, единицы часов, десятки минут, единицы минут, десятки секунд, единицы секунд. Ну суть, думаю, понятна. Не нужны секунды - выкини нижние два разряда..
0
0 / 0 / 0
Регистрация: 23.01.2010
Сообщений: 204
18.04.2010, 20:19
"...(нид хелп)"
а что, на РУССКОМ языке попросить помощи НИКАК?
0
SoutKiipir
18.04.2010, 20:58
Цитата Сообщение от oohz
"...(нид хелп)"
а что, на РУССКОМ языке попросить помощи НИКАК?
да нет, почему же никак.. суть то ясна, какая разница какой язык?

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
Цитата Сообщение от SoutKiipir
попробовал наколупать часы...выкладываю листинх :) поругайте\подскажите что не так, заранее спасибо

пс. они пока что никуда не выводятся, просто должны тикать поидее... еще не дебагил, только написал (аврстудии на работе нету)
time:
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
Цитата Сообщение от SoutKiipir
попробовал наколупать часы...выкладываю листинх :) поругайте\подскажите что не так, заранее спасибо

пс. они пока что никуда не выводятся, просто должны тикать поидее... еще не дебагил, только написал (аврстудии на работе нету)
Не по сути работы ( быстро не разберусь) - почему бы тебе в списке прерываний сразу не расставить reti, вместо rjmp ? Зачем тебе лишние переходы указывать? Программа же растет. А для обращения с портами, "укради" у Хальта его макрос OUTI - очень удобно и наглядно с ним.
0
SoutKiipir
19.04.2010, 16:29
Не по сути работы ( быстро не разберусь) - почему бы тебе в списке прерываний сразу не расставить reti, вместо rjmp ? Зачем тебе лишние переходы указывать? Программа же растет. А для обращения с портами, "укради" у Хальта его макрос OUTI - очень удобно и наглядно с ним.
я так сделал потому что мне пока так "нагляднее" сразу видно что "есть в наличае" и что используется. так было в обучалке у радиокота :) как допишу, отлажу прошивку - уберу всё это

насчет макроса: да, так проще но я пока что хочу научиться правильно кодить..., т.е. применять соответствующие мнемоники, макрос всегда успею включить... тем более я не совсем с ним разобрался.

что значит символ "@" в коде?
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
Цитата Сообщение от SoutKiipir
я так сделал потому что мне пока так "нагляднее" сразу видно что "есть в наличае" и что используется. так было в обучалке у радиокота :) как допишу, отлажу прошивку - уберу всё это

что значит символ "@" в коде?
По-моему нагляднее так как во вложенном файле. Сразу видно что за прерывание, есть ли оно и занимает меньше памяти. Файл копируется и подключается к нужному проекту.

например.ymstude <m8def.yms>
...
.cseg
.ymstude "vectorsM8.asm"

RESIT:
...

Символ @ в макросе обозначает обращение к параметру, который передается макросу. Параметров может быть 10 - от @0 до @9. Нумеруются они по-порядку.
Code
1
2
3
4
5
6
7
8
.macro outi
ldi   temp,@1
out   @0,temp
.endmacro
 
...
outi SREG,0xAA ; SREG идет первым, он будет @0, 0xAA - идет вторым, оно будет @1
...
[1.17 Кб]
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
19.04.2010, 17:30
Помогаю со студенческими работами здесь

Нид Хелп
Кароче у меня получилось Будапешт и 69 год ответы ,но я не могу ответить на последний вопрос . Гуглил и не нашел ответ . Возможно в самом...

задачка на Си, ай нид хелп
черт, у меня ниче не получается(( помогите плиз написать эту прогу(( вот задание: проводится опрос, каждый должен заполнить анкету,...

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

Notesuiview и свойство Documents НИД ХЕЛП!
Всем здрасти!!! Сразу скажу в поиске был, но нечто подобное не нашёл... Есть абсолютно обычная вьюха... есть Action... - его задача...

Модуль управления индуктивной нагрузкой
Собственно хочется сделать бюджетный контроллер для управлением индуктивной наргузкой (асинхронный двигатель). Основа - AVRка. Вариант...


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

Или воспользуйтесь поиском по форуму:
18
Ответ Создать тему
Новые блоги и статьи
Новый ноутбук
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
— Расскажи мне о Мире, бродяга, Ты же видел моря и метели. Как сменялись короны и стяги, Как эпохи стрелою летели. - Этот мир — это крылья и горы, Снег и пламя, любовь и тревоги, И бескрайние. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru