Ассемблер (ASM) для AVR в вопросах и ответах

Обсуждаем контроллеры компании Atmel.
Аватара пользователя
Roman Venom
Сверлит текстолит когтями
Сообщения: 1135
Зарегистрирован: Сб июл 11, 2009 18:42:21
Откуда: Украина, г.Николаев

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Сообщение Roman Venom »

вопрос по приёму 2-х байтного числа(мега 16, РС485). Приём одного байта происходит нормально. Двух - нет, принимается только один :(

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

USART_RXC:

cbi PORTC, PC7; вкл. приём
nop
nop

in work2,UDR;cчитываем какой-то байт
nop
nop

sbrs work,7; в 1-м байте седьмой бит всегда=1
   rjmp byte_2;запомнить байт№2
   rjmp byte_1;запомнить байт№1

[b]byte_1:[/b]
mov work2,work
   ;rjmp byte_2
   rjmp exit_RXC
[b]
byte_2:[/b]
mov work1,work
ldi YH,0x2
ldi r28,BLDC_cnt
st Y+, work1
   rjmp exit_RXC
[b]exit_RXC:[/b]
sbi PORTC, PC7
nop
nop
reti
Успех - императив!
Аватара пользователя
qmix
Родился
Сообщения: 16
Зарегистрирован: Ср фев 16, 2011 09:01:31
Откуда: Туапсе

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Сообщение qmix »

Пытаюсь разобраться в программированиии, нужна помощь. Нарисовал блок схему обычной логики, как такое реализовать на attiny2313? А если еще и коментарии будут написаны, то буду просто безмерно презнателен.
Вообще интересует реализация обычной логики на avr.
Вложения
log.jpg
(21.67 КБ) 445 скачиваний
matrix has you/
Аватара пользователя
ploop
Модератор
Сообщения: 13490
Зарегистрирован: Ср ноя 26, 2008 16:34:25
Откуда: Тамбовская обл.

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Сообщение ploop »

А теперь поясните, что под этой схемой вы имели ввиду? Это реальные входы/выходы микросхемы или операции над битами?
Аватара пользователя
qmix
Родился
Сообщения: 16
Зарегистрирован: Ср фев 16, 2011 09:01:31
Откуда: Туапсе

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Сообщение qmix »

Да, что то пояснений не дал. Все, что за пределами квадрата (или че там, прямоугольник получился) это реальные ноги. соответсвенно слева входы, справа выход... Квадрат это сам avr...
matrix has you/
Аватара пользователя
Gudd-Head
Друг Кота
Сообщения: 20092
Зарегистрирован: Чт сен 18, 2008 12:27:21
Откуда: Столица Мира Санкт-Петербург

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Сообщение Gudd-Head »

qmix писал(а):Вообще интересует реализация обычной логики на avr.

На плисине было бы, конечно, проще... Но и так можно вывернуться. Вся загвоздка в том, что АВР заточен под работу с регистрами, т.е. входные биты надо будет растаскивать по разным регистрам, сдвигать их в один и тот же бит, а потом уже попарно делать "И" и "ИЛИ". Короче, ничего сложного... но долго (на взгляд, уйдёт больше 10 тактов). Если очень припрёт, могу додумать.
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
Аватара пользователя
ploop
Модератор
Сообщения: 13490
Зарегистрирован: Ср ноя 26, 2008 16:34:25
Откуда: Тамбовская обл.

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Сообщение ploop »

Да, что то пояснений не дал. Все, что за пределами квадрата (или че там, прямоугольник получился) это реальные ноги. соответсвенно слева входы, справа выход... Квадрат это сам avr...

Ну тогда, как правильно заметил Gudd-Head, нужно знать один ли это порт, или разные. А лучше дайте на примере конкретного контроллера (что у вас есть) конкретные ноги.
Смысл прост: читаем входы IO-порта в регистр, делаем битовые операции, выводим результат.

А вообще это действие бессмысленно. Проще поставить обычную логику, а если логическая схема сложна, то использовать ПЛИС, т.к. МК умрёт двигая туда-сюда биты, производительность в итоге будет никакая.
Аватара пользователя
qmix
Родился
Сообщения: 16
Зарегистрирован: Ср фев 16, 2011 09:01:31
Откуда: Туапсе

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Сообщение qmix »

Раньше был знаком с Альтерой MAXplus. (правда только в теории, до физической реализации что то так и не дошло). Вот там красиво в програмке всю логику можно было разрисовать... Я так понимаю с avr мне все так просто не прокатит.
контроллер attiny2313 ноги и порты без разницы какие юзать. мне сам смысл понять хоца...
Что Вы имеете ввиду, когда проедлагаете использовать ПЛИС. опять возвращаться к альтере, или есть другие альтернативы?.
p.s. А вльтере мне не нравится большое количество ног, под малые задачи. да и обвязка там сколько помню побольше.
matrix has you/
Аватара пользователя
ploop
Модератор
Сообщения: 13490
Зарегистрирован: Ср ноя 26, 2008 16:34:25
Откуда: Тамбовская обл.

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Сообщение ploop »

Что Вы имеете ввиду, когда проедлагаете использовать ПЛИС

Я имею ввиду реальный проект. Если вам только для обучения - ща набросаю пример для 2313.
Аватара пользователя
ChipKiller
Сверлит текстолит когтями
Сообщения: 1163
Зарегистрирован: Ср янв 05, 2011 16:25:15

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Сообщение ChipKiller »

qmix писал(а):Пытаюсь разобраться в программированиии, нужна помощь. Нарисовал блок схему обычной логики, как такое реализовать на attiny2313? А если еще и коментарии будут написаны, то буду просто безмерно презнателен.
Вообще интересует реализация обычной логики на avr.
... кажется Вы хотите не разобраться, а скорее запутаться :) Если нужно реализовать лог. уравнение, то зачем применять AVR ??? .
qmix писал(а):Раньше был знаком с Альтерой MAXplus. (правда только в теории, до физической реализации что то так и не дошло).
.. с теорией похоже тоже не разобрались. Возьмите, например, ATF16v8 и WinCupl. Ваша "задача" решается несколькими строками.

ЗЫ. Вообще следует различать, когда "выгодно" применять "рассыпуху" и ПЛМ, а когда МК и не путать одно с другим.
Аватара пользователя
ploop
Модератор
Сообщения: 13490
Зарегистрирован: Ср ноя 26, 2008 16:34:25
Откуда: Тамбовская обл.

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Сообщение ploop »

Вот, как и обещал, как это выглядит. Хорошо хоть внутри одного регистра, иначе без поллитры... ну вы поняли :)

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

; пусть верхний вход на вашей схеме PB0 (12 нога)
; нижний - PB3 (15 нога)
; выход - PD6 (11 нога)
; пусть порты уже сконфигурированы

in R16,PinB             ; читаем содержимое порта B
; сразу проверим третий бит. Если он в 1 остальные действия не нужны
sbrc R16,3
rjmp exit1


; инвертируем бит 1 и бит 2
sbrc R16,1              ; проверяем бит 1
rjmp l0                 ; если он в "1" переходим на метку l0
ori R16, 0b00000010     ; иначе ставим его в "1"
rjmp l1                 
l0:                     ; сбросим бит 1
andi R16,0b11111101
l1:
; теперь то же самое с битом 2
sbrc R16,2              ; проверяем бит 2
rjmp l2                 ; если он в "1" переходим на метку l2
ori R16, 0b00000100     ; иначе ставим его в "1"
rjmp l3                 
l2:                     ; сбросим бит 2
andi R16,0b11111011
l3:
; теперь отсечём всё ненужное из R16
com R16                 ; инвертируем
andi R16, 0b00000111
brne exit0              ; если не 0, значит на выход 0
; иначе на выход 1
exit1:
sbi PortD,6             ; ставим на выход 1
rjmp exit
exit0:
cbi PortD,6             ; ставим на выход 0
exit:                   ; собственно всё
Аватара пользователя
ChipKiller
Сверлит текстолит когтями
Сообщения: 1163
Зарегистрирован: Ср янв 05, 2011 16:25:15

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Сообщение ChipKiller »

2 ploop - все можно сделать "понятнее" и работать это будет раз в 10 быстрее, если применить ijmp - всего 16 возможных состояний (правда места в Flash займет побольше :) )
Аватара пользователя
ploop
Модератор
Сообщения: 13490
Зарегистрирован: Ср ноя 26, 2008 16:34:25
Откуда: Тамбовская обл.

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Сообщение ploop »

Таблицей что-ли?
Да суть не в этом, для реальной задачи всё можно упростить. К примеру использовать еще один регистр - уберутся условные переходы при инвертировании битов, ну и т.д. Это просто пример, как коряво "в лоб" имитируется логика.
Аватара пользователя
Gudd-Head
Друг Кота
Сообщения: 20092
Зарегистрирован: Чт сен 18, 2008 12:27:21
Откуда: Столица Мира Санкт-Петербург

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Сообщение Gudd-Head »

ploop писал(а):Вот, как и обещал, как это выглядит. Хорошо хоть внутри одного регистра, иначе без поллитры...

Пипееец. Вот мой пример с вашими исходными:

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

in R16,PinB             ; читаем содержимое порта B
ldi r17, 0b00000110; а можно в отдельном регистре держать 0b00000110, тогда не надо будет каждый раз записывать
eor r16, r17;           проинвертировали биты 2 и 3 (они же 1 и 2)
mov r17, r16;         скопировали
lsr r17;                   сдвинули р17 вправо
and r16, r17;           первое И
lsr r17;                   снова вправо
and r16, r17;          второе И
lsr r17;                   снова вправо
or r16, r17;             ИЛИ
andi r16, 0b00000001; обнуляем все биты, кроме нулевого. В нём - результат.

Хотя таблицей, согласен, будет быстрее (и, возможно, проще) :)
Последний раз редактировалось Gudd-Head Ср фев 16, 2011 12:55:32, всего редактировалось 1 раз.
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
Аватара пользователя
ChipKiller
Сверлит текстолит когтями
Сообщения: 1163
Зарегистрирован: Ср янв 05, 2011 16:25:15

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Сообщение ChipKiller »

ploop писал(а):Таблицей что-ли?
.. таблицы не требуется
Это просто пример, как коряво "в лоб" имитируется логика.
.. в "лоб" можно и не коряво :)
Аватара пользователя
ploop
Модератор
Сообщения: 13490
Зарегистрирован: Ср ноя 26, 2008 16:34:25
Откуда: Тамбовская обл.

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Сообщение ploop »

Давайте свой пример, посмотрим :)
Аватара пользователя
ChipKiller
Сверлит текстолит когтями
Сообщения: 1163
Зарегистрирован: Ср янв 05, 2011 16:25:15

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Сообщение ChipKiller »

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

   in r16,PinB    ; в r16 номер функции
   lsl,r16         ; размер функции = 2 ( ldi + ret )
;
   ldi ZH,high(function)
   ldi ZL,low(function)
   add   ZL,r16
   clr   r16
   adc   ZH,r16 ; адрес функции = function + r16*(function size)
   ijmp
function:
; case 0000
   ldi r16,...
   ret
; case 0001
   ldi r16,...
   ret
; case 0010   
   ...

... хотя таблицы явно не задано, этот метод можно назвать табличным переходом.
Недостаток перед "чистой" таблицей - больше размер и меньше скорость, поэтому применим, там где нужна бОльшая "гибкость"
Аватара пользователя
ploop
Модератор
Сообщения: 13490
Зарегистрирован: Ср ноя 26, 2008 16:34:25
Откуда: Тамбовская обл.

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Сообщение ploop »

Ну так примерно это я и имел ввиду под таблицей.

Но для ответа этот вариант не подходит. Достаточно сделать 8 входов и/или несколько выходов как с ней сядешь, а человек спрашивал общее решение.
Аватара пользователя
ploop
Модератор
Сообщения: 13490
Зарегистрирован: Ср ноя 26, 2008 16:34:25
Откуда: Тамбовская обл.

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Сообщение ploop »

ChipKiller, и в вашем коде icall нужен, а не ijmp.
Аватара пользователя
ChipKiller
Сверлит текстолит когтями
Сообщения: 1163
Зарегистрирован: Ср янв 05, 2011 16:25:15

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Сообщение ChipKiller »

ploop писал(а):Достаточно сделать 8 входов
... тогда простая таблица на 256 значений
ploop писал(а):ChipKiller, и в вашем коде icall нужен, а не ijmp.
... это просто пример, хотя если Вы хорошо владеете ассемблером, то наверняка знаете, как вместо ijmp можно применить icall и наоборот .... :)
Аватара пользователя
Gudd-Head
Друг Кота
Сообщения: 20092
Зарегистрирован: Чт сен 18, 2008 12:27:21
Откуда: Столица Мира Санкт-Петербург

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Сообщение Gudd-Head »

ploop писал(а):человек спрашивал общее решение.

На предыдущей странице я накропал общее решение. Без вывода можно уложиться в 10 тактов.
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
Ответить

Вернуться в «AVR»