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

 
 
> Странное поведение портов!, Мега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 16 2006, 21:23
Сообщение #2


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

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



Мне это так не кажется - передача тетрады для порта половина которого работает не передачу а остальная на прием как такового значение не имеет - в любом случае в PORTB регистр записывается байт. Для авр все равно и я честно говоря не видел ограничений на манипуляцию с gpio портами (было маленькое примечание о переходе с приема на передачу и наоборот и то что при чтении порт опаздывает как минимум на один машинный цикл но не 10 микросек при 16 МГц тактовой). Если предположить что нули выдаются дисплеем потому что может затягиватся сигнал Е на входе дисплея и при этом дисплей каким то макаром работает на передачу - не подтверждается так как без физически подключенного дисплея те же самые нули (если я правильно понял написанное).

Без кода и схемы никак .


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

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


Местный
***

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



Цитата(_artem_ @ May 17 2006, 01:23) *
Мне это так не кажется - передача тетрады для порта половина которого работает не передачу а остальная на прием как такового значение не имеет - в любом случае в PORTB регистр записывается байт. Для авр все равно и я честно говоря не видел ограничений на манипуляцию с gpio портами (было маленькое примечание о переходе с приема на передачу и наоборот и то что при чтении порт опаздывает как минимум на один машинный цикл но не 10 микросек при 16 МГц тактовой). Если предположить что нули выдаются дисплеем потому что может затягиватся сигнал Е на входе дисплея и при этом дисплей каким то макаром работает на передачу - не подтверждается так как без физически подключенного дисплея те же самые нули (если я правильно понял написанное).

Без кода и схемы никак .

Это код вывода байта в дисплей

void LCD_Write (unsigned char CMD, char type)
{
char Data;
CONFIG_CONTROL_PINS;

/*#define CONFIG_CONTROL_PINS LCD_E_PORT_DIR |=(1<<LCD_E_PIN); LCD_RS_PORT_DIR |= (1<<LCD_RS_PIN); LCD_RW_PORT_DIR |=(1<<LCD_RW_PIN);*/

SET_DATA_LINES_OUT;

/*#define SET_DATA_LINES_OUT LCD_DATA_PORT_DIR = ((1<<LCD_D4) | (1<<LCD_D5) | (1<<LCD_D6) | (1<<LCD_D7))*/

CLEAR_LCD_E; // Disable LCD

if (type == DATA) SET_LCD_DATA;
else SET_LCD_CMD; // Set LCD to command
OUT_DATA_PORT(CMD & 0xf0); //выдаем в порт старший полубайт

/* #define OUT_DATA_PORT(data) SET_LCD_READ; CLEAR_DATA_PINS; LCD_DATA_PORT |=0;/*data*/ ;SET_LCD_WRITE*/

GENERATE_E_STROB; // Write data to LCD

OUT_DATA_PORT(CMD <<4); //выдаем в порт младший полубайт
GENERATE_E_STROB; // Write data to LCD


Short_Delay(50);
}

А вот так выглядит та часть обработчика прерывания, которая опрашивает доп. устройство:

char PORTB_config = DDRB;

DDRB &= ~((1<<PB0) | (1<<PB1) | (1<<PB3) | (1<<PB4));
__delay_cycles(10); //10 тактов генератора

if ((PINB & 0x1b) )
{

if (PT_status & PT_LINE_ACTIVE) PT_status |= PT_ACTIVE;

else PT_status |=PT_LINE_ACTIVE;
}
else
{
if (PT_status & PT_LINE_ACTIVE)
PT_status &=~PT_LINE_ACTIVE;
else
PT_status &= ~PT_ACTIVE;
}
DDRB = PORTB_config;

Вот, так обстоят дела.
На сегодня доподлинно мне известно, что весь бардак из-за линии РВ5 (общей у LCD и доп. устройства). Всегда читается последний записанный бит (в случае, если прерывание встряло в работу функции обмена с дисплеем), а не фактическое состояние линии доп. устройства.

/* #define OUT_DATA_PORT(data) SET_LCD_READ; CLEAR_DATA_PINS; LCD_DATA_PORT |=0;/*data*/ ;SET_LCD_WRITE*/

Пардон, в этой строчке опечатка - это было сделано в проверочных целях, на самом деле все обстоит так:
/* #define OUT_DATA_PORT(data) SET_LCD_READ; CLEAR_DATA_PINS; LCD_DATA_PORT |=data ;SET_LCD_WRITE*/
Эскизы прикрепленных изображений
Прикрепленное изображение
 
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 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


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

 


RSS Текстовая версия Сейчас: 21st July 2025 - 08:56
Рейтинг@Mail.ru


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