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

 
 
> LPC1766: порты ввода-вывода тормозят?
poganoe_lamerish...
сообщение Sep 27 2012, 12:39
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 28
Регистрация: 4-07-11
Пользователь №: 66 052



Завязка:
К отладочной плате olymex была варварски припаяна (так как свободно-торчащих пинов на плате нет) самодельная светодиодная матрица 2х2 (схему матрицы могу приложить, если нужно).
Какое-то время мой код для работы с этой матрицей работал без нареканий, а потом в один прекрасный момент я решил поднять частоту процессора (заюзав PLL) до 100 МГц. Светодиоды гореть перестали.
Это явление было не очень стабильным, на разных частотах код вел себя по-разному и не всегда одинаково.

На четвертый день разборок бажный код редуцировался до вот такого фрагмента, который должен выключать все светодиоды. В таком виде код работает.:
Код
LPC_GPIO1->FIOPIN |= (1<<14 | 1<<15);
LPC_GPIO1->FIOPIN &= ~(1<<16 | 1<<17);

А вот в таком - нет. PLL в обоих случаях отключен, проц тактируется от внутренней цепочки на 4Мгц.
Код
uint32_t tempPin;
uint32_t mask;

uint32_t temp;
    
tempPin = LPC_GPIO1->FIOPIN;
mask = (1<<14 | 1<<15);
tempPin |= mask;
    
LPC_GPIO1->FIOPIN = tempPin;

tempPin = LPC_GPIO1->FIOPIN;
mask = (1<<16 | 1<<17);
tempPin &= ~mask;


При пошаговой отладке работают оба варианта. Если вот этот момент
Код
LPC_GPIO1->FIOPIN = tempPin;
tempPin = LPC_GPIO1->FIOPIN;

не делать (или вставить задержку в пару тактов между этими строчками), то все работает. Т.е., насколько я понимаю, значение в регистре толи меняется, толи считывается недостаточно быстро.

Вопрос: прав ли я или проблема может быть в чем-то другом? Если я прав, где в даташите это описано или как это вообще гуглить, что делать? <_>
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
ReAl
сообщение Oct 1 2012, 17:55
Сообщение #2


Нечётный пользователь.
******

Группа: Свой
Сообщений: 2 033
Регистрация: 26-05-05
Из: Бровари, Україна
Пользователь №: 5 417



Такое поведение (когда запись на выход может в следующем такте не прочитаться со входа) — так это запросто. Вот из документации на AVR ATmega8
Цитата
Reading the Pin Value
Independent of the setting of Data Direction bit DDxn, the port pin can be read through the PINxn Register Bit. As shown in Figure 22, the PINxn Register bit and the preceding latch constitute a synchronizer. This is needed to avoid metastability if the physical pin changes value near the edge of the internal clock, but it also introduces a delay.
...
When reading back a software assigned pin value, a nop instruction must be inserted as indicated in Figure 24.
У AVR эта задержка гарантирована и фиксирована, а у LPC могло на низких частотах успевать «аналоговые» задержки (в буферах) до следующего такта выбрать, а на высоких — нет и появилась дополнительная задержка. И NOP не поможет, он растворится между двумя командами обращения к шине периферии.

По хорошему, если нужно узнать, что мы вівели в порт (а не что на него пришло снаружи), то читать надо FIOSET (текущее значение регистра выхода), это не будет зависеть ни от задержки выходного буфера от регистра до ножки, ни от задержки входного буфера и подсинхронизации после него, что всё вместе влияет на прохождение сигнала до FIOPIN.

А передавать надо один указатель на порт (структуру порта), а там уже
port->FIOPIN = port->FIOSET & ~mask;
если по какой-то причине не хочется писать
port->FIOCLR = mask;


--------------------
Ну, я пошёл… Если что – звоните…
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- poganoe_lamerishe   LPC1766: порты ввода-вывода тормозят?   Sep 27 2012, 12:39
- - RabidRabbit   А почему бы не заюзать FIOSET/FIOCLR, удобней же (...   Sep 27 2012, 13:33
|- - poganoe_lamerishe   Цитата(RabidRabbit @ Sep 27 2012, 17:33) ...   Sep 27 2012, 13:42
|- - MBR   Цитата(poganoe_lamerishe @ Sep 27 2012, 17...   Sep 28 2012, 04:55
|- - alx2   Цитата(poganoe_lamerishe @ Sep 27 2012, 18...   Sep 28 2012, 05:49
||- - poganoe_lamerishe   Цитата(alx2 @ Sep 28 2012, 09:49) В перво...   Sep 28 2012, 11:12
|- - RabidRabbit   Цитата(poganoe_lamerishe @ Sep 27 2012, 17...   Sep 28 2012, 06:49
- - poganoe_lamerishe   В целом, вопрос следующий - это вообще нормальное ...   Oct 1 2012, 15:25
|- - poganoe_lamerishe   Цитата(ReAl @ Oct 1 2012, 21:55) Такое по...   Oct 1 2012, 23:51
|- - Petka   Цитата(poganoe_lamerishe @ Oct 2 2012, 03...   Oct 2 2012, 04:46
||- - poganoe_lamerishe   Цитата(Petka @ Oct 2 2012, 08:46) Вот это...   Oct 4 2012, 10:56
|- - esaulenka   Цитата(poganoe_lamerishe @ Oct 2 2012, 03...   Oct 2 2012, 13:16
- - theBMV   Предлагаю Вам для начала посмотреть, на какой част...   Oct 3 2012, 05:35
- - theBMV   Предлагаю Вам для начала посмотреть, правильно ли ...   Oct 3 2012, 05:36
|- - RabidRabbit   Цитата(theBMV @ Oct 3 2012, 09:36) Если н...   Oct 3 2012, 06:07
|- - theBMV   Цитата(RabidRabbit @ Oct 3 2012, 10:07) Э...   Oct 4 2012, 10:17
- - esaulenka   Цитата(theBMV @ Oct 3 2012, 09:36) У меня...   Oct 4 2012, 11:29


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

 


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


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