Перейти к содержанию
    

Программа для микроконтроллера

Как использовать команду MOVX если адрес и данные на разных портах?
Вы используете C8051F020. Это какой-то клон 8051 (к сожалению, с C8051F020 я не знаком). В классическом 8051 по команде MOVX МК аппаратно формирует некую, описанную в DS, последовательность сигналов адреса (на Р0, Р2), данных (на Р0), сигналов ALE, RD, WR. Скорее всего (уточните в DS) и применённый Вами МК так (и только так!) выполняет команду MOVX. Что делать, если нужно использовать другие порты? В этом случае сигналы прийдется формировать программным способом (с помощью команд, отличных от MOVX, выводить на нужные порты необходимые сигналы в нужной последовательности и с соблюдением необходимых временных интервалов).

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1. Подскажите почему код выполняет одинаковую временную задержку на частотах микроконтроллера 11 и 22 МГц. Моделирую в Keil uVision.

        DELL_1MS:
        
        MOV     TMP_CNT,#250
        DJNZ    TMP_CNT,$
        MOV     TMP_CNT,#250
        DJNZ    TMP_CNT,$
        RET
        ORG     8000
        JMP     START_PROG

 

2. Эта часть кода, когда нибуть выполняется? Перед ней ведь стоит команда RET.

 

ORG     8000
JMP     START_PROG

Изменено пользователем Aleksandr_KPI

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Эта часть кода, когда нибуть выполняется? Перед ней ведь стоит команда RET.

 

ORG     8000
JMP     START_PROG

директива ORG сообщает компилятору, что следующие инструкции он должен размещать с указанного адреса, в данном случае - с 8000

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

2. Эта часть кода, когда нибуть выполняется? Перед ней ведь стоит команда RET.

Я думаю, программист пытался "подстраховаться", если программный счетчик скакнет куда-нибудь, куда его "не просили", и тогда доберется до перехода на старт. Сомнительная польза...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Подскажите почему компилятор не видит некоторые регистры специальных функций: EMI0CF, XBR, P1MDOUT. В то же время нормально воспринимает TH, TL, TCON... При компиляции выдает ошибку UNDEFINE SIMBOL. А вот если обратится к регистру по адресу то все нормально работает, только потом читать код трудно становится. В среде Keil uVision четко выбираю свой микроконтроллер (Silicon Laboretories C8051F020) да и переферия правильно отображается.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Подскажите почему компилятор не видит некоторые регистры специальных функций
Наверное, потому, что нет

#include <cygnal\c8051F020.h>

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А как быть если программа на ассемблере?
И для ассемблера есть директива $INCLUDE (файл.ink). Подходящий подключаемый файл найдите в Keil\C51\ASM

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Спасибо все нашел, только в случае с keil uVision нужно еще перед дерективой $INCLUDE прописать $nomod51, которая отключит регистры объявленные по умолчанию. Если этого не сделать будет конфликт с вновь объявляемыми.

 

1.Подскажите, в чем разница между режимами Open-Drain и Push-Pull. Читал http://www.proz.com/kudoz/english_to_russi...ll.html#1000368, мало что понятно, а больше не нашел. Я так понял это два варианта настройки портов МК в выходном режиме.

 

2. Прочитал такую вещь

 

Обычные команды чтения порта (например, MOV A,P2) реализуют ввод информации только с внешних выводов порта. В соответствующие регистры-фиксаторы при этом предварительно должны быть записаны "1", чем обеспечивается настройка линий порта на ввод.

 

Где находится регистры-фиксаторы порта и как к ним обратится. Нужно смотреть в сторону регистра специальных функций или я не прав?

Изменено пользователем Aleksandr_KPI

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

нужно еще перед дерективой $INCLUDE прописать $nomod51
Или в опциях проекта (Options -> A51) убрать галку "Define 8051 SFR Names"

 

Ваши вопросы, как я понял, касаются ввода-вывода в/из параллельные порты МК51? "На пальцах" это, примерно, так:

Вывод. Выводимое значение помещается в регистр. Ноль в соответствующем разряде открывает ключ, соединяющий "ногу" МК с "землёй": на ноге - низкий уровень. Единица - запирает ключ ("отрывает" от земли), но нога соединена (внутри МК, конечно) через резистор с большим сопротивлением (pullup, подтягивающий резистор) к источнику питания, который в отсутствии "притягивания" извне ноги к земле и большого сопротивления внешней нагрузки на ноге, создаёт на ноге высокий уровень.

Ввод. Информация "снимается" непосредственно с ноги МК. Нолик читается если мы вывели на ногу низкий уровень (выдали 0; открыли ключ, соединяющий ногу с землёй) или низкий уровень "навалился" на ногу с выхода другой м/с, соединенном с ногой МК. В противном случае - читается единица (т.е. ноль как-бы "приоритетнее"). Поэтому в МК51 для чтения с портов (Р0, Р1 и т.д.) нужно выдать в порт единицы (или не выводить ничего - после сброса там и так единицы).

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Или в опциях проекта (Options -> A51) убрать галку "Define 8051 SFR Names"

 

Тоже верно :) .

 

 

В принципе что касается ввода-вывода понятно, а как быть с Open-Drain и Push-Pull. В даташите на контролер написано

The output mode of port pin can be configured as either Open-Drain or Push-Pull;

 

Существует регистр к примеру P1MDOUT для порта Р1, который настраивает его в режим Open-Drain или Push-Pull, а в чем разница между ними?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Open-Drain или Push-Pull, а в чем разница между ними?
То, что я описал выше - реализовано в классическом 8051 - это Open Drain. В Push-Pull: два ключа - один соединяет ногу с землей, другой - с питанием; открыт всегда один из них в зависимости от выданного значения.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В Push-Pull: два ключа - один соединяет ногу с землей, другой - с питанием; открыт всегда один из них в зависимости от выданного значения.

Не совсем понял разницу, зачем вводить два ключа,что это дает?

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...