Здравствуйте, Ув. Коты и Кошечки.
Новоиспеченный пользователь АVR (то есть я) пытается настроить на вывод два порта D и В, на одновременную работу, на тини2313. но ни че не получается, поиск результатом не увенчался(((
цель: "дергание" лапками тини на двух портах.
Если кому не жалко кода кусочек, или подправте мой))) поделитесь опытом, плз.
Ну порт B настроили на выход, ну посылаете на него какие-то данные, ничего что индусский код, вроде должен работать. Но что мешает точно так-же настроить порт D (один раз при инициализации, а не в цикле) и выводить на него тот же самый temp в той-же процедуре delay?
chezetmobile писал(а):Здравствуйте, Ув. Коты и Кошечки.
Новоиспеченный пользователь АVR (то есть я) пытается настроить на вывод два порта D и В, на одновременную работу, на тини2313. но ни че не получается, поиск результатом не увенчался(((
цель: "дергание" лапками тини на двух портах.
Если кому не жалко кода кусочек, или подправте мой))) поделитесь опытом, плз.
Я конечно тоже новичек, но мне кажется что содержимое temp нужно переносить в PORTB вроде типа того
ldi Temp,0b00010010 ; запись константы
out PORTB,temp ;вывод на индикацию
rcall Delay ;вызов подпрограммы задержки
Здравствуйте. Переписал пример с таймерами с обучалки на свою мегу32, не работает. Компилируется, но не работает, код который идет в начале загрузке трассируется нормально, а вот в протеусе модель ничего не выводит. Поделитесь опытом, где я мог ошибиться?
здравствуйте, попытки переписать код из обучалки на одновременную работу портов В и D не дали нужного результата. подскажите, пожалуйста, где накосячил.
chezetmobile писал(а):здравствуйте, попытки переписать код из обучалки на одновременную работу портов В и D не дали нужного результата. подскажите, пожалуйста, где накосячил.
ldi Temp,low(RamEnd) ;инициализация стека
out SPL,Temp
И ещё, приглядитесь внимательно: ;Задержка
Delay: out PortB,Temp
ldi Temp1,50
ldi Temp2,50
ldi Temp2,5
Loop: dec Temp1
brne Loop1
dec Temp2
brne Loop
dec Temp3
brne Loop
ret
Спрашивается, нахера дефайнить регистры чтобы потом давать им однотипные ничего не значащие имена???
Последний раз редактировалось Gudd-Head Ср мар 02, 2011 16:14:34, всего редактировалось 1 раз.
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
chezetmobile писал(а):здравствуйте, попытки переписать код из обучалки на одновременную работу портов В и D не дали нужного результата. подскажите, пожалуйста, где накосячил.
Вы хотя бы пробовали вашу программу в уме прогнать? Как по-вашему в каком случае контроллер должен перейти к метке Label2?
Вот что получается:
1) инициализация стека, порты на выход
2) label
3) вывод в B ;зачем, если сразу за этим все равно вывод другого значения в процедуре задержки?
4) загрузка temp, задержка (повтор 3 раза)
5) переход к п.2
---подпрограмма задержки---
-вывод temp в B
-непосредственно задержка
-возврат
-----------------------------------
6) label2 ; как и откуда сюда попадет контроллер?
7) вывод в D ;опять же, зачем, если сразу новый вывод?
8) загрузка temp5, задержка2 (повтор 4 раза)
9) переход к п.6
---задержка 2----
...
...
возврат
Определитесь, в какой последовательности вам нужно выводить данные в порты и составьте хотя бы алгоритм...
Насчет дефайнов регистров - вопрос далеко не в этом, тут с алгоритмом беда...
LOOP:
...
...
ldi Temp,0b10110111 ;загрузка для B
ldi Temp5,0b10110111 ;загрузка для D
rcall Delay ;вызов подпрограммы задержки
...
...
...
RJMP LOOP
Delay:
out PortB,Temp ;вывод B
out PortD,Temp5 ;вывод D
...
...
;задержка
...
RET
Кстати, у более продвинутых контроллеров, у которых регистров периферии >32, эти регистры попадают совсем в другую страницу памяти, и LDS/STS - единственный способ к ним достучаться, например, ADC в Атмега88. И этот способ очень даже документирован, а указатель Z здесь лишний, простой STS рулит.
А почему лишний? В некоторых случаях совсем не лишний. Если вдруг надумается сделать какой-нибудь сложный алгоритм. Типа автонастройки таймера или UART. Или выбор порта для вывода данных. Или как метод защиты программы от декомпилирования и разбора программы.
Так-же можно применить в полиморфных алгоритмах. Или, как вариант - в случае нехватки памяти флэша, при условии, что ЕЕPROM имеет много свободного места, можно организовать настройку периферии при старте одним-двумя циклами, вытащив данные из EEPROM и раскидав их по соответствующим регистрам.
На счёт того, что в более продвинуты МК, некоторые регистры числятся как Memory mapped, я в курсе.
Тут именно обычный регистр, к которому обращаются только через команды in и out, адресуется парой Z. Этого-то точно нет в мануалах. Приведённый выше код работает в простой тиньке 26L.
Последний раз редактировалось DX168B Чт мар 03, 2011 14:40:56, всего редактировалось 1 раз.
I am DX168B and this is my favourite forum on internet!