|
как прочесть порт |
|
|
|
May 12 2012, 16:00
|
Участник

Группа: Участник
Сообщений: 50
Регистрация: 27-06-07
Пользователь №: 28 739

|
Отлаживаю в Кейле с помощью симулятора программу. Цифровые выходы обозначил битовыми пременными например так "sbit rabota = P2^0;" Всё хорохо, когда пишу в порт, но когда пытаюсь использовать этот идентификатор в какой ни буть операции, например, "if (rabota)" или просто его присвоить другой переменной ничего не получается. Компилируется без ошибок, а операции или присвоения не выполняются. Пытался это сделать с помощью маскировки порта, например "P2 & 0x01" та же самая история по отдельности все значения просматриваются, а результат другой. Промучился почти целый день, а результат ноль. Уж очень достало, помогите!!!
|
|
|
|
2 страниц
1 2 >
|
 |
Ответов
(1 - 18)
|
May 14 2012, 08:35
|
Участник

Группа: Участник
Сообщений: 50
Регистрация: 27-06-07
Пользователь №: 28 739

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

Группа: Участник
Сообщений: 50
Регистрация: 27-06-07
Пользователь №: 28 739

|
Цитата(Kolia @ May 14 2012, 12:09)  Меня смущает эта строчка
pusk = 0;
фактически вы подключили порт к земле.... "pusk = 0;" закоментировал, результат не изменился, но задался вопросом:"Если я хочу поуправлять состоянием входа, то в окошке Parallel Port отладчика должен пользоваться строкой Pins:, а не P0:?"
|
|
|
|
|
May 14 2012, 10:07
|
Частый гость
 
Группа: Свой
Сообщений: 188
Регистрация: 28-09-06
Из: Minsk
Пользователь №: 20 762

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

Группа: Участник
Сообщений: 50
Регистрация: 27-06-07
Пользователь №: 28 739

|
Большое спасибо Бельченко. Собственно, прочитав его статьи, я и смог программировать эти микроконтроллеры. Указанная статья мне ещё пригодиться, но в примере нет того, как прочитать вход. Сдаётся мне, что я не знаю какой-то тривиальщины. Всё же, почему в моей программе строка 68 не работает?
|
|
|
|
|
May 14 2012, 12:34
|
Частый гость
 
Группа: Свой
Сообщений: 188
Регистрация: 28-09-06
Из: Minsk
Пользователь №: 20 762

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

Группа: Участник
Сообщений: 50
Регистрация: 27-06-07
Пользователь №: 28 739

|
Коля, когда Вы сказали, что можно и логический анализ использовать, то что имелось ввиду?
|
|
|
|
|
May 14 2012, 13:01
|

Гуру
     
Группа: Свой
Сообщений: 2 399
Регистрация: 10-05-06
Из: г. Новочеркасск
Пользователь №: 16 954

|
Цитата(schulgin @ May 14 2012, 14:44)  Всё же, почему в моей программе строка 68 не работает? Чтобы читать что-то с ноги МК51 нужно выдать в соответствующий бит порта единицу. Цитата(schulgin @ May 14 2012, 13:40)  "pusk = 0;" закоментировал, Вот тут-то и надо не коментить, а изменить на Код pusk = 1;
|
|
|
|
|
May 14 2012, 13:21
|
Частый гость
 
Группа: Свой
Сообщений: 188
Регистрация: 28-09-06
Из: Minsk
Пользователь №: 20 762

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

Группа: Участник
Сообщений: 50
Регистрация: 27-06-07
Пользователь №: 28 739

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

Гуру
     
Группа: Свой
Сообщений: 2 399
Регистрация: 10-05-06
Из: г. Новочеркасск
Пользователь №: 16 954

|
Цитата(schulgin @ May 14 2012, 17:40)  Палыч, Коля, если не трудно, то покажите, пожалуйста, кусок текста или исправьте мой, как правильно, который "железно" работает у Вас. Вы писали, что строку "pusk = 0;" - закоментировали. Так вот, если это действительно сделать (закоментировать), то строка 68 "if (pusk)" правильно работает в соответствии с установкой "Pins" окне "Parallel Port 0" ! Что у Вас ещё не "работает"? Ещё раз повторюсь: чтобы читать что-то с ноги МК51 нужно чтобы в соответствующем бите порта была единица. Эти единицы помещаются туда по сбросу МК. Вы же зачем то заносите туда нули.
|
|
|
|
|
May 15 2012, 07:44
|
Участник

Группа: Участник
Сообщений: 50
Регистрация: 27-06-07
Пользователь №: 28 739

|
Спасибо за участие. После добавления промежуточных переменных на битовые входы (не во всех случаях) всё заработало как я хотел, но представление как их правильно и оптимально использовать не сложилось, ну да ладно. Надеюсь, что больше к этому не вернусь. Ещё раз спасибо.
|
|
|
|
|
May 17 2012, 11:32
|
Местный
  
Группа: Участник
Сообщений: 356
Регистрация: 9-06-07
Пользователь №: 28 315

|
Цитата Отлаживаю в Кейле с помощью симулятора программу. Не у всех моделей кристаллов нормально поддерживается перефирия (даже порты). Например отладчик в Keil 4.23 про периферию силабс 580 ничего не знает, хотя периферию силабс 310 отображает целиком. Проверить можно, если открыть вкладку перефирии. Если есть порты, то часто бывает, что виртуальные регитсры не всегда синхронизируются правильно. Например: Записали в порт 0, в защелке порт сбросился и на "внешний вывод" выдал 0 (обычно это два разных регистра). После записи в этот порт 1 в регистре "внешний вывод" останется 0 (симулятор воспринимает его уже как внешний входной сигнал), так как "внешний вывод" содержит 0, то при чтении с него, также будет считан 0 (ведь чтение осуществляется непосредственно с вывода "pin" а не с защелки. Поэтому для симулятора использование промежуточных регистров - нормальное решение. Еще как вариант - попробовать какой нибудь аналогичный кристалл. Ну а на железе все должно прийти в норму. Удачи.
--------------------
Хорошую систему делают из стандартных блоков нестандартно мыслящие инженеры.
|
|
|
|
|
May 18 2012, 07:14
|
Местный
  
Группа: Участник
Сообщений: 356
Регистрация: 9-06-07
Пользователь №: 28 315

|
Цитата Если мне память не изменяет, в силабсах по дефолту порты вообще на ввод настроены, с подключенными weak pull-up, и читаться должна, естественно, единичка, а чтобы работали на вывод, нужны пляски с PxMDIN и PxMDOUT (в Init_Device они присутствуют однако)... В железе да! А в СИМУЛЯТОРЕ (речь в данном случае о нем) отдельная песня. Если переферия не поддерживается то регистр порта скорее всего отображается в памяти и чтение-запись дадут идентичный результат. А вот если поддерживается, то запись будет производиться в виртуальный регистр-защелку, а чтение с виртуального регистра-выводов. Это можно посмотреть в отладочном окошке портов когда какие галки устанавливаются и какие считываются. Это характерно исключительно для СИМУЛЯТОРА.
--------------------
Хорошую систему делают из стандартных блоков нестандартно мыслящие инженеры.
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|