Миландр

Ключевым подразделением нашей компании
является Центр Проектирования интегральных микросхем
Текущее время: 2019-май-20 01:57

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 18 ]  На страницу 1, 2 Все  След.
Автор Сообщение
СообщениеДобавлено: 2015-дек-01 08:49 
Не в сети

Зарегистрирован: 2015-ноя-20 16:14
Сообщения: 12
В следующем коде не происходит (иногда!!!) обнуление 11-го бита в порт-Е при частотах выше 40 МГц
RST_CLK_CPU_PLLconfig(RST_CLK_CPU_PLLsrcHSEdiv1,RST_CLK_CPU_PLLmul10);//RST_CLK_CPU_PLLmul_ХХ (_ХХ > 5!!!!)
(в последовательном вызове функций setCmdBits(CurrentCrystal); WAITn_BUSY();)
Поэтому пришлось добавить эти
////--ВОЛШЕБНЫЕ СТРОЧКИ------------!!!!!

Типа main---------------
uint32_t ret;
LCD_DATA(CurrentCrystal); /* First reading is necessary to get correct data */
setCmdBits(CurrentCrystal);
WAITn_BUSY();
ret = LCD_DATA(CurrentCrystal);
setCmdBits(CurrentCrystal);
WAITn_BUSY();
return ret;
end Типа main---------------

static void setCmdBits(uint32_t cc)
{
MDR_PORTE->RXTX &= ~(PORT_Pin_11 | PORT_Pin_4 | PORT_Pin_5);//set address e0 e1 a0
MDR_PORTE->RXTX |= (PORT_Pin_4 <<cc);//set adress e0 e1 a0
if(MDR_PORTE->RXTX & PORT_Pin_11)
MDR_PORTE->RXTX &= ~(PORT_Pin_11);//set adress e0 e1 a0
}
void WAITn_BUSY (void)
{
do
{
////--ВОЛШЕБНЫЕ СТРОЧКИ------------!!!!!
if(MDR_PORTE->RXTX & PORT_Pin_11)
MDR_PORTE->RXTX &= ~(PORT_Pin_11);//set adress e0 e1 a0
////--ВОЛШЕБНЫЕ СТРОЧКИ кончились------------!!!!!
}while ((ReadLCD_Byte() & LCD_BUSY_Msk) != 0);
}
uint32_t ReadLCD_Byte(void)
{
uint32_t ret;// = LCD_CMD(CurrentCrystal);
PORT_SetBits(MDR_PORTC, PORT_Pin_2);//clear WE
waitDelay(140);
PORT_SetBits(MDR_PORTC, PORT_Pin_7);//set CLOCK
waitDelay(320);
ret = MDR_PORTA->RXTX & 0xFF;
waitDelay(450 - 320);
PORT_ResetBits(MDR_PORTC, PORT_Pin_7);//clear CLOCK
waitDelay(8000);
return ret;
}
static void waitDelay(uint32_t tm)
{
SysTick->LOAD = tm / (1000 / 200);//16MHz
SysTick->CTRL = SysTick_CTRL_ENABLE_Msk | //SysTick_CTRL_TICKINT_Msk |
SysTick_CTRL_CLKSOURCE_Msk;
while(!(SysTick->CTRL & SysTick_CTRL_COUNTFLAG_Msk));
}

Код конечно хреноватенький мягко говоря (это первая версия задуманного - черновик), но бит то в порте не должен сам по себе устанавливаться?!! Прерываний никаких не разрешено в программе, я правильно понял, что общего флага запрета всех прерываний нет в этом процессоре?
Кто-нибудь работал с дисплеем MT-12864J при HCLK > 40 МГц ???


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 2015-дек-01 08:52 
Не в сети

Зарегистрирован: 2009-май-22 09:01
Сообщения: 1292
Откуда: АО "ПКК Миландр"
А что висит на PE11 ? Или это наша демо плата ?


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 2015-дек-01 10:20 
Не в сети

Зарегистрирован: 2015-ноя-20 16:14
Сообщения: 12
1986VE1T - демо плата (кажется где то 12 года выпуска или покупки на ней МИЛАНДР 2010 написано)
висит МЕЛТ (MT-12864J ) по стандартной схеме Е11 это А0
индикатор ломает символы без волшебных строчек как минимум,
как максимум повисает цикл запроса БИЗИ.

так вообще я корректно делаю:
MDR_PORTE->RXTX |= (PORT_Pin_4 <<cc);
сразу после
MDR_PORTE->RXTX &= ~(PORT_Pin_4 | PORT_Pin_5 | PORT_Pin_11);//set adress e0 e1 a0
может между ними пауза нужна???


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 2015-дек-01 11:17 
Не в сети

Зарегистрирован: 2009-июл-21 14:13
Сообщения: 1270
Откуда: Тула
ruhlins писал(а):
так вообще я корректно делаю:
MDR_PORTE->RXTX |= (PORT_Pin_4 <<cc);
сразу после
MDR_PORTE->RXTX &= ~(PORT_Pin_4 | PORT_Pin_5 | PORT_Pin_11);//set adress e0 e1 a0
может между ними пауза нужна???

Так может надо
Код:
MDR_PORTE->RXTX |= (cc << PORT_Pin_4);

_________________
сочувствующий…


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 2015-дек-01 11:31 
Не в сети

Зарегистрирован: 2015-ноя-20 16:14
Сообщения: 12
prostoRoman писал(а):
ruhlins писал(а):
так вообще я корректно делаю:
MDR_PORTE->RXTX |= (PORT_Pin_4 <<cc);
сразу после
MDR_PORTE->RXTX &= ~(PORT_Pin_4 | PORT_Pin_5 | PORT_Pin_11);//set adress e0 e1 a0
может между ними пауза нужна???

Так может надо
Код:
MDR_PORTE->RXTX |= (cc << PORT_Pin_4);


Нет! сс принимает значения 0 или 1
надо установить или PORT_Pin_4 - бит или PORT_Pin_5 - бит соответственно!
Но вопрос в принципе не в этом!
Я так понимаю компилятор генерит три инструкции для этой строчки:
читать порт в регистр
регистр ИЛИ с константой (со сдвинутой константой)
писать в порт регистр
Вопрос корректно ли отрабатывает проц эту последовательность,
пока писал понял что более важный вопрос был второй:
MDR_PORTE->RXTX &= ~(PORT_Pin_4 | PORT_Pin_5 | PORT_Pin_11);//set adress e0 e1 a0
MDR_PORTE->RXTX |= (PORT_Pin_4 <<cc);
первая строчка завершается записью в порт
вторая строчка начинается чтением этого порта,
ВОПРОС! - правильно ли отрабатывает конвеер процессора вот ЭТУ последовательность двух ассемблерных команд обращения к одному и тому же порту(запись и сразу чтение)!!!
на частотах >40 МГц я наблюдаю глюки!


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 2015-дек-01 12:48 
Не в сети

Зарегистрирован: 2015-ноя-20 16:14
Сообщения: 12
ruhlins писал(а):
ВОПРОС! - правильно ли отрабатывает конвеер процессора вот ЭТУ последовательность двух ассемблерных команд обращения к одному и тому же порту(запись и сразу чтение)!!!
на частотах >40 МГц я наблюдаю глюки!


И ответ похоже:
не правильно! - задержка между инструкциями помогла (заменяет волшебные строчки!)
Не зря во всех примерах и библиотеках Миландра обращения к портам обернуты вызовами функций.
Жалко конечно так снижать производительность, но работать в принципе можно.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 2015-дек-01 13:20 
Не в сети

Зарегистрирован: 2009-май-22 09:01
Сообщения: 1292
Откуда: АО "ПКК Миландр"
ruhlins писал(а):
ruhlins писал(а):
ВОПРОС! - правильно ли отрабатывает конвеер процессора вот ЭТУ последовательность двух ассемблерных команд обращения к одному и тому же порту(запись и сразу чтение)!!!
на частотах >40 МГц я наблюдаю глюки!


И ответ похоже:
не правильно! - задержка между инструкциями помогла (заменяет волшебные строчки!)
Не зря во всех примерах и библиотеках Миландра обращения к портам обернуты вызовами функций.
Жалко конечно так снижать производительность, но работать в принципе можно.


В конвейере проблем нет, возможно линия вне кристалла просто не успела переустановиться после первой записи, и вторая модификация "хватает" значение с линии еще до первой записи.
Переходные процессы вообщем, потому как если бы дело было в конвейере, то от частоты бы не зависело.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 2015-дек-01 13:40 
Не в сети

Зарегистрирован: 2015-ноя-20 16:14
Сообщения: 12
-=Sergei=- писал(а):
В конвейере проблем нет, возможно линия вне кристалла просто не успела переустановиться после первой записи, и вторая модификация "хватает" значение с линии еще до первой записи.
Переходные процессы вообщем, потому как если бы дело было в конвейере, то от частоты бы не зависело.


Вообще то да, нога же нагруженная и хорошо наверно нагружена для десятков МГц.
Хорошо, спасибо.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 2015-дек-02 11:40 
Не в сети

Зарегистрирован: 2010-июл-08 08:50
Сообщения: 734
Откуда: АО "ПКК Миландр"
В 1986ВЕ1Т есть регистры PORTx->CLRTX и PORTx->SETTX, которые позволяют модифицировать отдельные биты порта. Для повышения производительности, на мой взгляд, лучше использовать их. А также не забывайте соблюдать временную диаграмму работы шины при доступе к LCD от МЭЛТ.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 2015-дек-03 20:17 
Не в сети
Аватара пользователя

Зарегистрирован: 2011-авг-21 18:55
Сообщения: 260
Может быть ...

MDR_PORTE->OE &= ~PORT_Pin_11;
if(MDR_PORTE->RXTX & PORT_Pin_11)
MDR_PORTE->OE |= PORT_Pin_11;
MDR_PORTE->RXTX &= ~(PORT_Pin_11);//set adress e0 e1 a0

_________________
Hack the Planet!


Последний раз редактировалось R Max 2015-дек-03 20:17, всего редактировалось 1 раз.

Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 2016-апр-04 11:05 
Не в сети

Зарегистрирован: 2015-ноя-20 16:14
Сообщения: 12
Может кому то поможет - проблема была в моей привычке:
Я привык что у Атмела ноги имеют отдельные регистры:
регистр порта (управляющий выходом и хранящий это управляющее значение) PORTx
и регистр пина (только чтение актуального значения на ноге) PINx
В миландровских процессорах нет такого разделения, а я это упустил из виду и
пытался использовать значение регистра
MDR_PORTх->RXTX
как управляющее значение порта, которое я до этого в него записал (по привычке для Атмелов), что, неправильно!
Здесь надо использовать переменную, что бы хранить управляющее значение порта,
если его в дальнейшем надо использовать.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 2016-апр-04 13:11 
Не в сети

Зарегистрирован: 2009-июл-21 14:13
Сообщения: 1270
Откуда: Тула
ruhlins писал(а):
Может кому то поможет - проблема была в моей привычке:
....
В миландровских процессорах нет такого разделения, а я это упустил из виду и
пытался использовать значение регистра
MDR_PORTх->RXTX
как управляющее значение порта, которое я до этого в него записал (по привычке для Атмелов), что, неправильно!

Разделение таки есть. Регистр, хранящий значение по выходу - это PORT_RDTX (для ве1 и 3. ве90-х нет такого).
И, в случае, если у вас нет кз на линии или вывод не открытый сток, то можно пользовать RXTX как источник.

_________________
сочувствующий…


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 2016-апр-04 16:29 
Не в сети

Зарегистрирован: 2015-ноя-20 16:14
Сообщения: 12
я в spec_seriya_1986BE9x.pdf смотрю ( ТСКЯ.431296.001СП Версия 3.4.3 от 22.07.2013 )
Там никаких PORT_RDTX не находится по любым ВЕ9х.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 2016-апр-04 20:42 
Не в сети

Зарегистрирован: 2009-июл-21 14:13
Сообщения: 1270
Откуда: Тула
ruhlins писал(а):
я в spec_seriya_1986BE9x.pdf смотрю ( ТСКЯ.431296.001СП Версия 3.4.3 от 22.07.2013 )
Там никаких PORT_RDTX не находится по любым ВЕ9х.

Это спецификация на другой контроллер. Читать эту http://milandr.ru/uploads/Products/prod ... 86VE1T.pdf

_________________
сочувствующий…


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 2018-дек-25 11:12 
Не в сети

Зарегистрирован: 2014-май-19 09:18
Сообщения: 1
ruhlins писал(а):
Может кому то поможет -
Здесь надо использовать переменную, что бы хранить управляющее значение порта

Спасибо! Помогло!
Без использования переменной при последовательном выполнении операций:
MDR_PORTE->RXTX |= 0x01;
MDR_PORTE->RXTX |= 0x02;
MDR_PORTE->RXTX |= 0x04;
MDR_PORTE->RXTX |= 0x08;
вообще творится лютая дичь, хоть какие задержки между этими операциями вставляй.
Контроллер 1986ВЕ92У.


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 18 ]  На страницу 1, 2 Все  След.

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
cron
Powered by phpBB® Forum Software © phpBB Group
Русская поддержка phpBB