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

 
 
> Странное поведение портов!, Мега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
 
Start new topic
Ответов
_artem_
сообщение May 17 2006, 10:06
Сообщение #2


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

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



Можно отрассировать по выходу из обработчика прерывания содержимое стека, точнее адресс куда программа вернется после инструкции RETI когда проблема произошла? Можно прямо перед выходом из обработчика прерываний в одну переменную сохранить содержимое стека а в другую флаг присутствия проблемы установленный в :
if ((PINB & 0x1b) )
{
.......
}
else
{
flag = 1;
}

потом в конце вывода в дисплей проверить флаг и если он установлен вывести значение стека на дислпеы или уарт и затем сбросить флаг после . И потом конечно листинг ассемблера с С кодом вместе (как минимум куска на кторый указывает стек).

Еше один вопрос - читается ли 0 все время когда вывод на лсд или иногда ?

Можно также на время OUT_DATA_PORT запретить прерывание dlja vyvoda obeix tetrad :

__disable_interrupts();
OUT_DATA_PORT;
__enable_interrupts();

и сообшить результат.


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

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


Местный
***

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



Цитата(_artem_ @ May 17 2006, 14:06) *
Можно отрассировать по выходу из обработчика прерывания содержимое стека, точнее адресс куда программа вернется после инструкции RETI когда проблема произошла? Можно прямо перед выходом из обработчика прерываний в одну переменную сохранить содержимое стека а в другую флаг присутствия проблемы установленный в :
if ((PINB & 0x1b) )
{
.......
}
else
{
flag = 1;
}

потом в конце вывода в дисплей проверить флаг и если он установлен вывести значение стека на дислпеы или уарт и затем сбросить флаг после . И потом конечно листинг ассемблера с С кодом вместе (как минимум куска на кторый указывает стек).

Еше один вопрос - читается ли 0 все время когда вывод на лсд или иногда ?

Можно также на время OUT_DATA_PORT запретить прерывание dlja vyvoda obeix tetrad :

__disable_interrupts();
OUT_DATA_PORT;
__enable_interrupts();

и сообшить результат.


При чтении порта РВ4 я вижу то, что быо выдано на эту линию в обработчике дисплея только в том случае, если прерывание возникло во время обмена с дисплеем.
Go to the top of the page
 
+Quote Post
otrog
сообщение May 17 2006, 11:54
Сообщение #4


Местный
***

Группа: Свой
Сообщений: 232
Регистрация: 22-02-06
Из: Воронеж
Пользователь №: 14 589



В общем так:
Самый простой выход из ситуации это, как уже говорилось
Цитата
запрещать прерывания, на время работы с LCD

Если это недопустимо и если точно известно, что период следования прерываний больше времени работы обслуживателя LCD, то можно сделать так:
Код
char flag = 0; // флаг разрешения обслуживания LCD
.................
while ( flag == 0 ); // ждать, пока небыло прерывания
[LCD] // процедура обслуживания LCD
flag = 0; // запретить обслуживание LCD

.................
// в конце обработчика прерывания
if ( flag == 0 ) { flag = 1; } // если был запрет на обслуживание LCD, то разрешить его.


Успехов.


--------------------
Истина рождается в спорах; но когда страсти кипят, истина испаряется.
Go to the top of the page
 
+Quote Post
Sergio66
сообщение May 17 2006, 15:35
Сообщение #5


Местный
***

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



Я только что проделал такой эксперимент - я отключтл дисплей, отключил доп. устройство и запустил программу так, как будто все подключено. Только функция работы с дисплеем выдает все "1" во все линии порта В. В обработчике прервания я вижу PINB в "1"! Т.е. ноги висят в воздухе, я выдаю на них "1", потом переключаюсь на прием, и вижу на них те же "1"!
Может быть я просто имею "битую" микросхему?
Go to the top of the page
 
+Quote Post
defunct
сообщение May 17 2006, 15:49
Сообщение #6


кекс
******

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



Цитата(Sergio66 @ May 17 2006, 18:35) *
Я только что проделал такой эксперимент - я отключтл дисплей, отключил доп. устройство и запустил программу так, как будто все подключено. Только функция работы с дисплеем выдает все "1" во все линии порта В. В обработчике прервания я вижу PINB в "1"! Т.е. ноги висят в воздухе, я выдаю на них "1", потом переключаюсь на прием, и вижу на них те же "1"!
Может быть я просто имею "битую" микросхему?


Нет smile.gif микросхема не битая.
Вы выводите 1 в Port, тем самым вы подключаете внутренний Pull-up резистор, и МК ведет себя совершенно адекватно считывая 1 с соответствующего PinX.

Проведите пожалуйста такой эксперимент как вам посоветовал _artem:

__disable_interrupts();
OUT_DATA_PORT;
__enable_interrupts();

или:

asm("cli");
//вывод обеих тетрад на LCD
asm("sei");

Должно все работать
Go to the top of the page
 
+Quote Post
Sergio66
сообщение May 19 2006, 09:22
Сообщение #7


Местный
***

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



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

Я только что проделал такой эксперимент - я отключтл дисплей, отключил доп. устройство и запустил программу так, как будто все подключено. Только функция работы с дисплеем выдает все "1" во все линии порта В. В обработчике прервания я вижу PINB в "1"! Т.е. ноги висят в воздухе, я выдаю на них "1", потом переключаюсь на прием, и вижу на них те же "1"!
Может быть я просто имею "битую" микросхему?


Нет smile.gif микросхема не битая.
Вы выводите 1 в Port, тем самым вы подключаете внутренний Pull-up резистор, и МК ведет себя совершенно адекватно считывая 1 с соответствующего PinX.

Проведите пожалуйста такой эксперимент как вам посоветовал _artem:

__disable_interrupts();
OUT_DATA_PORT;
__enable_interrupts();

или:

asm("cli");
//вывод обеих тетрад на LCD
asm("sei");

Должно все работать


Это на результат не влияет. Т.к. я уже выдал "1" на линии, запрет прерываний не имеет в данном случае ровно никакого значения, т.к. в процедуре обработки прер-я я переключаю линии на прием, и "1" после этого в них не выдаю, так, что пулл ап резисторы я не подключаю. Но читаю на пинах то ,что выдал в порт.
Go to the top of the page
 
+Quote Post
OlegIvanov
сообщение May 19 2006, 15:50
Сообщение #8


Участник
*

Группа: Новичок
Сообщений: 38
Регистрация: 12-09-05
Пользователь №: 8 464



Цитата(Sergio66 @ May 19 2006, 12:22) *
Цитата(defunct @ May 17 2006, 19:49) *

Цитата(Sergio66 @ May 17 2006, 18:35) *

Я только что проделал такой эксперимент - я отключтл дисплей, отключил доп. устройство и запустил программу так, как будто все подключено. Только функция работы с дисплеем выдает все "1" во все линии порта В. В обработчике прервания я вижу PINB в "1"! Т.е. ноги висят в воздухе, я выдаю на них "1", потом переключаюсь на прием, и вижу на них те же "1"!
Может быть я просто имею "битую" микросхему?


Нет :) микросхема не битая.
Вы выводите 1 в Port, тем самым вы подключаете внутренний Pull-up резистор, и МК ведет себя совершенно адекватно считывая 1 с соответствующего PinX.



Это на результат не влияет. Т.к. я уже выдал "1" на линии, запрет прерываний не имеет в данном случае ровно никакого значения, т.к. в процедуре обработки прер-я я переключаю линии на прием, и "1" после этого в них не выдаю, так, что пулл ап резисторы я не подключаю. Но читаю на пинах то ,что выдал в порт.


Вам все толком говорят. Вы же сами выбрасываете эти 1 в порт. При переключении на вход это уже автоматом подтягивающие резисторы.
Go to the top of the page
 
+Quote Post
Sergio66
сообщение May 19 2006, 17:26
Сообщение #9


Местный
***

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



[/quote]

Вам все толком говорят. Вы же сами выбрасываете эти 1 в порт. При переключении на вход это уже автоматом подтягивающие резисторы.
[/quote]

If PORTxn is written logic one when the pin is configured as an input pin, the pull-up
resistor is activated.

Перевожу: Если в порт PORTxn записана "1" в то время, как этот порт (пин) настроен на прием, то pull-up резистор активизируется.
Но не на оборот. Вы хотите сказать, что если последняя операция с выводом данных в порт закончилась выводом "1", то переключение порта на вход автоматом включает pull-up резисторы? Судя по документации - это не так.
Go to the top of the page
 
+Quote Post
defunct
сообщение May 19 2006, 20:16
Сообщение #10


кекс
******

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



Цитата(Sergio66 @ May 19 2006, 20:26) *
If PORTxn is written logic one when the pin is configured as an input pin, the pull-up
resistor is activated.

Перевожу: Если в порт PORTxn записана "1" в то время, как этот порт (пин) настроен на прием, то pull-up резистор активизируется.

В вашем переводе неточность, возьму на себя смелость ее исправить, ключевое слово выделено, лишний оборот "в то время, как" выброшен (в даташите его нет):
Если в PORTX записана еденица когда этот пин сконфигурирован на ввод, пулап этого пина активизирован...


Итого, еденица уже записана, неважно когда именно, в даташите это не конкретизируется. Может быть когда-то давно записана, может недавно, может в момент когда DDRX = 1, а может и в момент когда DDRX = 0.
Но действовать на пулап эта (давно записанная) еденица будет только тогда, когда пин сконфигурирован на ввод (DDRX=0).

И получается совсем другой смысл.

Цитата
Но не на оборот.

Кто сказал, что не наоборот?
Как только выполняется условие DDRX=0, PORTX=1, соответсвующий пулап будет действовать на PINX.


Цитата
Вы хотите сказать, что если последняя операция с выводом данных в порт закончилась выводом "1", то переключение порта на вход автоматом включает pull-up резисторы?
Именно это и говорим.

Цитата
Судя по документации - это не так.
В даташите нет такого утверждения, и не следует строить ложных домыслов, основанных на неверном переводе, к тому же на практике эти домыслы не подтверждаются.

По сабжу: Почему-то у меня есть некоторая уверенность в том, что даже если вам удастся заставить считывать показания устройства правильно, то появится новая проблема с ошибками вывода на LCD экран (когда устройство своей "еденицей" будет давить 0 выводимый на LCD, либо наоборот нулем будет давить еденицу, недалеко так и попалить одно из двух или МК или устройство).
На вашем месте, я бы давно уже подыскал любой другой свободный пин, и подключил бы к нему злополучный вывод устройства. Организовать "шару" это не такая уж простая задача как может показаться на первый взгляд.
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- 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
- - _artem_   Единственное не понимаю - устройство у вас которое...   May 16 2006, 14:12
|- - Sergio66   Цитата(_artem_ @ May 16 2006, 18:12) Един...   May 16 2006, 14:25
|- - defunct   Цитата(Sergio66 @ May 16 2006, 17:25) Есл...   May 16 2006, 14:37
||- - Sergio66   Цитата(defunct @ May 16 2006, 18:37) Цита...   May 16 2006, 14:59
||- - defunct   Цитата(Sergio66 @ May 16 2006, 17:59) Есл...   May 16 2006, 15:18
||- - Sergio66   Цитата(defunct @ May 16 2006, 19:18) Цита...   May 16 2006, 15:34
||- - Sergio66   Да, есть один нюанс, я его упустил для упрощения о...   May 16 2006, 15:45
||- - 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, 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


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

 


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


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