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

 
 
4 страниц V   1 2 3 > »   
Reply to this topicStart new topic
> Странное поведение портов!, Мега32 - что может быть???
Sergio66
сообщение May 16 2006, 13:34
Сообщение #1


Местный
***

Группа: Свой
Сообщений: 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", то все становится на свои места - данные считываются нормально.
Помогите разобраться в чем дело...
Go to the top of the page
 
+Quote Post
_artem_
сообщение May 16 2006, 13:53
Сообщение #2


учащийся
*****

Группа: Свой
Сообщений: 1 065
Регистрация: 29-10-05
Из: города контрастов
Пользователь №: 10 249



Приведенная вами ситуация может быть когда вы читаете к примеру статус бит из ЛСД когда происходит прерывание.


--------------------
Зачем лаять на караван , когда на него можно плюнуть?

Go to the top of the page
 
+Quote Post
Sergio66
сообщение May 16 2006, 13:58
Сообщение #3


Местный
***

Группа: Свой
Сообщений: 235
Регистрация: 9-02-05
Пользователь №: 2 526



Цитата(_artem_ @ May 16 2006, 17:53) *
Приведенная вами ситуация может быть когда вы читаете к примеру статус бит из ЛСД когда происходит прерывание.

Нет - я вообще ничего не читаю из LCD!!! Мало того, если я отсоединяю LCD то ничего ровным счетом не меняется! Дело не в дисплее. Я выдаю на мл. линии "0", переключаю порт на прием, выжидаю паузу - и читаю. И читаю те самые нули, которые я же туда и выдал.
Go to the top of the page
 
+Quote Post
WHALE
сообщение May 16 2006, 14:01
Сообщение #4


Знающий
****

Группа: Свой
Сообщений: 902
Регистрация: 2-01-06
Из: Краснодар
Пользователь №: 12 768



а читаете через PINB?


--------------------
"Hello, word!" - 17 errors 56 warnings
Go to the top of the page
 
+Quote Post
Sergio66
сообщение May 16 2006, 14:04
Сообщение #5


Местный
***

Группа: Свой
Сообщений: 235
Регистрация: 9-02-05
Пользователь №: 2 526



Цитата(WHALE @ May 16 2006, 18:01) *
а читаете через PINB?

Именно!, причем, после переключения порта на прием, выжидаю паузу в несколько тактов.
Go to the top of the page
 
+Quote Post
_artem_
сообщение May 16 2006, 14:12
Сообщение #6


учащийся
*****

Группа: Свой
Сообщений: 1 065
Регистрация: 29-10-05
Из: города контрастов
Пользователь №: 10 249



Единственное не понимаю - устройство у вас которое к младшим разрядам подсоединено - с тремья состояниями ? Если нет как вы можете ставить порт на передачу (при записи в ЛСД) а потом на прием для чтения из устройства? А зачем вам всякий раз записывать нули перед переключением направления прота ? вроде бы у вас до этого и ноль должен быть. А если уsтройство отключаете как и ЛСД тоже нули читаются ?


--------------------
Зачем лаять на караван , когда на него можно плюнуть?

Go to the top of the page
 
+Quote Post
Sergio66
сообщение May 16 2006, 14:25
Сообщение #7


Местный
***

Группа: Свой
Сообщений: 235
Регистрация: 9-02-05
Пользователь №: 2 526



Цитата(_artem_ @ May 16 2006, 18:12) *
Единственное не понимаю - устройство у вас которое к младшим разрядам подсоединено - с тремья состояниями ? Если нет как вы можете ставить порт на передачу (при записи в ЛСД) а потом на прием для чтения из устройства? А зачем вам всякий раз записывать нули перед переключением направления прота ? вроде бы у вас до этого и ноль должен быть. А если уsтройство отключаете как и ЛСД тоже нули читаются ?

Устройство подключено через резисторы, поэтому, когда порт В работает на передачу, дисплей воспринимает то, что передает контроллер, устройство не мешает, да и интерфейс четырехпроводный, младшие биты дисплеем игнорируются.
Что касается выдачи данных, то для того, чтобы передать байт в дисплей по четырехпроводному интерфейсу, нужно проделать следующее:

OutPort(data & 0xf0)
OutPort(data << 4)

т.о. младшие биты передаются нулями.
Если я отключаю устройство от порта, то я не могу различить то ли я читаю те нули, что передал сам же, то ли это те нули, которые вызваны отсутствием устройства на шине.
Go to the top of the page
 
+Quote Post
_artem_
сообщение May 16 2006, 14:33
Сообщение #8


учащийся
*****

Группа: Свой
Сообщений: 1 065
Регистрация: 29-10-05
Из: города контрастов
Пользователь №: 10 249



навесте пулап резисторы - 1 ком вместо устройства а затем проведите опыт с прочитыванием без устройства и без ЛСД.


--------------------
Зачем лаять на караван , когда на него можно плюнуть?

Go to the top of the page
 
+Quote Post
defunct
сообщение May 16 2006, 14:37
Сообщение #9


кекс
******

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


Местный
***

Группа: Свой
Сообщений: 235
Регистрация: 9-02-05
Пользователь №: 2 526



Цитата(_artem_ @ May 16 2006, 18:33) *
навесте пулап резисторы - 1 ком вместо устройства а затем проведите опыт с прочитыванием без устройства и без ЛСД.

Доп. устройство итак подвешено через пулап резисторы в 1 К. И картина именно такая, как я обрисовал.
Я выдаю в порт нули, затем переключаю порт на прием (устройство передает что-то, но т.к. оно через резисторы, то сигнал контроллера силнее) и читаю состояние порта. И вижу там нули, именно те, которые передал!, а не данные от устройства.
Go to the top of the page
 
+Quote Post
Sergio66
сообщение May 16 2006, 14:59
Сообщение #11


Местный
***

Группа: Свой
Сообщений: 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)


Если я правильно Вас понял, то младшая тетрада порта В должна быть на прием всегда, и с подтягивающими резисторами? А я пробовал так - при переключении на прием младщей тетрады, подключаю пуллап на этих выводах. Эффект нулевой.
Go to the top of the page
 
+Quote Post
defunct
сообщение May 16 2006, 15:18
Сообщение #12


кекс
******

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



Цитата(Sergio66 @ May 16 2006, 17:59) *
Если я правильно Вас понял, то младшая тетрада порта В должна быть на прием всегда, и с подтягивающими резисторами? А я пробовал так - при переключении на прием младщей тетрады, подключаю пуллап на этих выводах. Эффект нулевой.

Да, предполагается, что младшая тетрада всегда настроена на ввод с внутренними подтягивающими резисторами (без внешних).

Хотя вообще-то странно. Можете более подробно обрисовать ситуацию? Если отключить LCD и код отвечающий за его работу, оставить только устройство подключенное к младшей тетраде порта B. Правильно ли считываются состояния порта?

Цитата
Программа обработки прерывания считывает состояние регистра DDRB, переводит младшие линии порта В на прием, считывает состояние порта В (PINB), возвращает DDRB в исходное состояние, и передает управление основному телу программы.

Зачем эти телодвижения с DDRB?
Не хотите ли вы сказать, что управляющие пины LCD подключены параллельно с неким устройством к младшей тетраде порта B?
Обрисуйте точную схему подключения LCD (7 пин) и устройства (4 пина) к вашему МК.
Go to the top of the page
 
+Quote Post
Sergio66
сообщение May 16 2006, 15:34
Сообщение #13


Местный
***

Группа: Свой
Сообщений: 235
Регистрация: 9-02-05
Пользователь №: 2 526



Цитата(defunct @ May 16 2006, 19:18) *
Цитата(Sergio66 @ May 16 2006, 17:59) *

Если я правильно Вас понял, то младшая тетрада порта В должна быть на прием всегда, и с подтягивающими резисторами? А я пробовал так - при переключении на прием младщей тетрады, подключаю пуллап на этих выводах. Эффект нулевой.

Да, предполагается, что младшая тетрада всегда настроена на ввод с внутренними подтягивающими резисторами (без внешних).

Хотя вообще-то странно. Можете более подробно обрисовать ситуацию? Если отключить LCD и код отвечающий за его работу, оставить только устройство подключенное к младшей тетраде порта B. Правильно ли считываются состояния порта?

Если отключаем LCD, и код, его обслуживающий, то все работает правильно. Мало того, если прерывание возникает не в период обращения к дисплею, то тоже все нормально. Функция работы с LCD настраивает старшую тетраду на выход, младшая - остается на прием. Выдаются данные в порт, далее выплняются другие ф-ии, не имеющие к порту В никакого отношения. Вотом, возникает прерывание для опроса порта В. Эта ф-я настраивает младшую тетраду на прием, опрашивает порт, восстанавливает состояние DDRB, и выходит. Вот тут то вся собака и роется.
Go to the top of the page
 
+Quote Post
Sergio66
сообщение May 16 2006, 15:45
Сообщение #14


Местный
***

Группа: Свой
Сообщений: 235
Регистрация: 9-02-05
Пользователь №: 2 526



Да, есть один нюанс, я его упустил для упрощения описания ситуации - устройство сидит не на PB0 - 3, а на линиях PB0, PB1, PB3, PB4. Т.е. линия РВ4 работает и на дисплей и на доп устройство. И перенастраиваю я именно эти линии. Только, в моем понимании это мало что меняет. Я выдал в порт данные, перенастроил порт на прием, т.е., если судить по даташиту, отключил выходной каскад контроллера от пина, и читаю этот пин. На нем должно присутствовать то, что установило внешнее устройство, т.к. дисплей абсолютно пассивет, да и его может и не быть.
Go to the top of the page
 
+Quote Post
defunct
сообщение May 16 2006, 15:59
Сообщение #15


кекс
******

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



Цитата(Sergio66 @ May 16 2006, 18:45) *
Да, есть один нюанс, я его упустил для упрощения описания ситуации - устройство сидит не на PB0 - 3, а на линиях PB0, PB1, PB3, PB4. Т.е. линия РВ4 работает и на дисплей и на доп устройство. И перенастраиваю я именно эти линии. Только, в моем понимании это мало что меняет. Я выдал в порт данные, перенастроил порт на прием, т.е., если судить по даташиту, отключил выходной каскад контроллера от пина, и читаю этот пин. На нем должно присутствовать то, что установило внешнее устройство, т.к. дисплей абсолютно пассивет, да и его может и не быть.

Решение с места (если точность интервала опроса не сильно важна): запрещать прерывания на входе в функцию обращения к LCD, разрешать - на выходе из этой функции.

Если же точность интервала опроса важна. С учетом последнего вашего поста, было бы неплохо взглянуть на код обработчика прерывания, может быть там что-то не так...
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 26th August 2025 - 11:54
Рейтинг@Mail.ru


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