Вопрос: Разработать схему подключения к микроконтроллеру К1816ВЕ51 восьмиразрядного ЦАП. Написать программу, обеспечивающую формирование на выходе ЦАП сигнала, соответствующего 32-элементному массиву из RAM. Рассчитать быстродействие канала вывода. Исходник: array: DS 32 /* резервирование 32 байт ОЗУ */ org 70h adc: PUSH ACC /* сохранение контекста */ PUSH R0 PUSH R1 mov R0, 31 /* относительный адрес последней ячейки массива ОЗУ */ mov R1, 0 /* относительный адрес текущей ячейки массива ОЗУ */ setb P0.6 /* разрешаем работу ЦАП */ start: setb P0.7 /* формируем фронт тактирующего импульса */ clr P0.7 /* формируемсрез тактирующего импульса */ out P2, A /* считываем результат преобразования из 2 порта */ mov DPTR, @array /* записываем результат в ОЗУ */ add DPTR, Rl mov @DPTR, A inc Rl /* увеличиваем на единицу адрес ячейки */ /* сравниваем текущий адрес с адресом последней ячейки */ /* если не равны, то пойторяем процедуру преобразования */ cjne Rl, RO,start clrb PO.6 /* запрещаем работу ЦАП */ pop R1 /* восстанавливаем контекст */ pop R0 pop ACC ret /* возврат из подпрограмм */ помогите найти ошибки и исправить их.
я не спец в мк, но не пойму: если у тебя ЦАП и шаблон в ОЗУ - то какие именно результаты преобразования ты пытаешься считать в память? выдаешь в цикле байт за байтом в порт, к которому подключен ЦАП - и все. другое дело - откуда берется эта 32-байтная последовательность в ОЗУ, но об этом в вопросе речи нет. затем считаешь, за сколько тактов выполняются все команды одного цикла, умножаешь на 32 - это время вывода 32-элементного периода, т.е. мне непонятно, что имеется в виду "быстродействие канала", но танцевать нужно отсюда.
я не помню такой инструкции. тоже нет такого. Формат такой: CJNE A,#data,Roff CJNE A,Daddr,Roff CJNE @Ri,#data,Roff CJNE Rn,#data,Roff тут просто clr P0.6 , а тут movх @DPTR, A, но это внешняя память. Много ошибок, код ничего не делает. Посмотри синтаксис. Зайди на сайт kntu-tk.narod.ru, там есть дополнение к RadAsm. Там же найдешь описание команд.
плиз. Напишите хоть от чего плясать. Я сам вроде не дурак, но времени совсем нет разбираться. пару первых строк программы, а дальше дотумкаю. array: DS 32 ; резервирование 32 байт ОЗУ org 70h adc: PUSH ACC ; сохранение контекста PUSH R0 PUSH R1 mov R0, 31 ; относительный адрес последней ячейки массива ОЗУ mov R1, 0 ; относительный адрес текущей ячейки массива ОЗУ setb P0.6 ; разрешаем работу ЦАП start: setb P0.7 ; формируем фронт тактирующего импульса clr P0.7 ; формируемсрез тактирующего импульса out P2, A ; считываем результат преобразования из 2 порта mov DPTR, @array ; записываем результат в ОЗУ add DPTR, Rl mov @DPTR, A inc Rl ; увеличиваем на единицу адрес ячейки ; сравниваем текущий адрес с адресом последней ячейки ; если не равны, то пойторяем процедуру преобразования cjne R1,RO,start clr PO.6 ; запрещаем работу ЦАП pop R1 ; восстанавливаем контекст pop R0 pop ACC ret ; возврат из подпрограмм END
1.понять, что такое ЦАП. насколько я шарю в электронике, ЦАП - это набор резисторов и ключей - в зависимости от кода на входе подключается разная комбинация резисторов, которая делит опорное напряжение. т.е. не нужно разрешать или запрещать его работу или тактировать его - это ты путаешь с АЦП последовательного приближения. (конечно же, я могу ошибаться) 2.посмотреть описание микроконтроллера, вникнув в архитектуру, внимательно и по нескольку раз читая описание каждой используемой команды
Код (Text): ; ««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««« ;<Начало таблицы векторов прерывания CSEG ORG 000h jmp Int_Reset ORG 003h jmp INT_EXT0 ORG 00Bh jmp INT_TIMER0 ORG 013h jmp INT_EXT1 ORG 01Bh jmp INT_TIMER1 ORG 023h jmp INT_UART ;>Конец таблицы векторов прерывания ; ««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««« ; ««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««« Int_Reset: ;Инициализация контроллера MainLoop: ;Код основной программы ;... call DAC jmp MainLoop ; ««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««« ;Подпрограммы обработки прерываний INT_EXT0: push PSW push ACC ;Код обработчика внешнего прерывания INT0 pop ACC pop PSW reti INT_TIMER0: push PSW push ACC ;Код обработчика прерывания от Счетчика/Таймера 0 pop ACC pop PSW reti INT_EXT1: push PSW push ACC ;Код обработчика внешнего прерывания INT1 pop ACC pop PSW reti INT_TIMER1: push PSW push ACC ;Код обработчика прерывания от Счетчика/Таймера 1 pop ACC pop PSW reti INT_UART: ;Код обработчика прерывания от UART push PSW push ACC jbc TI,TransmitOK jbc RI,ReceiveOK ReceiveOK: ;Прием байта завершен pop ACC pop PSW reti TransmitOK: ;Передача байта завершена pop ACC pop PSW reti ; ««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««« DAC: ; Имя подпрограммы DAC push ACC ;сохранение контекста push 0 ;PUSH R0 - такого нет push 1 ;PUSH R1 - такого нет mov R0, 30 ; Абсолютный адрес первой ячейки массива в ОЗУ mov R1, 32 ; количество ячеек (размер массива) setb P0.6 ; разрешаем работу ЦАП loop: mov A, @R0 ; читаем данные из ОЗУ, адрес в R0 setb P0.7 ; формируем фронт тактирующего импульса mov P2, A ; Отправляем данные полученые из ОЗУ на порт 2. ; ??? вот только непонятно откуда они берутся в ОЗУ ??? clr P0.7 ; формируем срез тактирующего импульса inc R0 ; увеличение адреса на 1 djnz R1,loop ;DJNZ Decrement Operand and Jump Relative if Not Zero clr P0.6 ; запрещаем работу ЦАП pop 1 ;pop R1 - такого нет ; восстанавливаем контекст pop 0 ;pop R0 - такого нет pop ACC ret ; возврат из подпрограмм END
благодарю. Ещё если не затруднит, объясните что происходит в это время: ;<Начало таблицы векторов прерывания CSEG ORG 000h jmp Int_Reset ORG 003h jmp INT_EXT0 ORG 00Bh jmp INT_TIMER0 ORG 013h jmp INT_EXT1 ORG 01Bh jmp INT_TIMER1 ORG 023h jmp INT_UART ;>Конец таблицы векторов прерывания