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

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


Местный
***

Группа: Свой
Сообщений: 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
_artem_
сообщение May 19 2006, 11:55
Сообщение #32


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

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



Sergio66, можно ли сделать так :
- прямо в ISR устройства проверить на состояние "все нули" и если да то получить содержимое памяти по адресу SP + 2 (стек), и выдать его на какое то устройство (уарт или чтото в этом вроде)
- откомпилировать программу без оптимизации и получить ассеемблерный листинг вперемешку с C кодом
- и все это выставить здесь (можно лишь кусок программы ) с указанием адреса откуда программа прервалась.


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

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


Местный
***

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



Цитата(_artem_ @ May 19 2006, 15:55) *
Sergio66, можно ли сделать так :
- прямо в ISR устройства проверить на состояние "все нули" и если да то получить содержимое памяти по адресу SP + 2 (стек), и выдать его на какое то устройство (уарт или чтото в этом вроде)
- откомпилировать программу без оптимизации и получить ассеемблерный листинг вперемешку с C кодом
- и все это выставить здесь (можно лишь кусок программы ) с указанием адреса откуда программа прервалась.


Все это наверное можно проделать. Но хотелось бы разобраться в чем дело. Вот еще такой эксперимент - все ноги РВ притянул к массе через 5,6 К. Обставил вывод на дисплей запретами прерываний. Теперь прерывание не влезает в процесс работы с дисплеем. Передаю в дисплей только "0", при этом дополнительное устройство работает и на одной из 4 его линий постоянно присутствует "1". Линия РВ4 - общая у дисплея и доп. устр. На нее я выдаю "0". И вот, что интересно, когда в отладчике программа останавливается при чтении из порта РВ4 "0", то AVRSTUDIO мне верно показывает наличие "1" на линии РВ4. Т.е. те сигналы, которые генерит доп. устройство на линии РВ0,1,3 читаются нормально, а вот РВ4, куда я выдал "0", читается как "0", хотя доп. устройство выдало туда "1". А отладчик показывает верно - наличие "1".
Go to the top of the page
 
+Quote Post
Sergio66
сообщение May 19 2006, 12:32
Сообщение #34


Местный
***

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



Все чудо в том, что отладчик видит "1" на линии, а программа читает "0"!!!
Go to the top of the page
 
+Quote Post
Sergio66
сообщение May 19 2006, 12:46
Сообщение #35


Местный
***

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



Цитата(_artem_ @ May 19 2006, 15:55) *
Sergio66, можно ли сделать так :
- прямо в ISR устройства проверить на состояние "все нули" и если да то получить содержимое памяти по адресу SP + 2 (стек), и выдать его на какое то устройство (уарт или чтото в этом вроде)
- откомпилировать программу без оптимизации и получить ассеемблерный листинг вперемешку с C кодом
- и все это выставить здесь (можно лишь кусок программы ) с указанием адреса откуда программа прервалась.

Кроме всего прочего, мне удалось выяснить (в отличие от того, что я писал ранее), не имеет значения где прервана программа. Я проделал со стеком то, что Вы написали, и увидел, что прерывание возникло в момент довольно длительных арифметических вычислений, абсолютно не затрагивающих работу с периферией. Т.е. не в том дело, что прерван процесс обмена с LCD, а в том, что данные выданы в линию, и остаются актуальными там несмотря на переключение порта на прием.
Go to the top of the page
 
+Quote Post
Sergio66
сообщение May 19 2006, 13:20
Сообщение #36


Местный
***

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



Вот такой кусок кода -
while (1)
{
DDRB = 0xf0;
PORTB = 0;
__disable_interrupt();
DDRB &= ~((1<<PB0) | (1<<PB1) | (1<<PB3) | (1<<PB4));
__delay_cycles(100);
data = PINB;
data&= 0x1b;
if (data == 0)
{
asm("NOP");
}
при условии, что внешнее устройство обеспечивает наличие "1" на одной из линий 0,1,3,4, мы никогда не должны попасть в ветвь "if" однако, именно туда мы и попадаем, причем только в том случае, если внешнее устройство генерит 1 на РВ4. Отладчик видит эту "1" а программа - нет.
Go to the top of the page
 
+Quote Post
_artem_
сообщение May 19 2006, 13:34
Сообщение #37


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

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



Может у вас с портом неполадки? Можно будет вывод устройства перекинуть с PB4 на PB5 ? все остальное оставьте нетронутым а в программе анaлизируйте PB5?


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

Go to the top of the page
 
+Quote Post
OlegIvanov
сообщение May 19 2006, 15:50
Сообщение #38


Участник
*

Группа: Новичок
Сообщений: 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
Сообщение #39


Местный
***

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


кекс
******

Группа: Свой
Сообщений: 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
_artem_
сообщение May 19 2006, 22:48
Сообщение #41


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

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



Sergio66, Можно поменять пин ПБ4 на какой нибудь другой ? У меня подозрение что этот пин глючный.


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

Go to the top of the page
 
+Quote Post
SasaVitebsk
сообщение May 20 2006, 00:05
Сообщение #42


Гуру
******

Группа: Свой
Сообщений: 2 712
Регистрация: 28-11-05
Из: Беларусь, Витебск, Строителей 18-4-220
Пользователь №: 11 521



Применение развязки на резисторах мягко говоря некоректно. Видел когда-то в одном из синклеров. Правильным является применение буферного элемента (например АП5/6, ИР22/33, ТМ9, 561ЛН1 и т.д.) В крайнем случае, если хотите сэкономить примените диоды и подпорку. Хотя это и не совсем ...
Далее ... при подключении двунаправленного устройства необходимо при переключении направления вывода уравнивать подпорку. Т.е. правильным является конструкция типа ...
sbi portb,WR
out portd,wl ; вывести wl в порт
cbi portb,WR ; и подтвердить
ldi wh,$0 ; на ввод
out ddrd,wh ; порт
ldi wh,$ff ; Порт подпереть
out portd,wh
данная прога при работе с FTDI245. Если последних две операции не выполнять, то возникают ошибки при чтении.
Далее ... например при чтении клавиатуры или др. устр. имеющих большую ёмкость монтажа необходимо ... сначала читать потом выводить номер столбца потом пауза и цикл повторяется. При этом 200 мкс я бы оценил как малая задержка. Желательно хотябы 1мс ожидания с момента изменения на любой из линий. Учитывая Ваши резисторы 10мс.
И последнее - у Вас, по моему, борьба со следствиями, а надо устранять причину. Т.е. реально любым предложенным способом разделить устройства (разные ноги, буферный элемент, диоды+подпорка) и разделить во времени программы их обслуживающие (например если имелось обращение к одному устройству, то перезапускается таймер отсчитывающий время до обращения к другому)
Реализацию использования общей шины для нескольких устройств можно посмотреть в примере который выложил я - "Пульт I2C".
Go to the top of the page
 
+Quote Post
_artem_
сообщение May 20 2006, 03:45
Сообщение #43


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

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



атмега 32 может давать до десяти миллиампер на выходе без особо сушественного изменения напряжения , значит ток порядка 5 мА на выходе для сохранения быстродействия при чтения по входу с учетом резистора особых хлопот атмега не доставит. В данном случае 5 мА будет диктовать минимальное значение резистора - 1 кОм при 5 вольтах питания. Давайте возьмем значение резистора больше - 5 кОм.
Теперь, максимальная входная емкость атмега для gpio равна 10 pF (таблица 119 стр 290). Для зашитного резистора значение которого мы предположили постоянная времени цепочки будет равна 10 пФ * 5 кОм = 50 наносекунд . Длительность такта процессора для частоты в 16 МГц равна 62.5 наносекунд . А так как 150-200 наносекунд достаточно для установления напряжения на входе атмега после переключения с режима выхода на вход и при том что Sergio ждет не менее чем 10 циклов (625 наносекунд) никаких проблем с входной емкостью по идее не должно быть..... если конечно Sergio использовал номинал резистора на основании которого построены эти предположения.
Прошу поправить меня если ошибся.

Такой вопрос уважаемому Segio - сколько же все таки сопротивление резистора ?)


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

Go to the top of the page
 
+Quote Post
Sergio66
сообщение May 20 2006, 11:05
Сообщение #44


Местный
***

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



Цитата(_artem_ @ May 20 2006, 07:45) *
атмега 32 может давать до десяти миллиампер на выходе без особо сушественного изменения напряжения , значит ток порядка 5 мА на выходе для сохранения быстродействия при чтения по входу с учетом резистора особых хлопот атмега не доставит. В данном случае 5 мА будет диктовать минимальное значение резистора - 1 кОм при 5 вольтах питания. Давайте возьмем значение резистора больше - 5 кОм.
Теперь, максимальная входная емкость атмега для gpio равна 10 pF (таблица 119 стр 290). Для зашитного резистора значение которого мы предположили постоянная времени цепочки будет равна 10 пФ * 5 кОм = 50 наносекунд . Длительность такта процессора для частоты в 16 МГц равна 62.5 наносекунд . А так как 150-200 наносекунд достаточно для установления напряжения на входе атмега после переключения с режима выхода на вход и при том что Sergio ждет не менее чем 10 циклов (625 наносекунд) никаких проблем с входной емкостью по идее не должно быть..... если конечно Sergio использовал номинал резистора на основании которого построены эти предположения.
Прошу поправить меня если ошибся.

Такой вопрос уважаемому Segio - сколько же все таки сопротивление резистора ?)

У нас использованы резисторы 5,6 К
Go to the top of the page
 
+Quote Post
_artem_
сообщение May 20 2006, 12:14
Сообщение #45


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

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



Mozno postavit 1 kOm i poprobovat?
Vi tak i ne soobshili o zamene porta na drugoy .


Vy oscillopgrafom na ustroystve i porte merili (pri delitele 1:10 chtob emklsot malaya byla)?


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

Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 5th September 2025 - 20:09
Рейтинг@Mail.ru


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