Полная версия этой страницы:
как прочесть порт
schulgin
May 12 2012, 16:00
Отлаживаю в Кейле с помощью симулятора программу.
Цифровые выходы обозначил битовыми пременными например так "sbit rabota = P2^0;" Всё хорохо, когда пишу в порт, но когда пытаюсь использовать этот идентификатор в какой ни буть операции, например, "if (rabota)" или просто его присвоить другой переменной ничего не получается. Компилируется без ошибок, а операции или присвоения не выполняются. Пытался это сделать с помощью маскировки порта, например "P2 & 0x01" та же самая история по отдельности все значения просматриваются, а результат другой.
Промучился почти целый день, а результат ноль. Уж очень достало, помогите!!!
Цитата(schulgin @ May 12 2012, 20:00)

...а операции или присвоения не выполняются.
Как Вы это определяете? Приведите хотя бы кусок текста программы где это не работает.
schulgin
May 14 2012, 08:35
Спасибо за отклик. Немного лирики. Кейлом и написанием программ на С за всю жизнь пользовался чисто эпизодически раза три с интервалом ~ 5 лет, не вдаваясь в тонкости и оптимизацию - лишь-бы работало, каждый раз думая, что больше к этому не вернусь. Но, вот, жизнь опять заставила этим заняться. Прикрепил архив проекта. Сейчас проект отлаживаю в отладчике, хотя железо есть, а адаптер подвезут только на следующих выходных.
Сначала создал конструкцию, отображённую в строках 164, 165 и на этом заткнулся. Затем попробовал конструкцию, отображённую в строках 166, 167 - тот-же самый результат. Пришлось ввести новые переменные d0 ... (строка 122) и в дальнейшем использовать их. Как оказалось это было и хорошо, поскольку, как выяснилось в последствии, индикаторами надо было управлять и по другим законам. Основной цикл только что написал и не отлаживал. Посмотрел только, как ведёт себя переменная "pusk" (строка 68). Тот же самый удручающий результат - if (pusk) не хочет работать.
Ещё полностью не разобрался как правильно пользоваться логическими операциями, например &, &&, но это при отладке можно будет причесать.
До кучи. Использую таймер0. По моим подсчётам он должен выдавать прерывание с частотой 1,9 Гц (6мГц/48/2^16). А Silab овский конфигуратор показывает 162 Гц. Решил пока на этом не зацикливаться, но если кто знает, ответе.
Меня смущает эта строчка
pusk = 0;
фактически вы подключили порт к земле....
schulgin
May 14 2012, 09:40
Цитата(Kolia @ May 14 2012, 12:09)

Меня смущает эта строчка
pusk = 0;
фактически вы подключили порт к земле....
"pusk = 0;" закоментировал, результат не изменился, но задался вопросом:"Если я хочу поуправлять состоянием входа, то в окошке Parallel Port отладчика должен пользоваться строкой Pins:, а не P0:?"
Цитата(schulgin @ May 14 2012, 12:40)

"pusk = 0;" закоментировал, результат не изменился, но задался вопросом:"Если я хочу поуправлять состоянием входа, то в окошке Parallel Port отладчика должен пользоваться строкой Pins:, а не P0:?"
ну по идее да, P0 это регист микроконтроллера
вам нужно вот это ....
http://onembedding.bialix.com/tools/keil/a...s/key_simul.htm
schulgin
May 14 2012, 10:44
Большое спасибо Бельченко. Собственно, прочитав его статьи, я и смог программировать эти микроконтроллеры. Указанная статья мне ещё пригодиться, но в примере нет того, как прочитать вход. Сдаётся мне, что я не знаю какой-то тривиальщины. Всё же, почему в моей программе строка 68 не работает?
Цитата(schulgin @ May 14 2012, 13:44)

Большое спасибо Бельченко. Собственно, прочитав его статьи, я и смог программировать эти микроконтроллеры. Указанная статья мне ещё пригодиться, но в примере нет того, как прочитать вход. Сдаётся мне, что я не знаю какой-то тривиальщины. Всё же, почему в моей программе строка 68 не работает?
Вход читается непосредсвенно в программе, можно и логический анализатор использовать. Судя по коду должно рабюотать, возможно глюки дебагера...
schulgin
May 14 2012, 12:41
Коля, когда Вы сказали, что можно и логический анализ использовать, то что имелось ввиду?
Цитата(schulgin @ May 14 2012, 14:44)

Всё же, почему в моей программе строка 68 не работает?
Чтобы читать что-то с ноги МК51 нужно выдать в соответствующий бит порта единицу.
Цитата(schulgin @ May 14 2012, 13:40)

"pusk = 0;" закоментировал,
Вот тут-то и надо не коментить, а изменить на
Код
pusk = 1;
Цитата(schulgin @ May 14 2012, 15:41)

Коля, когда Вы сказали, что можно и логический анализ использовать, то что имелось ввиду?
В кейле есть логический анализатор. Есть еще watchdog его тоже можно использовать для просмотра значения порта...
Цитата(Палыч @ May 14 2012, 16:01)

Чтобы читать что-то с ноги МК51 нужно выдать в соответствующий бит порта единицу.
Вот тут-то и надо не коментить, а изменить на
Код
pusk = 1;
Можно попробовать, хотя там по умолчанию должен стоять в 1
ТС так и не сказал: как определяет, что программа не читает порт...
Попробовал прикрепленный выше проект на версии Keil 9.01 - всё работает...
schulgin
May 14 2012, 13:40
Цитата(Палыч @ May 14 2012, 16:01)

Чтобы читать что-то с ноги МК51 нужно выдать в соответствующий бит порта единицу.
Вот тут-то и надо не коментить, а изменить на
Код
pusk = 1;
Палыч, спасибо. Попробовал, ничего хорошего не получил. Палыч, Коля, если не трудно, то покажите, пожалуйста, кусок текста или исправьте мой, как правильно, который "железно" работает у Вас. Может это действительно глюк отладчика кейла. Использую Keil4.0
Цитата(schulgin @ May 14 2012, 17:40)

Палыч, Коля, если не трудно, то покажите, пожалуйста, кусок текста или исправьте мой, как правильно, который "железно" работает у Вас.
Вы писали, что строку "pusk = 0;" - закоментировали. Так вот, если это действительно сделать (закоментировать), то строка 68 "if (pusk)" правильно работает в соответствии с установкой "Pins" окне "Parallel Port 0" !
Что у Вас ещё не "работает"? Ещё раз повторюсь: чтобы читать что-то с ноги МК51 нужно чтобы в соответствующем бите порта была единица. Эти единицы помещаются туда по сбросу МК. Вы же зачем то заносите туда нули.
У меня в uV3 все четко работает...
schulgin
May 15 2012, 07:44
Спасибо за участие. После добавления промежуточных переменных на битовые входы (не во всех случаях) всё заработало как я хотел, но представление как их правильно и оптимально использовать не сложилось, ну да ладно. Надеюсь, что больше к этому не вернусь. Ещё раз спасибо.
редактор
May 17 2012, 11:32
Цитата
Отлаживаю в Кейле с помощью симулятора программу.
Не у всех моделей кристаллов нормально поддерживается перефирия (даже порты). Например отладчик в Keil 4.23 про периферию силабс 580 ничего не знает, хотя периферию силабс 310 отображает целиком.
Проверить можно, если открыть вкладку перефирии. Если есть порты, то часто бывает, что виртуальные регитсры не всегда синхронизируются правильно. Например: Записали в порт 0, в защелке порт сбросился и на "внешний вывод" выдал 0 (обычно это два разных регистра). После записи в этот порт 1 в регистре "внешний вывод" останется 0 (симулятор воспринимает его уже как внешний входной сигнал), так как "внешний вывод" содержит 0, то при чтении с него, также будет считан 0 (ведь чтение осуществляется непосредственно с вывода "pin" а не с защелки.
Поэтому для симулятора использование промежуточных регистров - нормальное решение. Еще как вариант - попробовать какой нибудь аналогичный кристалл. Ну а на железе все должно прийти в норму. Удачи.
Harbinger
May 17 2012, 16:48
Если мне память не изменяет, в силабсах по дефолту порты вообще на ввод настроены, с подключенными weak pull-up, и читаться должна, естественно, единичка, а чтобы работали на вывод, нужны пляски с PxMDIN и PxMDOUT (в Init_Device они присутствуют однако)...
редактор
May 18 2012, 07:14
Цитата
Если мне память не изменяет, в силабсах по дефолту порты вообще на ввод настроены, с подключенными weak pull-up, и читаться должна, естественно, единичка, а чтобы работали на вывод, нужны пляски с PxMDIN и PxMDOUT (в Init_Device они присутствуют однако)...
В железе да! А в
СИМУЛЯТОРЕ (речь в данном случае о нем) отдельная песня. Если переферия
не поддерживается то регистр порта скорее всего отображается в памяти и чтение-запись дадут идентичный результат. А вот если поддерживается, то запись будет производиться в виртуальный регистр-защелку, а чтение с виртуального регистра-выводов. Это можно посмотреть в отладочном окошке портов когда какие галки устанавливаются и какие считываются. Это характерно исключительно для
СИМУЛЯТОРА.
Для просмотра полной версии этой страницы, пожалуйста,
пройдите по ссылке.