Схема подключения к микроконтроллеру К1816ВЕ51

Тема в разделе "WASM.ASSEMBLER", создана пользователем lubitel, 29 сен 2008.

  1. lubitel

    lubitel New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2008
    Сообщения:
    4
    Вопрос:
    Разработать схему подключения к микроконтроллеру К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 /* возврат из подпрограмм */

    помогите найти ошибки и исправить их. :dntknw:
     
  2. shoo

    shoo New Member

    Публикаций:
    0
    Регистрация:
    17 июл 2003
    Сообщения:
    1.537
    Адрес:
    Ukraine
    я не спец в мк, но не пойму: если у тебя ЦАП и шаблон в ОЗУ - то какие именно результаты преобразования ты пытаешься считать в память? выдаешь в цикле байт за байтом в порт, к которому подключен ЦАП - и все. другое дело - откуда берется эта 32-байтная последовательность в ОЗУ, но об этом в вопросе речи нет.

    затем считаешь, за сколько тактов выполняются все команды одного цикла, умножаешь на 32 - это время вывода 32-элементного периода, т.е. мне непонятно, что имеется в виду "быстродействие канала", но танцевать нужно отсюда.
     
  3. S_Alex

    S_Alex Alex

    Публикаций:
    0
    Регистрация:
    27 авг 2004
    Сообщения:
    561
    Адрес:
    Ukraine
    я не помню такой инструкции.

    тоже нет такого.
    Формат такой:
    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. Там же найдешь описание команд.
     
  4. lubitel

    lubitel New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2008
    Сообщения:
    4
    плиз. Напишите хоть от чего плясать. Я сам вроде не дурак, но времени совсем нет разбираться.
    пару первых строк программы, а дальше дотумкаю.

    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
     
  5. shoo

    shoo New Member

    Публикаций:
    0
    Регистрация:
    17 июл 2003
    Сообщения:
    1.537
    Адрес:
    Ukraine
    1.понять, что такое ЦАП. насколько я шарю в электронике, ЦАП - это набор резисторов и ключей - в зависимости от кода на входе подключается разная комбинация резисторов, которая делит опорное напряжение. т.е. не нужно разрешать или запрещать его работу или тактировать его - это ты путаешь с АЦП последовательного приближения. (конечно же, я могу ошибаться)

    2.посмотреть описание микроконтроллера, вникнув в архитектуру, внимательно и по нескольку раз читая описание каждой используемой команды
     
  6. S_Alex

    S_Alex Alex

    Публикаций:
    0
    Регистрация:
    27 авг 2004
    Сообщения:
    561
    Адрес:
    Ukraine
    Код (Text):
    1. ; «««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««
    2. ;<Начало таблицы векторов прерывания
    3. CSEG
    4. ORG     000h
    5.     jmp     Int_Reset
    6. ORG     003h
    7.     jmp     INT_EXT0
    8. ORG     00Bh
    9.     jmp     INT_TIMER0
    10. ORG     013h
    11.     jmp     INT_EXT1
    12. ORG     01Bh
    13.     jmp     INT_TIMER1
    14. ORG     023h
    15.     jmp     INT_UART
    16. ;>Конец таблицы векторов прерывания    
    17. ; «««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««
    18.  
    19. ; «««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««
    20. Int_Reset:
    21.     ;Инициализация контроллера
    22.    
    23. MainLoop:
    24. ;Код основной программы
    25. ;...
    26.     call    DAC
    27.     jmp MainLoop
    28. ; «««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««
    29. ;Подпрограммы обработки прерываний
    30. INT_EXT0:
    31.     push    PSW
    32.     push    ACC
    33. ;Код обработчика внешнего прерывания INT0
    34.     pop     ACC
    35.     pop     PSW
    36.     reti
    37. INT_TIMER0:
    38.     push    PSW
    39.     push    ACC
    40. ;Код обработчика прерывания от Счетчика/Таймера 0
    41.     pop     ACC
    42.     pop     PSW
    43.     reti   
    44. INT_EXT1:
    45.     push    PSW
    46.     push    ACC
    47. ;Код обработчика внешнего прерывания INT1
    48.     pop     ACC
    49.     pop     PSW
    50.     reti   
    51. INT_TIMER1:
    52.     push    PSW
    53.     push    ACC
    54. ;Код обработчика прерывания от Счетчика/Таймера 1
    55.     pop     ACC
    56.     pop     PSW
    57.     reti
    58. INT_UART:
    59. ;Код обработчика прерывания от UART
    60.     push    PSW
    61.     push    ACC
    62.     jbc     TI,TransmitOK
    63.     jbc     RI,ReceiveOK
    64. ReceiveOK:
    65. ;Прием байта завершен
    66.     pop     ACC
    67.     pop     PSW
    68.     reti
    69. TransmitOK:
    70. ;Передача байта завершена
    71.     pop     ACC
    72.     pop     PSW
    73.     reti
    74. ; «««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««
    75. DAC:
    76.     ;   Имя подпрограммы DAC
    77.     push    ACC ;сохранение контекста
    78.     push    0   ;PUSH   R0 - такого нет
    79.     push    1   ;PUSH   R1 - такого нет
    80.        
    81.     mov     R0,     30  ; Абсолютный адрес первой ячейки массива в ОЗУ
    82.     mov     R1,     32  ; количество ячеек (размер массива)
    83.     setb    P0.6        ; разрешаем работу ЦАП
    84.    
    85. loop:
    86.     mov     A,      @R0 ; читаем данные из ОЗУ, адрес в R0
    87.     setb    P0.7        ; формируем фронт тактирующего импульса
    88.     mov     P2,     A   ; Отправляем данные полученые из ОЗУ на порт 2.
    89.                         ; ??? вот только непонятно откуда они берутся в ОЗУ ???
    90.     clr     P0.7        ; формируем срез тактирующего импульса
    91.     inc     R0          ; увеличение адреса на 1
    92.     djnz    R1,loop
    93.     ;DJNZ Decrement Operand and Jump Relative if Not Zero
    94.     clr     P0.6                ; запрещаем работу ЦАП
    95.  
    96.     pop     1   ;pop    R1 - такого нет    ; восстанавливаем контекст
    97.     pop     0   ;pop    R0 - такого нет
    98.     pop     ACC
    99.     ret         ; возврат из подпрограмм
    100.  
    101. END
     
  7. lubitel

    lubitel New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2008
    Сообщения:
    4
    благодарю.
    Ещё если не затруднит, объясните что происходит в это время:

    ;<Начало таблицы векторов прерывания
    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
    ;>Конец таблицы векторов прерывания
     
  8. S_Alex

    S_Alex Alex

    Публикаций:
    0
    Регистрация:
    27 авг 2004
    Сообщения:
    561
    Адрес:
    Ukraine
    Стандартная таблица векторов прерывания. Читай доки.
     
  9. S_Alex

    S_Alex Alex

    Публикаций:
    0
    Регистрация:
    27 авг 2004
    Сообщения:
    561
    Адрес:
    Ukraine
    MCS-51 Microcontroller Family Macro Assembler
    U S E R ' S M A N U A L
    Version 1.3
     
  10. lubitel

    lubitel New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2008
    Сообщения:
    4
    огромное спасибо. Надеюсь не ударю в грязь лицом перед преподом.