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

|
Цитата(defunct @ May 17 2006, 19:49)  Цитата(Sergio66 @ May 17 2006, 18:35)  Я только что проделал такой эксперимент - я отключтл дисплей, отключил доп. устройство и запустил программу так, как будто все подключено. Только функция работы с дисплеем выдает все "1" во все линии порта В. В обработчике прервания я вижу PINB в "1"! Т.е. ноги висят в воздухе, я выдаю на них "1", потом переключаюсь на прием, и вижу на них те же "1"! Может быть я просто имею "битую" микросхему?
Нет  микросхема не битая. Вы выводите 1 в Port, тем самым вы подключаете внутренний Pull-up резистор, и МК ведет себя совершенно адекватно считывая 1 с соответствующего PinX. Проведите пожалуйста такой эксперимент как вам посоветовал _artem: __disable_interrupts(); OUT_DATA_PORT; __enable_interrupts(); или: asm("cli"); //вывод обеих тетрад на LCD asm("sei"); Должно все работать Это на результат не влияет. Т.к. я уже выдал "1" на линии, запрет прерываний не имеет в данном случае ровно никакого значения, т.к. в процедуре обработки прер-я я переключаю линии на прием, и "1" после этого в них не выдаю, так, что пулл ап резисторы я не подключаю. Но читаю на пинах то ,что выдал в порт.
|
|
|
|
|
May 19 2006, 12:13
|
Местный
  
Группа: Свой
Сообщений: 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".
|
|
|
|
|
May 19 2006, 12:46
|
Местный
  
Группа: Свой
Сообщений: 235
Регистрация: 9-02-05
Пользователь №: 2 526

|
Цитата(_artem_ @ May 19 2006, 15:55)  Sergio66, можно ли сделать так : - прямо в ISR устройства проверить на состояние "все нули" и если да то получить содержимое памяти по адресу SP + 2 (стек), и выдать его на какое то устройство (уарт или чтото в этом вроде) - откомпилировать программу без оптимизации и получить ассеемблерный листинг вперемешку с C кодом - и все это выставить здесь (можно лишь кусок программы ) с указанием адреса откуда программа прервалась. Кроме всего прочего, мне удалось выяснить (в отличие от того, что я писал ранее), не имеет значения где прервана программа. Я проделал со стеком то, что Вы написали, и увидел, что прерывание возникло в момент довольно длительных арифметических вычислений, абсолютно не затрагивающих работу с периферией. Т.е. не в том дело, что прерван процесс обмена с LCD, а в том, что данные выданы в линию, и остаются актуальными там несмотря на переключение порта на прием.
|
|
|
|
|
May 19 2006, 15:50
|
Участник

Группа: Новичок
Сообщений: 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 в порт. При переключении на вход это уже автоматом подтягивающие резисторы.
|
|
|
|
|
May 19 2006, 20:16
|

кекс
     
Группа: Свой
Сообщений: 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, либо наоборот нулем будет давить еденицу, недалеко так и попалить одно из двух или МК или устройство). На вашем месте, я бы давно уже подыскал любой другой свободный пин, и подключил бы к нему злополучный вывод устройства. Организовать "шару" это не такая уж простая задача как может показаться на первый взгляд.
|
|
|
|
|
May 20 2006, 00:05
|
Гуру
     
Группа: Свой
Сообщений: 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".
|
|
|
|
|
May 20 2006, 11:05
|
Местный
  
Группа: Свой
Сообщений: 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 К
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|