Пытаюсь разобраться в программированиии, нужна помощь. Нарисовал блок схему обычной логики, как такое реализовать на attiny2313? А если еще и коментарии будут написаны, то буду просто безмерно презнателен.
Вообще интересует реализация обычной логики на avr.
Да, что то пояснений не дал. Все, что за пределами квадрата (или че там, прямоугольник получился) это реальные ноги. соответсвенно слева входы, справа выход... Квадрат это сам avr...
qmix писал(а):Вообще интересует реализация обычной логики на avr.
На плисине было бы, конечно, проще... Но и так можно вывернуться. Вся загвоздка в том, что АВР заточен под работу с регистрами, т.е. входные биты надо будет растаскивать по разным регистрам, сдвигать их в один и тот же бит, а потом уже попарно делать "И" и "ИЛИ". Короче, ничего сложного... но долго (на взгляд, уйдёт больше 10 тактов). Если очень припрёт, могу додумать.
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
Да, что то пояснений не дал. Все, что за пределами квадрата (или че там, прямоугольник получился) это реальные ноги. соответсвенно слева входы, справа выход... Квадрат это сам avr...
Ну тогда, как правильно заметил Gudd-Head, нужно знать один ли это порт, или разные. А лучше дайте на примере конкретного контроллера (что у вас есть) конкретные ноги.
Смысл прост: читаем входы IO-порта в регистр, делаем битовые операции, выводим результат.
А вообще это действие бессмысленно. Проще поставить обычную логику, а если логическая схема сложна, то использовать ПЛИС, т.к. МК умрёт двигая туда-сюда биты, производительность в итоге будет никакая.
Раньше был знаком с Альтерой MAXplus. (правда только в теории, до физической реализации что то так и не дошло). Вот там красиво в програмке всю логику можно было разрисовать... Я так понимаю с avr мне все так просто не прокатит.
контроллер attiny2313 ноги и порты без разницы какие юзать. мне сам смысл понять хоца...
Что Вы имеете ввиду, когда проедлагаете использовать ПЛИС. опять возвращаться к альтере, или есть другие альтернативы?.
p.s. А вльтере мне не нравится большое количество ног, под малые задачи. да и обвязка там сколько помню побольше.
qmix писал(а):Пытаюсь разобраться в программированиии, нужна помощь. Нарисовал блок схему обычной логики, как такое реализовать на attiny2313? А если еще и коментарии будут написаны, то буду просто безмерно презнателен.
Вообще интересует реализация обычной логики на avr.
... кажется Вы хотите не разобраться, а скорее запутаться Если нужно реализовать лог. уравнение, то зачем применять AVR ??? .
qmix писал(а):Раньше был знаком с Альтерой MAXplus. (правда только в теории, до физической реализации что то так и не дошло).
.. с теорией похоже тоже не разобрались. Возьмите, например, ATF16v8 и WinCupl. Ваша "задача" решается несколькими строками.
ЗЫ. Вообще следует различать, когда "выгодно" применять "рассыпуху" и ПЛМ, а когда МК и не путать одно с другим.
; пусть верхний вход на вашей схеме 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: ; собственно всё
2 ploop - все можно сделать "понятнее" и работать это будет раз в 10 быстрее, если применить ijmp - всего 16 возможных состояний (правда места в Flash займет побольше )
Таблицей что-ли?
Да суть не в этом, для реальной задачи всё можно упростить. К примеру использовать еще один регистр - уберутся условные переходы при инвертировании битов, ну и т.д. Это просто пример, как коряво "в лоб" имитируется логика.
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 раз.
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
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
...
... хотя таблицы явно не задано, этот метод можно назвать табличным переходом.
Недостаток перед "чистой" таблицей - больше размер и меньше скорость, поэтому применим, там где нужна бОльшая "гибкость"