Статистика
Время:
Зарегистрированных: 80295
Последним зарегистрирован: DiaGo
Рекорд посещаемости: 12585
Групп пользователей: 4
 Группы:
[Admin] [Cоучастник] [Автор] [Модератор]
 Сейчас на сайте
 Всего: 90
 Гостей: 79
 Анонимных: 0
 Пользователей: 11
 Зарегистрированные:
romanetz Vikkttor03 Igorik277 Лёва Задов anton77 AlexZimin vvb29 EASY Yulawin syb1 willie_g
Страницы: (163) 1 2 3 [4] 5 6 7 8 9 10 11 12 13 14 ... Последняя » ( Перейти к первому непрочитанному сообщению ) Ответить Новая тема Новый опрос

> Algorithm Builder for AVR, Начинаем
pauk
Сообщение: # 57142   Oct 26 2006, 06:21 PM
Quote Post


Unregistered










возник очередной вопрос
Необходимо сделать потребление микроконтроллера минимальным в ответе за это регистр MCUCR
однако не пойму как это всё работает , при выполнении основной программы я включаю режим power down командой $0a-mcucr или 10100000-mcucr короче говоря посылаю нужное число в нужный регистр . ИТАК когда сработает прерывание настроное на ногу порта д2 тоесть на ноге порта д2 появится 0 должна сработать подпрограмма прерывания и контроллер должен выйти из пониженого режима? если да то после обработки прерывания он автоматически войдет в режим пониженого эл потребления или надо писать какие то команды?????
Top
avr123
Сообщение: # 57152   Oct 26 2006, 07:41 PM
Quote Post


Соучастник
****

Группа: Cоучастник
Сообщений: 905
Пользователь №: 8980
Регистрация: 11-June 06
Место жительства: Москва



надо усыплять.
PMEmail PosterUsers Website
Top
david
Сообщение: # 57157   Oct 26 2006, 07:48 PM
Quote Post


Unregistered










Как бешенных животных!!! chair000.gif
Top
Plant
Сообщение: # 57171   Oct 26 2006, 08:34 PM
Quote Post


Фанат
******

Группа: Автор
Сообщений: 2135
Пользователь №: 21
Регистрация: 25-February 05
Место жительства: Крым, Феодосия



QUOTE (pauk @ Oct 26 2006, 07:41 PM)
если да то после обработки прерывания он автоматически войдет в режим пониженого эл потребления или надо писать какие то команды?????

После выполнения обработчика прерывания процессор начнет выполнять команду , стоящую за СЛИПом . Поэтому если тебенадо чтоб после обработки прерывания проц опять уснул , команда после слипа должна опять отправлять на слип
Пример
.......
.......
sleeping:
sleep
rjmp sleeping


--------------------
"Вы думаете, всё так просто? Да, всё просто. Но совсем не так". Альберт Эйнштейн
PMEmail PosterICQ
Top
pauk
Сообщение: # 57201   Oct 26 2006, 11:53 PM
Quote Post


Unregistered










опять вопрос smile.gif
какие числа находятся в регистрах ЕПРОМА при первоначальном включении питания контроллера
симулятор в (АВ) показывает 255 так ли это? И можно ли сбросить как нибудь регистры ЕПРОМа ? если да то как? unsure.gif
Top
avr123
Сообщение: # 57203   Oct 27 2006, 12:38 AM
Quote Post


Соучастник
****

Группа: Cоучастник
Сообщений: 905
Пользователь №: 8980
Регистрация: 11-June 06
Место жительства: Москва



255 это обычное значение получающееся при изготовлении ЕЕПРОМ. т.е. у нового МК такими числами забыты и епром и память програм.
PMEmail PosterUsers Website
Top
Plant
Сообщение: # 57224   Oct 27 2006, 09:12 AM
Quote Post


Фанат
******

Группа: Автор
Сообщений: 2135
Пользователь №: 21
Регистрация: 25-February 05
Место жительства: Крым, Феодосия



Иными словами в ячейках ЕЕПРОМа записаны FF . Если надо сбросить , то вКАЖДУЮ ячейку надо прописать 0 . Токо зачем это тебе ?


--------------------
"Вы думаете, всё так просто? Да, всё просто. Но совсем не так". Альберт Эйнштейн
PMEmail PosterICQ
Top
pauk
Сообщение: # 60120   Nov 20 2006, 11:27 PM
Quote Post


Unregistered










всем привет drinks_cheers.gif
обещал КАТЯРА дали и пропал ...
minzdrav.gif
Хотелось -бы поднять тему АЦП так-как тема на мой взгляд очень нужная и весьма сложная ., написал сам кое-какие проги ,но хочется посмотреть на чужие ЕСТЕСТВЕННО которые написаны на АВ..............( особенно интересно переключение АЦП 1_7.gif
Top
avr123
Сообщение: # 60161   Nov 21 2006, 12:57 PM
Quote Post


Соучастник
****

Группа: Cоучастник
Сообщений: 905
Пользователь №: 8980
Регистрация: 11-June 06
Место жительства: Москва



А вы псевдокодом (русским текстом) опишите то что вам нужно сделать. А потом на любом языке нетруно будет записать.
PMEmail PosterUsers Website
Top
Kotjara
Сообщение: # 60278   Nov 22 2006, 01:27 AM
Quote Post


Unregistered










Наконец-то появилось немного свободного времени, так что продолжим..


Напишем программу, которая будет выводить число от 0 до 999(при желании
количество разрядов можно увеличить) на светодиодный-семисигментный
индикатор по прерыванию от таймера.

Немного теории.

Перед выводом числа на индикатор его нужно преобразовать.
Будем преобразовывать из двоичного числа в двоично-десятичное, т.е.
число 0 равно 0000,
1 = 0001,
2 = 0010,
3 = 0011,
4 = 0100,
5 = 0101,
6 = 0110,
7 = 0111,
8 = 1000,
9 = 1001.

Алгоритм преобразования такой:
Сначала сравниваем - наше число больше ста или меньше, если больше вычитаем из него 100 и
опять сравниваем, и так пока оно не окажется меньше 100. Считаем сколько было
вычитаний, значит столько у нас и сотен. С оставшимся числом ,после вычитаний сотен,
проделываем тоже самое, только вычитаем десятки, а то что останется это - единицы.
Например число 567:
Оно больше 100, значит вычитаем 100, получаем 467. Опять больше 100, опять вычитаем 100.
Всего сотня отнимется 5 раз - значит у нас пять сотен, запомнили это число.
Остается 67, десять у нас отнимется 6 раз - значит у нас шесть десятков.
Остаток 7, так и оставляем.
В итоге в двоично-десятичном виде 567 будет выглядеть так: 101 110 111.

Выводить на индикатор будем динамически. Т.е. каждый разряд будет гореть какое-то время,
по очереди. Чтобы глаз не видел мерцание разряда - разряд должен обновляться с
частотой не менее чем 50Гц. Т.к. у нас 3 разряда - частота должна быть не менее 150Гц.


Теперь программа.

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

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

Рис1.
Настройка таймера.
Время рассчитывается по такой формуле t=TCNT * Fкв/Kдел , где
t - нужное время,
TCNT - число в счетном регистре,
Fкв - частота кварца,
Kдел - коефициент деления пределителя.

Возьмем для обновления разряда 100Гц, тогда для 3 разрядов будет 300Гц.
Значит прерывание от таймера должно происходить каждые 1/300 = 0,0033сек.

Частоту кварца берем 4МГц, коефициент пределителя берем 64, тогда по формуле
TCNT = 0,0033 * 4000000 / 64 = 206.
Теперь в счетный регистр записываем 255-206=49 Т.К. прерывание происходит при переполнении
счетного регистра.

1->TOIE0 - разрешаем прерывание от таймера Т0.

1->NUMB_RAZR - устанавливаем с какого разряда начинаем выводить числа.

456->INDIK - здесь хранится число, которое будет выводиться на индикатор.
При выполнении основной программы его можно просто менять, а при
прерывании оно автоматически будет выводиться на индикатор.

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

Остальное вроде понятно.


Рис2.
Эта подпрограмма будет преобразовывать наше число из
двоичного кода в двоично-десятичный. Ее нужно вызывать всегда после
обновления числа в регистре INDIK.

^PERV
^VTOR
^TRET - это мы очищаем старые значения.

INDIK->TEMP_INDIK - здесь просто копируем наше число в другой регистр
для преобразования, чтобы наше число не затерлось.

Дальше алгоритм как я описал в теории.

В регистрах PERV, VTOR и TRET хранится наше число в двоично-десятичном коде.


Рис3.
Timer_0_Overflow - это метка с которой будет обрабатываться прерывание от таймера.
SREG-> - это мы сохраняем содержимое регистра SREG в стеке, чтобы в
случае изменения его при прерывании вернуть прежнее значение в основную программу.
Желательно это делать при обработке каждого прерывания.

VIVI_V_INDIK - вызов подпрограммы, которая будет выводить число в индикатор.

255-206->TCNT0 - для того чтобы следующее прерывание произошло через 0,0033сек.

->SREG - восстанавливаем SREG из стека.

RETI - выход из обработки прерывания.


Рис4.
Это подпрограмма, которая будет непосредственно выводить число на индикатор.

NUMB_RAZR <= 3 - здесь проверяем все разряды вывели или нет. Если третий
разряд вывели то начинаем опять с первого.

NUMB_RAZR = 1
NUMB_RAZR = 2
NUMB_RAZR = 3 - это мы проверяем какой разряд выводить, и соответственно
достаем число(в двоично-десятичном коде) для нужного разряда.

INDIK < 10
INDIK < 100 - проверка для того, чтобы не выводить 024 или 005, а выводить 24 и 5, будем
крайние нули гасить.

Razr_gash - эта подпрограмма как раз и гасит наш разряд.

Razr_1
Razr_2
Razr_3 - эти подпрограммы зажигают необходимый разряд, выводя на него "0", а на
остальные "1" (если индикатор с общим анодом).

PERV->TEMP
VTOR->TEMP
TRET->TEMP - здесь копируем двоично-десятичный код во временный регистр.

TEMP = 0
TEMP = 1
TEMP = 2
TEMP = 3
TEMP = 4
TEMP = 5
TEMP = 6
TEMP = 7
TEMP = 8
TEMP = 9 - здесь проверяем какое число нужно вывести в индикатор.

Cif_0
Cif_1
Cif_2
Cif_3
Cif_4
Cif_5
Cif_6
Cif_7
Cif_8
Cif_9 - подпрограммки, которые устанавливают на ногах микроконтроллера
необходимые уровни, для формирования числа на индикаторе.

NUMB_RAZR++ - увеличиваем номер разряда на 1 для вывода следующего разряда.


Рис5.
Это подпрограмки, которые устанавливают необходимые уровни на ногах
микроконтроллера.
Тут вроде все ясно.

Чтобы изменить программу для индикатора с общим катодом нужно просто
поменять все "0" на "1", а "1" на "0".


Рис6.
Здесь даем имя каждой ноге микроконтроллера.
Теперь для оптимизации разводки платы индикатор можно подключать к любым ногам
микроконтроллера(к портам), а в программе необходимо только изменить порты.
Например segA PORPD.0 на segA PORTC.4. Далее только скомпилировать программу - и все.
А, ну и конечно в начале программы настроить порты на выход.


Рис7.
Здесь тоже все должно быть понятно - даем имена регистрам, с комментариями.


Рис8.
Ну, это схема – тут тоже все ясно.


Рис9.
Это работа в Proteus.
Поставил инверторы т.к. с транзисторами подтормаживала. Но в работоспособности
программы убедиться можно.


Рис10.
Ну а это уже в железе.

В прикрепленном файле находятся программа в AB и схема для Proteus’а.


Надеюсь материал будет кому-то полезен и труд останется замечен.

Если есть вопросы - задавайте.
От замечаний и пожеланий тоже не откажусь.

С уважением Kotjara.



Присоединённый файл ( Кол-во скачиваний: 1331 )
Присоединённый файл  Проги.rar
Top
Kotjara
Сообщение: # 60279   Nov 22 2006, 01:27 AM
Quote Post


Unregistered










рис1

Присоединённое изображение (Нажмите для увеличения)
Присоединённое изображение
Top
Kotjara
Сообщение: # 60280   Nov 22 2006, 01:28 AM
Quote Post


Unregistered










рис2

Присоединённое изображение
Присоединённое изображение
Top
Kotjara
Сообщение: # 60282   Nov 22 2006, 01:28 AM
Quote Post


Unregistered










рис3

Присоединённое изображение
Присоединённое изображение
Top
Kotjara
Сообщение: # 60284   Nov 22 2006, 01:29 AM
Quote Post


Unregistered










рис4

Присоединённое изображение (Нажмите для увеличения)
Присоединённое изображение
Top
Kotjara
Сообщение: # 60285   Nov 22 2006, 01:31 AM
Quote Post


Unregistered










рис5

Присоединённое изображение (Нажмите для увеличения)
Присоединённое изображение
Top
Kotjara
Сообщение: # 60286   Nov 22 2006, 01:31 AM
Quote Post


Unregistered










рис6

Присоединённое изображение
Присоединённое изображение
Top
Kotjara
Сообщение: # 60287   Nov 22 2006, 01:32 AM
Quote Post


Unregistered










рис7

Присоединённое изображение (Нажмите для увеличения)
Присоединённое изображение
Top
Kotjara
Сообщение: # 60288   Nov 22 2006, 01:32 AM
Quote Post


Unregistered










рис8

Присоединённое изображение (Нажмите для увеличения)
Присоединённое изображение
Top
Kotjara
Сообщение: # 60289   Nov 22 2006, 01:32 AM
Quote Post


Unregistered










рис9

Присоединённое изображение (Нажмите для увеличения)
Присоединённое изображение
Top
Kotjara
Сообщение: # 60290   Nov 22 2006, 01:32 AM
Quote Post


Unregistered










рис10

Присоединённое изображение
Присоединённое изображение
Top
Kotjara
Сообщение: # 60291   Nov 22 2006, 01:38 AM
Quote Post


Unregistered










QUOTE (pauk @ Nov 21 2006, 12:47 AM)
обещал КАТЯРА дали и пропал ...

pauk: ну правда, реально времени не хватает, а тут еще дипломный проект на носу висит.
Прогу я еще месяц назад за пару часов написал и отладил, а коментарии сегодня весь день шпарит, вот.
Top
avr123
Сообщение: # 60304   Nov 22 2006, 09:53 AM
Quote Post


Соучастник
****

Группа: Cоучастник
Сообщений: 905
Пользователь №: 8980
Регистрация: 11-June 06
Место жительства: Москва



QUOTE (Kotjara @ Nov 22 2006, 02:47 AM)
Настройка таймера.
Время рассчитывается по такой формуле t=TCNT * Fкв/Kдел , где
t - нужное время,
TCNT - число в счетном регистре,
Fкв - частота кварца,
Kдел - коефициент деления пределителя.

я думаю про таймер вы не правильно написали.
PMEmail PosterUsers Website
Top
avr123
Сообщение: # 60305   Nov 22 2006, 09:54 AM
Quote Post


Соучастник
****

Группа: Cоучастник
Сообщений: 905
Пользователь №: 8980
Регистрация: 11-June 06
Место жительства: Москва



я бы 68 ком на 10 ком заменил.
PMEmail PosterUsers Website
Top
pauk
Сообщение: # 60429   Nov 23 2006, 03:08 PM
Quote Post


Unregistered










QUOTE (Kotjara @ Nov 22 2006, 02:58 AM)
QUOTE (pauk @ Nov 21 2006, 12:47 AM)
обещал КАТЯРА дали и пропал ...

pauk: ну правда, реально времени не хватает, а тут еще дипломный проект на носу висит.
Прогу я еще месяц назад за пару часов написал и отладил, а коментарии сегодня весь день шпарит, вот.

огромное спасибо 1_7.gif просто супер
drinks_cheers.gif
Top
Kotjara
Сообщение: # 60484   Nov 23 2006, 11:53 PM
Quote Post


Unregistered










QUOTE (avr123.nm.ru @ Nov 22 2006, 11:13 AM)
QUOTE (Kotjara @ Nov 22 2006, 02:47 AM)
Настройка таймера.
Время рассчитывается по такой формуле t=TCNT * Fкв/Kдел , где
t - нужное время,
TCNT - число в счетном регистре,
Fкв - частота кварца,
Kдел - коефициент деления пределителя.

я думаю про таймер вы не правильно написали.

Вы правы, опечатался.
Правильно так: t=TCNT * Kдел/Fкв
Спасибо за замечание.

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

Top
Kotjara
Сообщение: # 60486   Nov 23 2006, 11:56 PM
Quote Post


Unregistered










QUOTE (avr123.nm.ru @ Nov 22 2006, 11:14 AM)
я бы 68 ком на 10 ком заменил.

Резистор я подбирал экспереметально, по оптимальной яркости свечения индикатора и потребляемому току.
При 10к излишне ярко светил.
Top
avr123
Сообщение: # 60514   Nov 24 2006, 11:34 AM
Quote Post


Соучастник
****

Группа: Cоучастник
Сообщений: 905
Пользователь №: 8980
Регистрация: 11-June 06
Место жительства: Москва



дак выж этого не написали ! этож от транзистора будет зависеть.

обычно делают 10 ком что транзистор работал включевом режиме или повторителем.

А ток через светодиоды ограничивают резисторами.
PMEmail PosterUsers Website
Top
avr123
Сообщение: # 60515   Nov 24 2006, 11:40 AM
Quote Post


Соучастник
****

Группа: Cоучастник
Сообщений: 905
Пользователь №: 8980
Регистрация: 11-June 06
Место жительства: Москва



у вас же в схеме есть резисторы определяющие яркость свечения - по 330 ом.

а транзисторы должны работать как ключи, чтоб яркость почти не зависила от разброса их параметров.
PMEmail PosterUsers Website
Top
avr123
Сообщение: # 60517   Nov 24 2006, 11:46 AM
Quote Post


Соучастник
****

Группа: Cоучастник
Сообщений: 905
Пользователь №: 8980
Регистрация: 11-June 06
Место жительства: Москва



QUOTE (Kotjara @ Nov 24 2006, 01:13 AM)
Вы правы, опечатался.
Правильно так: t=TCNT * Kдел/Fкв
Спасибо за замечание.

что такое TCNT ? это вы вводите ? а меге8 такого нет.

=====

мне кажется что вы не понимаете как таймер работает. я писал что вы алгоритм его работы не верно ПО ОМЕМУ описываете.

я вот так толкую работу таймера:
http://avr123.nm.ru/z1.htm

http://avr123.nm.ru/06.htm
PMEmail PosterUsers Website
Top
Kotjara
Сообщение: # 60531   Nov 24 2006, 04:01 PM
Quote Post


Unregistered










QUOTE (avr123.nm.ru @ Nov 24 2006, 01:06 PM)
QUOTE (Kotjara @ Nov 24 2006, 01:13 AM)
Вы правы, опечатался.
Правильно так: t=TCNT * Kдел/Fкв
Спасибо за замечание.

что такое TCNT ? это вы вводите ? а меге8 такого нет.

=====

мне кажется что вы не понимаете как таймер работает. я писал что вы алгоритм его работы не верно ПО ОМЕМУ описываете.

я вот так толкую работу таймера:
http://avr123.nm.ru/z1.htm

http://avr123.nm.ru/06.htm

В ATMege8 три таймера соответственно три счетных регистра TCNT0,
TCNT1 и TCNT2.
А по формуле можно найти любое неизвестное.

TCNT(в формуле) - я обозначил условно, здесь можно поставить как X так и Y.
И это не то число, которое непосредственно записывается в счетный регистр, а
то на которое должно произойти изменение. По этому оно и вычитается из максимально возможного находящегося в счетном регистре, т.к. таймер работает по переполнению. Это я писал в пояснении к рис1.

Работу таймера понимаю отлично, возможно недостаторно ясно описал, по этому готов ответить на непонятные моменты. Что именно я не правильно описал??
Упор делал на то как таймер расчитать, а о том как он работает можно найти в инете, в частности на вашем сайте.

Top

Настройки темыСтраницы: (163) 1 2 3 [4] 5 6 7 8 9 10 11 12 13 14 ... Последняя » Ответить Шустрый ответ Новая тема Новый опрос


 




    РадиоКОТ - популярно об электронике. Авторские схемы, новые разработки. Обучение по электронике, микроконтроллерам, ПЛИС. Форум   banner DIPTRACE - САМЫЙ ЛУЧШИЙ ТАКСИРОВЩИК ПЕЧАТНЫХ ПЛАТ
Portal-X