Страница 1 из 2

Помогите с портами

Добавлено: Пт апр 27, 2007 06:28:52
Пожиратель AVR
вот напремер в обучалке есть такая програма

.cseg
.org 0

ldi Temp,RamEnd ;инициализация стека
out SPL,Temp

ldi Temp,0b11111111 ;настройка портов
out DDRB,Temp

Begin: ldi Temp,0b00000001 ;вывод на индикацию
rcall Delay ;вызов подпрограммы задержки

ldi Temp,0b00000010 ;вывод на индикацию
rcall Delay ;вызов подпрограммы задержки

ldi Temp,0b00000100 ;вывод на индикацию
rcall Delay ;вызов подпрограммы задержки

ldi Temp,0b00001000 ;вывод на индикацию
rcall Delay ;вызов подпрограммы задержки

ldi Temp,0b00010000 ;вывод на индикацию
rcall Delay ;вызов подпрограммы задержки

ldi Temp,0b00100000 ;вывод на индикацию
rcall Delay ;вызов подпрограммы задержки

ldi Temp,0b01000000 ;вывод на индикацию
rcall Delay ;вызов подпрограммы задержки

ldi Temp,0b10000000 ;вывод на индикацию
rcall Delay ;вызов подпрограммы задержки

rjmp Begin ;поехали по новой!


;****************************************************
;Задержка

Delay: out PortB,Temp

ldi Temp1,0
ldi Temp2,0
ldi Temp3,10

Loop: dec Temp1
brne Loop

dec Temp2
brne Loop

dec Temp3
brne Loop

ret


Там используется токо порт B.
Вот хотелось бы чтобы когда на порте B бежит огонек ,с порте D тоже чтонить происходило.
Помогите новичку разобраться как сразу с двумя портами работать :))

Добавлено: Пт апр 27, 2007 10:40:11
tych
Так же как и с одним.

Добавлено: Пт апр 27, 2007 10:44:24
ARV
Во первых, советую программу упростить примерно так:

Код: Выделить всё

Begin:
     ldi   Temp, 1
loop:
     rcall Delay
     rol   Temp ; будем единицу в Temp сдвигать 
     rjmp  loop
Зачем 100 раз повторять то, что можно сделать автоматически?

Теперь: что именно с другим портом ты собрался делать?
Если тоже просто что-то выводить одновременно с портом В - заведи другую переменную, например Temp2, заноси в нее что надо и выводи в PortB в своей подпрограмме Delay...
А вот если надо делать не одновременно - тогда сложнее...

Добавлено: Пт апр 27, 2007 11:35:08
Пожиратель AVR
у меня какойто глюк сначала выполняется первая програма бегуших огней на порте B после неё начанает выполнятся вторая на порт D но проблема она выводится в оба порта микроконтролера а не токо в D и первый кусок програмы больше невыводится (нажелезе непробовал делал в PROTEUSE)

Добавлено: Пт апр 27, 2007 11:49:11
Пожиратель AVR
И где надо ставить настройку порта D Перед первой програмой или после

.cseg
.org 0

ldi Temp,RamEnd ;инициализация стека
out SPL,Temp

ldi Temp,0b11111111 ;настройка портов
out DDRB,Temp

ldi Temp,0b10101010 ;вывод на индикацию
rcall Delay ;вызов подпрограммы задержки

.......

ldi Temp,0b10010010 ;вывод на индикацию
rcall Delay ;вызов подпрограммы задержки




Суда ли писать настройку порта?????


ldi Temp2,0b11111111 ;настройка портов
out DDRD,Temp


ldi Temp2,0b10101010 ;вывод на индикацию
rcall Delay ;вызов подпрограммы задержки

..........

ldi Temp2,0b10101010 ;вывод на индикацию
rcall Delay ;вызов подпрограммы задержки


;****************************************************
;Задержка

Delay: out PortB,Temp

ldi Temp1,0
ldi Temp2,0
ldi Temp3,10

Loop: dec Temp1
brne Loop

dec Temp2
brne Loop

dec Temp3
brne Loop

ret

Правильно скажите ??? :idea:

Если нет то напишите как надо правильно писать заранее благодарен :))

Добавлено: Пт апр 27, 2007 11:58:15
tych
Иван.паяльшик писал(а):И где надо ставить настройку порта D Перед первой програмой или после
Настраивать порт можно и нужно в любом месте программы где это требуется.

По ходу программы вам возможно понадобится изменить режим работы ножки порта.


Эту запись в обучалке

Код: Выделить всё

ldi Temp,0b11111111 ;настройка портов 
out DDRB,Temp 
я предлагал исправить чтоб было понятней
к чему относится комментарий.

Например так:

Код: Выделить всё

;настройка порта В
 
ldi Temp,0b11111111   ; загрузить в temp число 255 
out DDRB,Temp           ; загрузить число из temp  в регистр 
                                  ;управления режимом работы выводов порта В
теперь все выводы порта В стали активными выходами - что это такое смотри по линку выше.

Теперь вы можете конфигурировать следующий порт

исправил :

Код: Выделить всё

;настройка порта D
 
ldi Temp,0b00001111   ; загрузить в temp число 0Fh 

out DDRD,Temp           ; загрузить число из temp  в регистр 
                                  ;управления режимом работы выводов порта D
теперь PD0_PD3 выходы а PD4_PD7 входы.

Добавлено: Пт апр 27, 2007 12:04:20
tych
Ели не настраивать порты то в них будут числа по-умолчанию - в даташите эти числа указаны - посмотрите в конце дш таблицу регистров.

И еще вот этот шаблон:
http://www.radiokot.ru/forum/viewtopic.php?t=2273

Добавлено: Пт апр 27, 2007 12:14:19
Пожиратель AVR
Вот сейчас я сделал так ну почемуто у меня выплняется токо первая часть програмы а вторая неначинается

новый текст.

ldi Temp,RamEnd ;инициализация стека
out SPL,Temp

ldi Temp,0b11111111 ;настройка портов
out DDRB,Temp

Begin: ldi Temp,0b00000001 ;вывод на индикацию
rcall Delay ;вызов подпрограммы задержки

...........

ldi Temp,0b10000000 ;вывод на индикацию
rcall Delay ;вызов подпрограммы задержки

rjmp Begin ;поехали по новой!


ldi Temp1,0b11111111 ;настройка портов
out DDRD,Temp1


Begin2: ldi Temp1,0b00010001 ;вывод на индикацию
rcall Delay ;вызов подпрограммы задержки

..............

ldi Temp,0b10011100 ;вывод на индикацию
rcall Delay ;вызов подпрограммы задержк

rjmp Begin2 ;поехали по новой!


;****************************************************
;Задержка

Delay: out PortB,Temp
out PortD,Temp1

ldi Temp2,0
ldi Temp3,0
ldi Temp4,10

Loop: dec Temp2
brne Loop

dec Temp3
brne Loop

dec Temp4
brne Loop

ret

почему она неработает??

Добавлено: Пт апр 27, 2007 12:24:41
Пожиратель AVR
а почему ты написал настройка порта D ба сам написал B?????


;настройка порта D

ldi Temp,0b00001111 ; загрузить в temp число 0Fh
out DDRB,Temp ; загрузить число из temp в регистр
;управления режимом работы выводов порта D

В DDRB должна стоять буква D мы же настраиваем на вывод порт D ?а не B

Добавлено: Пт апр 27, 2007 12:54:42
tych
Ошибочка-закладочка для проверки бдительности и читаемости.

Вижу ты уже "въехал" - я рад :lol:

Добавлено: Пт апр 27, 2007 12:59:11
ARV
Обрати внимание, что ниже команды rjmp Begin программа никогда не пойдет, никаких "поехали по новой" не будет! Поэтому у тебя "вторая часть программы" и не выполняется - rjmp Begin мешает. Убери его - тогда выполнится сначала первая часть, потом вторая :)

Добавлено: Пт апр 27, 2007 13:14:19
tych
Иван.паяльшик, если бы ты заменил БЕСТОЛКОВЫЙ комментарий:

Код: Выделить всё

rjmp Begin ;поехали по новой! 
На имеющий смысл :

Код: Выделить всё

rjmp Begin  ; перейти на метку - Begin 
Наверняка сразу бы понял как будет выполнятся программа.

=====

Пиши комментарии точно описывающие действия программы !

Добавлено: Пт апр 27, 2007 13:42:50
Пожиратель AVR
Я убрал команду rjmp Begin и само begin,begin 2 я тоже убрал но у меня теперь проблема , а суть в том что у меня сначала выполняется первая програма на порте B а потом вторая на порте D Но при выполнении програмы на порте D она её выводит и на порт B почему?
И первая програма больше невыполняется почему вот незадача стоко ошибок .Мож кто поможет для понятия работы портов написать бегуший огонек токо чтобы он работал с портом B,D и на них огонек бежал каждый со своей програмой, а не вместе от одной .
Если кто шас незанет накалякайте прогу чтобы наконец разобраться как все это работает :))

Добавлено: Пт апр 27, 2007 14:09:35
tych
Иван.паяльшик писал(а): почему?
ПАФТАРЯЮ !

Напишите комментарий к каждой строке программы - что она делает.

Теперь двигайтесь по программе - вы увидите как она выполняется.

Либо в симуляторе VMLAB запустите.

Добавлено: Пт апр 27, 2007 16:33:37
Пожиратель AVR
Ну ты интересный я откуда могу знать все команды и как ими пользоваться я занимаюсь програмированием 1 неделю и я еше сам немогу полностью знать как и что выполняется в програме вот я и прошу чтобы ктонить для примера написал прогу как я говорил в преведушем сообшении.

Добавлено: Пт апр 27, 2007 16:42:58
tych
Поэтому я и говорю вам в 3-й раз - Напишите что делает каждая строка программы !

А как иначе вы собираетесь учится ???

Естественно для этого вам нужно прочитать что команды означают.

Советую вам скачать и читать книги - вот библиотека целая для скачивания: http://www.roboforum.ru/viewtopic.htm?p=28601

Добавлено: Пт апр 27, 2007 16:44:04
tych
Например:

Баранов В.Н.
Применение микроконтроллеров AVR: схемы, алгоритмы, программы.

Гребнев В.В.
Микроконтроллеры семейства AVR фирмы ATMEL.

А.В. Евстифеев.
Микроконтроллеры AVR семейств Tiny и Mega фирмы Atmel

Добавлено: Пт апр 27, 2007 16:52:51
Пожиратель AVR
Ну может всетаки ктонить напишит для премера програму :)) :)) :)) :))

Добавлено: Пт апр 27, 2007 17:00:29
tych
Дак программ - примеров МОРЕ ! И в тех книгах и в апноутах и в интернете и в обучалке. Выбирай любую.

Добавлено: Сб апр 28, 2007 08:11:37
Пожиратель AVR
Примера видно я недождусь :cry: