|
Странное поведение портов!, Мега32 - что может быть??? |
|
|
|
May 16 2006, 13:34
|
Местный
  
Группа: Свой
Сообщений: 235
Регистрация: 9-02-05
Пользователь №: 2 526

|
Такая ситуация - Мега32, частота 16М, порт В - подключен LCD (2x16), причем по четырехпроводной схеме. Работают старшие линии РВ(7,6,5,4). При обращении к дисплею, на младшие линии выдаются нули. Обращение к дисплею происходит в основном цикле программы. Далее, к порту В также подключено устройство, имеющее 4 выходных линии, на которых присутствует поочередно "1" на каждой линии. Состояние, когда все 4 линии "0" исключено. Опрос этих линий происходит по прерыванию (1 раз в 20 мс). Программа обработки прерывания считывает состояние регистра DDRB, переводит младшие линии порта В на прием, считывает состояние порта В (PINB), возвращает DDRB в исходное состояние, и передает управление основному телу программы. И все бы ничего, если бы не ситуация - если прерывание возникает в период работы функции вывода данных на дисплей (т.е. когда на младшие линии подаются "0"), то в прерывании считываются именно "0"!!! После переключения линий порта В на прием, делаю паузу (до 10 мксек), ничего не меняется. Т.о., это не паразитные емкости. А вот если перед переключением порта на прием, выдать на младшие линии порта "1", то все становится на свои места - данные считываются нормально. Помогите разобраться в чем дело...
|
|
|
|
|
 |
Ответов
|
May 16 2006, 14:25
|
Местный
  
Группа: Свой
Сообщений: 235
Регистрация: 9-02-05
Пользователь №: 2 526

|
Цитата(_artem_ @ May 16 2006, 18:12)  Единственное не понимаю - устройство у вас которое к младшим разрядам подсоединено - с тремья состояниями ? Если нет как вы можете ставить порт на передачу (при записи в ЛСД) а потом на прием для чтения из устройства? А зачем вам всякий раз записывать нули перед переключением направления прота ? вроде бы у вас до этого и ноль должен быть. А если уsтройство отключаете как и ЛСД тоже нули читаются ? Устройство подключено через резисторы, поэтому, когда порт В работает на передачу, дисплей воспринимает то, что передает контроллер, устройство не мешает, да и интерфейс четырехпроводный, младшие биты дисплеем игнорируются. Что касается выдачи данных, то для того, чтобы передать байт в дисплей по четырехпроводному интерфейсу, нужно проделать следующее: OutPort(data & 0xf0) OutPort(data << 4) т.о. младшие биты передаются нулями. Если я отключаю устройство от порта, то я не могу различить то ли я читаю те нули, что передал сам же, то ли это те нули, которые вызваны отсутствием устройства на шине.
|
|
|
|
|
May 16 2006, 14:37
|

кекс
     
Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326

|
Цитата(Sergio66 @ May 16 2006, 17:25)  Если я отключаю устройство от порта, то я не могу различить то ли я читаю те нули, что передал сам же, то ли это те нули, которые вызваны отсутствием устройства на шине. Если у вас нет внешних Pull-up резисторов, а подключенное к младшим выводам порта B устройство имеет выход с ОК, тогда ваша ситуация вполне объяснима. При записи в PortB 1 - подключается соответствующий внутренний Pull-up резистор и вы считываете из PinB - 1, если в PortB записан 0, то соответствующий внутренний Pull-up резистор отключен и вы считываете из PinB - 0. Да, вы читаете то же самое, что находится в PORTB. Простейший выход из ситуации - всегда держать Pull-up's младшей тетрады порта B подключенными: OutPort(data | 0x0f) OutPort(data << 4 | 0x0f)
|
|
|
|
|
May 16 2006, 14:59
|
Местный
  
Группа: Свой
Сообщений: 235
Регистрация: 9-02-05
Пользователь №: 2 526

|
Цитата(defunct @ May 16 2006, 18:37)  Цитата(Sergio66 @ May 16 2006, 17:25)  Если я отключаю устройство от порта, то я не могу различить то ли я читаю те нули, что передал сам же, то ли это те нули, которые вызваны отсутствием устройства на шине.
Если у вас нет внешних Pull-up резисторов, а подключенное к младшим выводам порта B устройство имеет выход с ОК, тогда ваша ситуация вполне объяснима. При записи в PortB 1 - подключается соответствующий внутренний Pull-up резистор и вы считываете из PinB - 1, если в PortB записан 0, то соответствующий внутренний Pull-up резистор отключен и вы считываете из PinB - 0. Да, вы читаете то же самое, что находится в PORTB. Простейший выход из ситуации - всегда держать Pull-up's младшей тетрады порта B подключенными: OutPort(data | 0x0f) OutPort(data << 4 | 0x0f) Если я правильно Вас понял, то младшая тетрада порта В должна быть на прием всегда, и с подтягивающими резисторами? А я пробовал так - при переключении на прием младщей тетрады, подключаю пуллап на этих выводах. Эффект нулевой.
|
|
|
|
|
May 16 2006, 15:18
|

кекс
     
Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326

|
Цитата(Sergio66 @ May 16 2006, 17:59)  Если я правильно Вас понял, то младшая тетрада порта В должна быть на прием всегда, и с подтягивающими резисторами? А я пробовал так - при переключении на прием младщей тетрады, подключаю пуллап на этих выводах. Эффект нулевой. Да, предполагается, что младшая тетрада всегда настроена на ввод с внутренними подтягивающими резисторами (без внешних). Хотя вообще-то странно. Можете более подробно обрисовать ситуацию? Если отключить LCD и код отвечающий за его работу, оставить только устройство подключенное к младшей тетраде порта B. Правильно ли считываются состояния порта? Цитата Программа обработки прерывания считывает состояние регистра DDRB, переводит младшие линии порта В на прием, считывает состояние порта В (PINB), возвращает DDRB в исходное состояние, и передает управление основному телу программы. Зачем эти телодвижения с DDRB? Не хотите ли вы сказать, что управляющие пины LCD подключены параллельно с неким устройством к младшей тетраде порта B? Обрисуйте точную схему подключения LCD (7 пин) и устройства (4 пина) к вашему МК.
|
|
|
|
|
May 16 2006, 15:34
|
Местный
  
Группа: Свой
Сообщений: 235
Регистрация: 9-02-05
Пользователь №: 2 526

|
Цитата(defunct @ May 16 2006, 19:18)  Цитата(Sergio66 @ May 16 2006, 17:59)  Если я правильно Вас понял, то младшая тетрада порта В должна быть на прием всегда, и с подтягивающими резисторами? А я пробовал так - при переключении на прием младщей тетрады, подключаю пуллап на этих выводах. Эффект нулевой.
Да, предполагается, что младшая тетрада всегда настроена на ввод с внутренними подтягивающими резисторами (без внешних). Хотя вообще-то странно. Можете более подробно обрисовать ситуацию? Если отключить LCD и код отвечающий за его работу, оставить только устройство подключенное к младшей тетраде порта B. Правильно ли считываются состояния порта? Если отключаем LCD, и код, его обслуживающий, то все работает правильно. Мало того, если прерывание возникает не в период обращения к дисплею, то тоже все нормально. Функция работы с LCD настраивает старшую тетраду на выход, младшая - остается на прием. Выдаются данные в порт, далее выплняются другие ф-ии, не имеющие к порту В никакого отношения. Вотом, возникает прерывание для опроса порта В. Эта ф-я настраивает младшую тетраду на прием, опрашивает порт, восстанавливает состояние DDRB, и выходит. Вот тут то вся собака и роется.
|
|
|
|
|
May 16 2006, 15:45
|
Местный
  
Группа: Свой
Сообщений: 235
Регистрация: 9-02-05
Пользователь №: 2 526

|
Да, есть один нюанс, я его упустил для упрощения описания ситуации - устройство сидит не на PB0 - 3, а на линиях PB0, PB1, PB3, PB4. Т.е. линия РВ4 работает и на дисплей и на доп устройство. И перенастраиваю я именно эти линии. Только, в моем понимании это мало что меняет. Я выдал в порт данные, перенастроил порт на прием, т.е., если судить по даташиту, отключил выходной каскад контроллера от пина, и читаю этот пин. На нем должно присутствовать то, что установило внешнее устройство, т.к. дисплей абсолютно пассивет, да и его может и не быть.
|
|
|
|
Сообщений в этой теме
Sergio66 Странное поведение портов! May 16 2006, 13:34 _artem_ Приведенная вами ситуация может быть когда вы чита... May 16 2006, 13:53 Sergio66 Цитата(_artem_ @ May 16 2006, 17:53) Прив... May 16 2006, 13:58  WHALE а читаете через PINB? May 16 2006, 14:01   Sergio66 Цитата(WHALE @ May 16 2006, 18:01) а чита... May 16 2006, 14:04       defunct Цитата(Sergio66 @ May 16 2006, 18:45) Да,... May 16 2006, 15:59  OlegIvanov [/quote]
Что касается выдачи данных, то для того,... May 16 2006, 23:06 _artem_ навесте пулап резисторы - 1 ком вместо устройства ... May 16 2006, 14:33 Sergio66 Цитата(_artem_ @ May 16 2006, 18:33) наве... May 16 2006, 14:44 Laksus Доп. устройство итак подвешено через пулап резисто... May 16 2006, 18:06 WHALE Насколько я помню протокол,последней операцией зап... May 16 2006, 18:14 _artem_ Я Вас может быть неправильно понял но не могу инте... May 16 2006, 18:58 defunct Цитата(_artem_ @ May 16 2006, 21:58) Я Ва... May 16 2006, 20:05 Sergio66 Цитата(_artem_ @ May 16 2006, 22:58) Я Ва... May 17 2006, 05:54 _artem_ Мне это так не кажется - передача тетрады для порт... May 16 2006, 21:23 Sergio66 Цитата(_artem_ @ May 17 2006, 01:23) Мне ... May 17 2006, 06:40 _artem_ Можно отрассировать по выходу из обработчика преры... May 17 2006, 10:06 Sergio66 Цитата(_artem_ @ May 17 2006, 14:06) Можн... May 17 2006, 10:35  otrog В общем так:
Самый простой выход из ситуации это, ... May 17 2006, 11:54   Sergio66 Я только что проделал такой эксперимент - я отключ... May 17 2006, 15:35    defunct Цитата(Sergio66 @ May 17 2006, 18:35) Я т... May 17 2006, 15:49     Sergio66 Цитата(defunct @ May 17 2006, 19:49) Цита... May 19 2006, 09:22      OlegIvanov Цитата(Sergio66 @ May 19 2006, 12:22) Цит... May 19 2006, 15:50       Sergio66 [/quote]
Вам все толком говорят. Вы же сами выбра... May 19 2006, 17:26        defunct Цитата(Sergio66 @ May 19 2006, 20:26) If ... May 19 2006, 20:16 _artem_ Вложенные прерывания разрешены ? Конкретно знаете ... May 17 2006, 11:27 Laksus После переключения линий порта В на прием, делаю п... May 17 2006, 16:30 _artem_ Sergio66, можно ли сделать так :
- прямо в ISR уст... May 19 2006, 11:55 Sergio66 Цитата(_artem_ @ May 19 2006, 15:55) Serg... May 19 2006, 12:13 Sergio66 Цитата(_artem_ @ May 19 2006, 15:55) Serg... May 19 2006, 12:46 Sergio66 Вот такой кусок кода -
while (1)
{
DDRB = 0xf0;... May 19 2006, 13:20 Sergio66 Все чудо в том, что отладчик видит "1" н... May 19 2006, 12:32 _artem_ Может у вас с портом неполадки? Можно будет вывод... May 19 2006, 13:34 _artem_ Sergio66, Можно поменять пин ПБ4 на какой нибудь д... May 19 2006, 22:48 SasaVitebsk Применение развязки на резисторах мягко говоря нек... May 20 2006, 00:05 _artem_ атмега 32 может давать до десяти миллиампер на вых... May 20 2006, 03:45 Sergio66 Цитата(_artem_ @ May 20 2006, 07:45) атме... May 20 2006, 11:05 _artem_ Mozno postavit 1 kOm i poprobovat?
Vi tak i ne soo... May 20 2006, 12:14 Sergio66 Цитата(_artem_ @ May 20 2006, 16:14) Mozn... May 20 2006, 12:21  SasaVitebsk Ребята, можно делать всё!!! Можно брит... May 20 2006, 21:53 _artem_ Почему впустую ? Любой мысленный процесс это физку... May 20 2006, 22:08 defunct Цитата(_artem_ @ May 21 2006, 01:08) Поче... May 20 2006, 22:24  Sergio66 Цитата(defunct @ May 21 2006, 02:24) Цита... May 21 2006, 07:49   CDT Приветствую, Господа!
Делал я штуку, в которо... Jun 2 2006, 13:15
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|