реклама на сайте
подробности

 
 
> как прочесть порт
schulgin
сообщение May 12 2012, 16:00
Сообщение #1


Участник
*

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



Отлаживаю в Кейле с помощью симулятора программу.
Цифровые выходы обозначил битовыми пременными например так "sbit rabota = P2^0;" Всё хорохо, когда пишу в порт, но когда пытаюсь использовать этот идентификатор в какой ни буть операции, например, "if (rabota)" или просто его присвоить другой переменной ничего не получается. Компилируется без ошибок, а операции или присвоения не выполняются. Пытался это сделать с помощью маскировки порта, например "P2 & 0x01" та же самая история по отдельности все значения просматриваются, а результат другой.
Промучился почти целый день, а результат ноль. Уж очень достало, помогите!!!
Go to the top of the page
 
+Quote Post
2 страниц V   1 2 >  
Start new topic
Ответов (1 - 18)
Палыч
сообщение May 14 2012, 05:40
Сообщение #2


Гуру
******

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



Цитата(schulgin @ May 12 2012, 20:00) *
...а операции или присвоения не выполняются.
Как Вы это определяете? Приведите хотя бы кусок текста программы где это не работает.
Go to the top of the page
 
+Quote Post
schulgin
сообщение May 14 2012, 08:35
Сообщение #3


Участник
*

Группа: Участник
Сообщений: 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
Прикрепленные файлы
Прикрепленный файл  Kuhnya_.zip ( 39.39 килобайт ) Кол-во скачиваний: 21
 
Go to the top of the page
 
+Quote Post
Kolia
сообщение May 14 2012, 09:09
Сообщение #4


Частый гость
**

Группа: Свой
Сообщений: 188
Регистрация: 28-09-06
Из: Minsk
Пользователь №: 20 762



Меня смущает эта строчка

pusk = 0;

фактически вы подключили порт к земле....
Go to the top of the page
 
+Quote Post
schulgin
сообщение May 14 2012, 09:40
Сообщение #5


Участник
*

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



Цитата(Kolia @ May 14 2012, 12:09) *
Меня смущает эта строчка

pusk = 0;

фактически вы подключили порт к земле....

"pusk = 0;" закоментировал, результат не изменился, но задался вопросом:"Если я хочу поуправлять состоянием входа, то в окошке Parallel Port отладчика должен пользоваться строкой Pins:, а не P0:?"
Go to the top of the page
 
+Quote Post
Kolia
сообщение May 14 2012, 10:07
Сообщение #6


Частый гость
**

Группа: Свой
Сообщений: 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
Go to the top of the page
 
+Quote Post
schulgin
сообщение May 14 2012, 10:44
Сообщение #7


Участник
*

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



Большое спасибо Бельченко. Собственно, прочитав его статьи, я и смог программировать эти микроконтроллеры. Указанная статья мне ещё пригодиться, но в примере нет того, как прочитать вход. Сдаётся мне, что я не знаю какой-то тривиальщины. Всё же, почему в моей программе строка 68 не работает?
Go to the top of the page
 
+Quote Post
Kolia
сообщение May 14 2012, 12:34
Сообщение #8


Частый гость
**

Группа: Свой
Сообщений: 188
Регистрация: 28-09-06
Из: Minsk
Пользователь №: 20 762



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


Вход читается непосредсвенно в программе, можно и логический анализатор использовать. Судя по коду должно рабюотать, возможно глюки дебагера...
Go to the top of the page
 
+Quote Post
schulgin
сообщение May 14 2012, 12:41
Сообщение #9


Участник
*

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



Коля, когда Вы сказали, что можно и логический анализ использовать, то что имелось ввиду?
Go to the top of the page
 
+Quote Post
Палыч
сообщение May 14 2012, 13:01
Сообщение #10


Гуру
******

Группа: Свой
Сообщений: 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;
Go to the top of the page
 
+Quote Post
Kolia
сообщение May 14 2012, 13:21
Сообщение #11


Частый гость
**

Группа: Свой
Сообщений: 188
Регистрация: 28-09-06
Из: Minsk
Пользователь №: 20 762



Цитата(schulgin @ May 14 2012, 15:41) *
Коля, когда Вы сказали, что можно и логический анализ использовать, то что имелось ввиду?


В кейле есть логический анализатор. Есть еще watchdog его тоже можно использовать для просмотра значения порта...


Цитата(Палыч @ May 14 2012, 16:01) *
Чтобы читать что-то с ноги МК51 нужно выдать в соответствующий бит порта единицу.

Вот тут-то и надо не коментить, а изменить на
Код
pusk = 1;


Можно попробовать, хотя там по умолчанию должен стоять в 1
Go to the top of the page
 
+Quote Post
Палыч
сообщение May 14 2012, 13:38
Сообщение #12


Гуру
******

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



ТС так и не сказал: как определяет, что программа не читает порт...

Попробовал прикрепленный выше проект на версии Keil 9.01 - всё работает...


Go to the top of the page
 
+Quote Post
schulgin
сообщение May 14 2012, 13:40
Сообщение #13


Участник
*

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



Цитата(Палыч @ May 14 2012, 16:01) *
Чтобы читать что-то с ноги МК51 нужно выдать в соответствующий бит порта единицу.

Вот тут-то и надо не коментить, а изменить на
Код
pusk = 1;

Палыч, спасибо. Попробовал, ничего хорошего не получил. Палыч, Коля, если не трудно, то покажите, пожалуйста, кусок текста или исправьте мой, как правильно, который "железно" работает у Вас. Может это действительно глюк отладчика кейла. Использую Keil4.0
Go to the top of the page
 
+Quote Post
Палыч
сообщение May 14 2012, 16:53
Сообщение #14


Гуру
******

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



Цитата(schulgin @ May 14 2012, 17:40) *
Палыч, Коля, если не трудно, то покажите, пожалуйста, кусок текста или исправьте мой, как правильно, который "железно" работает у Вас.

Вы писали, что строку "pusk = 0;" - закоментировали. Так вот, если это действительно сделать (закоментировать), то строка 68 "if (pusk)" правильно работает в соответствии с установкой "Pins" окне "Parallel Port 0" !

Что у Вас ещё не "работает"? Ещё раз повторюсь: чтобы читать что-то с ноги МК51 нужно чтобы в соответствующем бите порта была единица. Эти единицы помещаются туда по сбросу МК. Вы же зачем то заносите туда нули.
Go to the top of the page
 
+Quote Post
Kolia
сообщение May 14 2012, 21:49
Сообщение #15


Частый гость
**

Группа: Свой
Сообщений: 188
Регистрация: 28-09-06
Из: Minsk
Пользователь №: 20 762




У меня в uV3 все четко работает...
Go to the top of the page
 
+Quote Post
schulgin
сообщение May 15 2012, 07:44
Сообщение #16


Участник
*

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



Спасибо за участие. После добавления промежуточных переменных на битовые входы (не во всех случаях) всё заработало как я хотел, но представление как их правильно и оптимально использовать не сложилось, ну да ладно. Надеюсь, что больше к этому не вернусь. Ещё раз спасибо.
Go to the top of the page
 
+Quote Post
редактор
сообщение May 17 2012, 11:32
Сообщение #17


Местный
***

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



Цитата
Отлаживаю в Кейле с помощью симулятора программу.

Не у всех моделей кристаллов нормально поддерживается перефирия (даже порты). Например отладчик в Keil 4.23 про периферию силабс 580 ничего не знает, хотя периферию силабс 310 отображает целиком.
Проверить можно, если открыть вкладку перефирии. Если есть порты, то часто бывает, что виртуальные регитсры не всегда синхронизируются правильно. Например: Записали в порт 0, в защелке порт сбросился и на "внешний вывод" выдал 0 (обычно это два разных регистра). После записи в этот порт 1 в регистре "внешний вывод" останется 0 (симулятор воспринимает его уже как внешний входной сигнал), так как "внешний вывод" содержит 0, то при чтении с него, также будет считан 0 (ведь чтение осуществляется непосредственно с вывода "pin" а не с защелки.

Поэтому для симулятора использование промежуточных регистров - нормальное решение. Еще как вариант - попробовать какой нибудь аналогичный кристалл. Ну а на железе все должно прийти в норму. Удачи.



--------------------
Хорошую систему делают из стандартных блоков нестандартно мыслящие инженеры.
Go to the top of the page
 
+Quote Post
Harbinger
сообщение May 17 2012, 16:48
Сообщение #18


старший лаборант
******

Группа: Свой
Сообщений: 2 702
Регистрация: 30-09-05
Из: ЮЗЖД
Пользователь №: 9 097



Если мне память не изменяет, в силабсах по дефолту порты вообще на ввод настроены, с подключенными weak pull-up, и читаться должна, естественно, единичка, а чтобы работали на вывод, нужны пляски с PxMDIN и PxMDOUT (в Init_Device они присутствуют однако)...


--------------------
Китайская комплектация - европейское качество! ;)
Go to the top of the page
 
+Quote Post
редактор
сообщение May 18 2012, 07:14
Сообщение #19


Местный
***

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



Цитата
Если мне память не изменяет, в силабсах по дефолту порты вообще на ввод настроены, с подключенными weak pull-up, и читаться должна, естественно, единичка, а чтобы работали на вывод, нужны пляски с PxMDIN и PxMDOUT (в Init_Device они присутствуют однако)...

В железе да! А в СИМУЛЯТОРЕ (речь в данном случае о нем) отдельная песня. Если переферия не поддерживается то регистр порта скорее всего отображается в памяти и чтение-запись дадут идентичный результат. А вот если поддерживается, то запись будет производиться в виртуальный регистр-защелку, а чтение с виртуального регистра-выводов. Это можно посмотреть в отладочном окошке портов когда какие галки устанавливаются и какие считываются. Это характерно исключительно для СИМУЛЯТОРА.


--------------------
Хорошую систему делают из стандартных блоков нестандартно мыслящие инженеры.
Go to the top of the page
 
+Quote Post

2 страниц V   1 2 >
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 23rd July 2025 - 03:59
Рейтинг@Mail.ru


Страница сгенерированна за 0.01524 секунд с 7
ELECTRONIX ©2004-2016