Автор | Сообщение |
stas-mas
Завсегдатай
Сообщения: 625
|
INSAN, мне очень сложно ответить на твой вопрос
INSAN писал: | vbvb, не объясните мне как управлять по шине pt2313 с помошью avr на asm.? |
ибо я это прошёл ещё 10 лет тому,поэтому давай конкретно,
конкретный вопрос-конкретный ответ,не большой совет-забудь про асм и переходи на С |
|
INSAN
Передовик
Сообщения: 1654
|
stas-mas, давай перейдём, с чего начать? |
|
vbvb
|
INSAN,
по вашему вопросу о управлении переферией - вы уже разобрались с прерываниями, работой таймеров?
и как же ваше замыслы о изучении ассемблера?
Надеюсь понятно почему ваш кружок загнулся? |
|
INSAN
Передовик
Сообщения: 1654
|
vbvb, ничего пока не загнулось. Я пока не могу сам сосредоточиться из-за основной моей работы, скоро отпуск и тогда целыми днями и ночами буду проводить на этой страничке. От ассемблера я НЕ БУДУ ОТХОДИТЬ ничуть так , как я хоть там малость уже понимаю и и изучение контроллера взяв за основу программирования ассемблер даёт практически полный контроль над внутренностями контроллера ..т.е я лично не вижу других путей кроме ассемблера по "курению" даташитов и внутренностей М.К. А пока меня вполне устраивают такие дискуссии по данной теме - читаю ваши мнения ,анализирую свои промахи ошибки в организации темы, пытаюсь организоваться. Ведь сами же понимаете, что даже конкретно задать вопрос (если , что то не понятно) тяжело изложить правильно суть вопроса, чтоб тебе же не ответили вопросом типа "чего ты хочешь". Вот для этого заказал очередную книгу Белова А.В. "Разработка устройств на микроконтроллерах AVR Шагаем от "чайника" до профи. Читаю книгу и вникаю в суть всего происходящего в М.К. ... помощи ждать не от кого - мы целиком в окружении вражеских микроконтроллеров ... но единственное , что знаю и понимаю хорошо , что нет не выполнимых задач.. Да поможет мне моя упёртость!!! |
|
vbvb
|
Ну тогда не нужно разбрасываться - от простого к сложному.
намечу 2-3 шага для начинающих
- разработать бегущие огни (1 светодиод горит, как вариант 2горят) Кому не интересны огни могут изменять 2 разряда от 00 до FF в 7 сегментом варианте
- тоже самое с фиксированным изменением скорости на 200мсек за шаг, от 2-х кнопок (+ и -)
- тоже самое но изменение плавное (то есть пока держишь"+" идет плавное увеличение)
и не бросайтесь сразу на написание команд, сначала граф
Рекомендация по организации программы
{начальный модуль} - сброс , инициализация таймеров, переменных, констант, периферии, проверка разных условий.
{основное тело программы} только проверки - ветвления и вызов п/программ.
[модуль п/программ, таблицы и пр] |
|
INSAN
Передовик
Сообщения: 1654
|
vbvb, я вас полностью понял , дельный совет - хороший подход к данной теме. На этом дискуссии заканчиваем.. если у вас есть материал по выдвинутой так сказать вашей программе обучения ,то начните сами с бегущих огней . спасибо за совет! |
|
INSAN
Передовик
Сообщения: 1654
|
Ну вот, первый проект-- бегущие огни . проект в студии и проект в протеусе во вложенном архиве. распакуйте архив на диск С и запускайте проекты.
;##############################################
;## Пример 1 ##
;## БЕГУЩИЕ ОГНИ ##
;##############################################
;------------------------- Псевдокоманды управления
.include "tn2313def.inc" ; Присоединение файла ;описаний
.list ; Включение листинга
;------------------------- Начало программного кода ;(начальный модуль)
.cseg ; определяем с какого адресса в памяти програм (Flash)
.org 0 ; будет начинаться наша программа. мы ;определили , что с 0-го
.def temp = r16 ; Определяем главноый рабочий регистр
;-------------------------- Инициализация стека (начальный ;модуль)
ldi temp, RAMEND ; Выбор адреса вершины стека
out SPL, temp ; Запись его в регистр ;стека
;-------------------------- Инициализация портов Ввода\Вывод ;(начальный модуль)
ldi temp, 0xFF ; Записываем число ;$FF(255) в регистр temp
out DDRB, temp ; Записываем это число в DDRB (порт PB на вывод)
;-------------------------- Основной цикл (основное тело ;программы)
main:
ldi temp, 0b000000001 ;
out PORTB, temp ; отправляем в порт ;PB , включим 1 светодиод
rcall DELAY; переход в подпрограмму задержки
ldi temp, 0b00000010 ;
out PORTB, temp ; отправляем в порт ;PB включим 2 светодиод
rcall DELAY; переход в подпрограмму задержки
ldi temp, 0b00000100 ;
out PORTB, temp ; отправляем в порт ;PB включим 3 светодиод
rcall DELAY ; переход в подпрограмму задержки
rjmp main ; К началу цикла
DELAY: ; Подпрограмма задержки (модуль п/программ, ;таблицы и пр)
ldi r23,255 ;
d1: ldi r22,255
d2: dec r22 ;
brne d2 ;
dec r23 ;
brne d1;
RET ;Возврат из DELAY
ДОБАВЛЕНО 15/01/2013 00:21
читайте код , задавайте вопросы (это я совсем начинающим)
led_ast.rar 16.91 КБ Скачано: 341 раз(а)
|
|
INSAN
Передовик
Сообщения: 1654
|
.include "tn2313def.inc" ; Присоединение файла ;описаний
...тут мы присоединили к нашему проекту файл с описанием всех регистров микроконтроллера.. в общем выбрали мк для которой мы пишем прогу
.list ; Включение листинга --это не обязательно!
.cseg ; определяем с какого адресса в памяти програм (Flash)
.org 0 ; будет начинаться наша программа. мы ;определили , что с 0-го -----тут понятно я думаю.
ldi temp, RAMEND ; Выбор адреса вершины стека
out SPL, temp ; Запись его в регистр ;стека --- необходим для возврата в основную программу ...нууу, в данном случае после выполнения подпрограммы задержки... в стеке перед выполнением подпр. задержки сохраняется адрес с которого мы перешли на выполнение подпр. задержки ... в нашем случае это адрес команды rcall DELAY +1 что значит +1, объясняю, это значит , что после выполнения подпрограммы DELAY мы не возврашаемся именно на команду (на адрес в памяти программ команды rcall DELAY) а переходим на следующий адрес за командой rcall DELAY -вызова подпрограммы DELAY (в нашем случвае это ldi temp, 0b000000001,ldi temp, 0b00000010,ldi temp, 0b00000100 , потому, что у нас в трёх местах с проге осуществляется переход на подпрограмму задержки(во времени конечно ) DELAY посредством команд rcall DELAY.
rjmp main ; К началу цикла --- это мы уже переходим
на начало main: -нашей основной программы, это произойдёт как программа выполнит последние три команды в нашей основной программе под названием main
ldi temp, 0b00000100 ;
out PORTB, temp ; отправляем в порт ;PB
rcall DELAY
т.е. включит третий светодиод, подержит её светящей пока не выполнится подпрограмма задержки DELAY .и потом выполнит команду rjmp main ; К началу цикла ... светодиод погаснет и начнётся всё с начала...и так мы получим вечно бегущие одна за другим три светодиода.... остальные 5светодиодов вы можете сами подключить . как ? подумайте сами чуток.
ДОБАВЛЕНО 15/01/2013 01:12
да, забыл про
ldi temp, 0xFF ; Записываем число ;$FF(255) в регистр temp
out DDRB, temp ; Записываем это число в DDRB (порт PB на вывод)
тут мы переводим порт B К КОТОРОМУ ПОДКЛЮЧЕНЫ СВЕТОДИОДЫ в режим вывода информации , для этого мы в регистр управления портом В DDRB вводим число 0xFF(0b11111111) |
|
vbvb
|
Для начала может и сгодится, но чуть поправлю в организации.
ldi temp, 0b000000001 ;
out PORTB, temp
и тд
А представьте, что если нужно таких посылок штук 80.
как я называю, получится "колбаса" или "макаронина"
Попробуйте то же самое, используя цикл и сдвиговые команды
Выйдет гораздо симпатичнее и на будущее сгодится.
и еще....распишите подробнее комментарии к Delay, про вложенный цикл |
|
INSAN
Передовик
Сообщения: 1654
|
vbvb, я понял. вечером поработаю над этим. попробую сам состряпать чё нить не подсматривая в готовые примеры. |
|
INSAN
Передовик
Сообщения: 1654
|
m1: ldi temp, 0b00000001
m: out PORTB, temp
rcall DELAY
cpi r16,0b10000000
breq m1
lsl temp
rjmp m
вот основная программа с использованием команды сдвига влево lsl . в архиве всё остальное-проект в протеусе и студии
ДОБАВЛЕНО 16/01/2013 20:55
описание подпрограммы DELAY (задержки)
DELAY: ; Подпрограмма задержки (модуль п/программ, ;таблицы и пр)
ldi r23,255 ;
d1: ldi r22,255
d2: dec r22 ;
brne d2 ;
dec r23 ;
brne d1;
RET ;Возврат из DELAY
ldi r23,255 ; записали число 255 в регистр r23
ldi r22,255 ; записали число 255 в регистр r22
dec r22 ; отнимаем единицу от числа(255) находящемся в ;регистре r22
brne d2 ; проверяем не равно ли нулю результат после вычитания единицы от числа находящегося в регистре r22 , если да, то переходим к следующей команде (dec r23) , если нет- на метку d2: т.е. d2: dec r22 ; и так далее пока при выполнении команды сравнения (brne d1) число в r23 не окажется нулём , тогда выполнится команда RET
RET ;Возврат из DELAY ----эта команда вернёт к выполнению основной программы , в нашем случае команда вызвавшая подпрограмму DELAY была команда rcall DELAY( переход в подпрограмму задержки ), естественно команда RET вернёт к выполнению команды идущей после команды rcall DELAY.
led_1.rar 16.72 КБ Скачано: 234 раз(а)
|
|
vbvb
|
и еще совет- в небольшой программе это не важно, а в большом проекте, который может длиться долго, лучше именовать метки ближе к теме выполняемого. Не a1:, b2:, а к примеру, leftshiftstart:, movetoport: (ограничение по длине метки в нашем случае сколько?)
И еще - желательно иметь список регистров и описание их назначений для данной разработки. |
|
INSAN
Передовик
Сообщения: 1654
|
Я понял. vbvb, над чем мне дальше трудиться?
ДОБАВЛЕНО 17/01/2013 01:13
вот хотел создать две подпрограммы , ч тоб одна двигала строку влево а вторая в на право при помощи нажатия двух кнопок. одна кнопка для вызова одной подпрограммы, вторая под вторую п\программу. но чтото не получается. |
|
vbvb
|
небольшой план такой
-освоить таймер( программировать значение- обработать прерывание- запустить заново) Заменить п/пр
delay функцией таймера
- далее вместо светодиодов 7 сегментные индикаторы
- вывод значения таймера на эти 7 сегментные
- работа с кнопками
- замена 7 сегментных на ЖКИ
- посылка последовательного кода (в зависимости от выбранной управляющей микросхемы усилителя аналогового сигнала)
INSAN писал: | .... ч тоб одна двигала строку влево а вторая в на право при помощи нажатия двух кнопок. одна кнопка для вызова одной подпрограммы, вторая под вторую п\программу. но чтото не получается. |
Я пока не разбирался с данным процессором, есть ли там битовые команды. Я бы такую задачу сделал бы так
кнопка 1 устанавливает левый бит, и сбрасывает правый, 2-ая кнопка наоборот. И в зависимости от установленных битов (условий) выполняется сдвиг влево или вправо соответствующими командами. |
|
INSAN
Передовик
Сообщения: 1654
|
Очень даже хорошо понимаю вас , что вы предлагаете . но у меня проблема с таймерами, мне бы не большой примерчик по инициализации таймера и его использовании в программе. может объясните мне как используют таймеры простыми словами??
ДОБАВЛЕНО 17/01/2013 01:29
сам принцип управления 7 сегментных инд. и ЖКИ мне известен. |
|
vbvb
|
INSAN писал: | Очень даже хорошо понимаю вас , что вы предлагаете . но у меня проблема с таймерами, мне бы не большой примерчик по инициализации таймера и его использовании в программе. может объясните мне как используют таймеры простыми словами?? |
Читайте как сделано в этом, думаю что как и в других
Есть регистры таймера и биты его управления.
Регистры загружаются значением, соответствующей задержки. Старт . Он считает по каждому такту генератора.(ну или что то в этом роде) и при переполнение выставляет бит прерывания.Если он соответствующей командой разрешен(или не запрещен) выполняется переход на метку обработки данного прерывания, где выполняются желаемые команды.Можно тут же его инициализировать и запустить заново. Как то так.Думаю в книгах это подробно описано
INSAN писал: |
сам принцип управления 7 сегментных инд. и ЖКИ мне известен. |
дело за малым -назначить порты управления, так как выводов немного и пора уже скоро определяться с периферией. |
|
INSAN
Передовик
Сообщения: 1654
|
вот как к примеру таймер использовать за место подпрограммы задержки, для создания генератора прямоугольных импульсов с выходом сигнала через вывод порта с регулированием частоты сигнала кнопками меньше\больше к примеру? |
|
vbvb
|
INSAN писал: | вот как к примеру таймер использовать за место подпрограммы задержки, для создания генератора прямоугольных импульсов с выходом сигнала через вывод порта с регулированием частоты сигнала кнопками меньше\больше к примеру? |
ну как пример -да
но применительно к практическим задачам- малоинтересно, если только управлять тиристором, запуская таймер от прерывания, возникающего при переходе через 0 в сети 220. Хватит там таймера на 20мсек? |
|
INSAN
Передовик
Сообщения: 1654
|
а почему именно на 20мсек? |
|
vbvb
|
длительность волны 50 герц, ну или 10мсек если использовать каждую полуволну , применительно к симистору |
|
|