Миландр

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

Часовой пояс: UTC+03:00




Начать новую тему  Ответить на тему  [ 169 сообщений ]  На страницу « 17 8 9 10 11 12 »
Автор Сообщение
 Заголовок сообщения: Re: Расчет частот тактирования
СообщениеДобавлено: 2015-ноя-05 22:14 
Не в сети

Зарегистрирован: 2015-ноя-05 22:05
Сообщения: 1
Антон спасибо за программу.
При инициализации портов, когда настраиваю тригер, получаю такой код:
MDR_PORTA->PD     |= ((1 << (2 << 16))); //режим работы входа = вкл. триг. Шмитта
Наверно должно быть так:
MDR_PORTA->PD     |= ((1 << (2 + 16))); //режим работы входа = вкл. триг. Шмитта


Вернуться к началу
 Заголовок сообщения: Re: Расчет частот тактирования
СообщениеДобавлено: 2015-ноя-06 14:56 
Не в сети

Зарегистрирован: 2013-фев-20 16:57
Сообщения: 22
AntonAS писал(а):
Всем, здравствуйте!
Спасибо за найденные баги.
К сожалению, не было времени, чтобы оперативно все исправить.
Выкладываю версию с исправлениями. + начата работа с блоком конвертирования данных, пока работает только HEX_to_BIN.
Спасибо за программу, в последней версии нашел еще один баг:
После запуска программы во вкладке CPU задаю значения: частота кварца 8МГц, множитель 10, делитель 1 (т.е HCLK=80МГц), иду во вкладку Таймер, ничего не трогаю. По умолчанию стоят значения :Таймер1, предделитель 1, делитель основного счета 1, время 1мс, при этом TIM_CLK отображается 12 МГц, при этом на экране отображается код (наверное с расчетом для 12МГц):

void Timer1_Init( void ){
MDR_RST_CLK->PER_CLOCK |= 1 << 14;//разрешение тактирования Таймера 1
MDR_RST_CLK->TIM_CLOCK = (0 /* делитель тактовой частоты Таймера 1 */
|(1 << 24)); /* разешение тактирования Таймера 1 */
MDR_TIMER1->PSG = 0x0;
MDR_TIMER1->ARR = 0x2EDF;
MDR_TIMER1->IE = (1 << 1);//разрешение прерывания по совпадению
MDR_TIMER1->CNTRL = 0x01;//счет вверх по TIM_CLK, таймер вкл.

NVIC_EnableIRQ(Timer1_IRQn);
}//void Timer_Init

Если изменить любой параметр (даже номер таймера,затем можно вернуть обратно) то TIM_CLK становится 80МГц (как и должен быть) и в коде мы видим : MDR_TIMER2->ARR = 0x1387F; // ЗНАЧЕНИЕ НЕ ДОЛЖНО ПРЕВЫШАТЬ 65536!!! ИЗМЕНИТЕ ВВЕДЕННЫЕ ЗНАЧЕНИЯ!!! (т.е. посчитал для 80МГц)

И еще , пожелание - хорошо бы отображать тактовые частоты не в герцах, а в мегагерцах или килогерцах. Отсчитывать шесть нулей не очень удобно, либо надо ввести разделители.


Вернуться к началу
 Заголовок сообщения: Re: Расчет частот тактирования
СообщениеДобавлено: 2015-ноя-09 12:56 
Не в сети
Аватара пользователя

Зарегистрирован: 2012-ноя-22 13:54
Сообщения: 72
Откуда: Нижний Новгород
Внес изменения:
  • Исправлен баг обнаруженный Petr2000 и olegbro
    Внесены пожелания olegbro
    В блоке BitByte добавлены конвертации:
    • а) HEX->BIN;
      б) HEX->DEC;
      в) BIN->HEX;
      г) DEC->HEX;


Вложения:
MilandrPLLv2.5.3.zip [317.17 КБ]
373 скачивания
Вернуться к началу
 Заголовок сообщения: Re: Расчет частот тактирования
СообщениеДобавлено: 2015-ноя-23 13:49 
Не в сети

Зарегистрирован: 2013-фев-20 16:57
Сообщения: 22
Спасибо за исправление программы.
Однако, обнаружил еще один косяк :
Расчет CAN
Исходные данные:
тактовая частота 80МГц, предделитель 1, скорость 125кбит/с
При расчете введено число 50 и SEG1=5

при расчете программа выдает
MDR_CAN1->BITTMNG = (50|(1 << 16)|(4 << 19)|(3 << 22)|(3 << 25)|(0 << 27));

кол-во квантов 12

При этом получается TQ=(50+1)/80МГЦ = 0.6375 мкс
длительность бита Tbit=12*TQ=12*0.6375 мкс=7.65 мкс, что соответствует скорости 130.8 кбит/с
хотя должно быть Tbit=1/125кб/с = 8мкс
т.е. ошибка 4.6%, при этом связь не работает.
К тому же у вас SJW=SEG2=3 (т.е. 4*TQ), хотя должно быть SJW<SEG2 (см. errata ошибка 0017).

На мой взгляд, делать отправной точкой при расчете значение BRP не совсем правильно, лучше идти от кол-ва квантов.

Для того чтобы получить работающий код я рассчитал параметры вручную по следующему алгоритму:

1. Определяем сколько периодов тактовой частоты CAN_CLK влезает в длительность передачи одного бита

N=Tbit/Tcan_clk=Fcan_clk/скорость передачи

для указанных исходных данных

N=80000кГц/125 кб/с= 640

2. Выбираем кол-во квантов n в диапазоне 8..25, так чтобы N было кратным ему, при этом ошибка будет нулевой
При N=640, подходят значения n= 8, 10, 16, 20

Я взял значение 20 (возможно надо и другое, если по этому поводу есть какие-то рекомендации, еще не изучил до конца этот вопрос)

При этом

BRP=(N/n) -1 т.е. BRP=640/20 -1 =31

3. Выбираем значения полей SEG1, SEG2, PSEG так чтобы
n*TQ=1*TQ+(1+SEG1)*TQ+(1+SEG2)*TQ+(1+PSEG)*TQ
т.е
n-4 = SEG1+SEG2+PSEG

для n=20 выбрал SEG1=SEG2=7, PSEG=2

значение поля SJW выбираем так , чтобы SJW<SEG2 (я взял 3)

Получаем MDR_CAN1->BITTMNG = (31|(2 << 16)|(7 << 19)|(7 << 22)|(3 << 25)|(0 << 27));

Все работает.

Попробовал в вашей программе ввести исходное число BRP=31, при этом правильно рассчитывается кол-во тактов 20, но SEG1 предлагает ввести в диапазоне 9-11 ,хотя оно не должно быть больше 8, и на этом расчет прекращается.

P.S. При "кривых" тактовых частотах возможно не получится выбрать кол-во квантов n, так чтобы N было кратно ему, тогда надо выбирать значения так, чтобы минимизировать ошибку скорости.


Последний раз редактировалось olegbro 2015-ноя-25 13:00, всего редактировалось 1 раз.

Вернуться к началу
 Заголовок сообщения: Re: Расчет частот тактирования
СообщениеДобавлено: 2015-ноя-24 14:35 
Не в сети
Аватара пользователя

Зарегистрирован: 2012-ноя-22 13:54
Сообщения: 72
Откуда: Нижний Новгород
Спасибо за найденную ошибку.
Постараюсь исправить по вашему алгоритму. заодно проверю по разным частотам.
За любую помощь в расчете CAN буду благодарен.


Вернуться к началу
 Заголовок сообщения: Re: Расчет частот тактирования
СообщениеДобавлено: 2015-ноя-24 14:59 
Не в сети
Аватара пользователя

Зарегистрирован: 2012-ноя-22 13:54
Сообщения: 72
Откуда: Нижний Новгород
olegbro писал(а):
n-4 = SEG1+SEG2+PSEG

для n=20 выбрал SEG1=SEG2=7, PSEG=3
20 - 4 = 7 + 7 + 3? (16 = 17)
olegbro писал(а):
значение поля SJW выбираем так , чтобы SJW<SEG2 (я взял 3)
3 < 3?

Здесь все правильно? Я сам не до конца разобрался с расчетом bittiming-а для CAN.
Когда-то делал для себя под определенную скорость и, наверно, расчет просто совпал с ручным - поэтому оставил расчет и внес его в программу.


Вернуться к началу
 Заголовок сообщения: Re: Расчет частот тактирования
СообщениеДобавлено: 2015-ноя-24 15:53 
Не в сети

Зарегистрирован: 2009-июл-21 14:13
Сообщения: 1578
Откуда: Тула
AntonAS писал(а):
3 < 3?
olegbro писал(а):
SEG1=SEG2=7, PSEG=3

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


Вернуться к началу
 Заголовок сообщения: Re: Расчет частот тактирования
СообщениеДобавлено: 2015-ноя-25 13:21 
Не в сети

Зарегистрирован: 2013-фев-20 16:57
Сообщения: 22
AntonAS писал(а):
olegbro писал(а):
n-4 = SEG1+SEG2+PSEG

для n=20 выбрал SEG1=SEG2=7, PSEG=3
20 - 4 = 7 + 7 + 3? (16 = 17)
olegbro писал(а):
значение поля SJW выбираем так , чтобы SJW<SEG2 (я взял 3)
3 < 3?

Здесь все правильно? Я сам не до конца разобрался с расчетом bittiming-а для CAN.
Когда-то делал для себя под определенную скорость и, наверно, расчет просто совпал с ручным - поэтому оставил расчет и внес его в программу.
Была опечатка, должно быть :
SEG1=SEG2=7
PSEG=2


Получаем MDR_CAN1->BITTMNG = (31|(2 << 16)|(7 << 19)|(7 << 22)|(3 << 25)|(0 << 27));

(Программу отлаживал на одном компьютере, а интернет на другом - ошибся когда переписывал)


Вернуться к началу
 Заголовок сообщения: Re: Расчет частот тактирования
СообщениеДобавлено: 2015-ноя-26 12:15 
Не в сети
Аватара пользователя

Зарегистрирован: 2012-ноя-22 13:54
Сообщения: 72
Откуда: Нижний Новгород
Выкладываю версию с исправленным расчетом CAN:
  • 1) Сделано по алгоритму olegbro.
    2) В случае "кривых" частот, происходит автоматический расчет TQ, при котором будет минимальная ошибка по скорости.
    3) Добавлен контроль вводимых значений.


Вложения:
MilandrPLLv2.5.4.zip [317.37 КБ]
353 скачивания
Вернуться к началу
 Заголовок сообщения: Re: Расчет частот тактирования
СообщениеДобавлено: 2015-ноя-26 17:09 
Не в сети

Зарегистрирован: 2013-фев-20 16:57
Сообщения: 22
Спасибо за коррекцию программы.
Однако один косячёк остался:
Задаем 125кб/с, тактовая 80 МГц,
кол-во квантов 8, SEG1=1 , SEG2=1

получаем:
// MDR_CAN1->BITTMNG = (BRP|(PSEG << 16)|(SEG1 << 19)|(SEG2 << 22)|(SJW << 25)|(SB << 27));
MDR_CAN1->BITTMNG = (79 |( 2 << 16)|( 1 << 19)|( 1 << 22)|( 3 << 25)|( 0 << 27));

т.е SJW=3 , а в соответствии с указаниями в errata (ошибка 0017) SJW должно быть меньше SEG2. Т.е в данном случае ее надо устанавливать равной 0, что соответствует диапазону подстройки в 1TQ .


Вернуться к началу
 Заголовок сообщения: Re: Расчет частот тактирования
СообщениеДобавлено: 2015-ноя-27 14:52 
Не в сети
Аватара пользователя

Зарегистрирован: 2012-ноя-22 13:54
Сообщения: 72
Откуда: Нижний Новгород
olegbro писал(а):
Спасибо за коррекцию программы.
Однако один косячёк остался:
Задаем 125кб/с, тактовая 80 МГц,
кол-во квантов 8, SEG1=1 , SEG2=1

получаем:
// MDR_CAN1->BITTMNG = (BRP|(PSEG << 16)|(SEG1 << 19)|(SEG2 << 22)|(SJW << 25)|(SB << 27));
MDR_CAN1->BITTMNG = (79 |( 2 << 16)|( 1 << 19)|( 1 << 22)|( 3 << 25)|( 0 << 27));

т.е SJW=3 , а в соответствии с указаниями в errata (ошибка 0017) SJW должно быть меньше SEG2. Т.е в данном случае ее надо устанавливать равной 0, что соответствует диапазону подстройки в 1TQ .
Исправил.
Добавляю обновленную версию 2.5.4


Вложения:
MilandrPLLv2.5.4.zip [317.61 КБ]
399 скачиваний
Вернуться к началу
 Заголовок сообщения: Re: Расчет частот тактирования
СообщениеДобавлено: 2015-дек-16 12:33 
Не в сети
Аватара пользователя

Зарегистрирован: 2012-ноя-22 13:54
Сообщения: 72
Откуда: Нижний Новгород
Пришло письмо в личку:
MikeSmith писал(а):
При инициализации ssp потерялась точка с запятой в строке

MDR_RST_CLK->SSP_CLOCK = ((0 << 8)|(1 << 25))//предделитель = /1, разрешение тактирования SSP2
Спасибо за найденный баг.
Исправил.
Добавляю версию 2.5.4.1 - в ней только это исправление.
В историю пока не добавляю.
Господа,если находятся похожие "косяки", обязательно напишите - хоть в личку, хоть на форум.


Вложения:
MilandrPLLv2.5.4.1.zip [317.57 КБ]
373 скачивания
Вернуться к началу
 Заголовок сообщения: Re: Расчет частот тактирования
СообщениеДобавлено: 2015-дек-18 10:06 
Не в сети

Зарегистрирован: 2015-окт-29 15:54
Сообщения: 31
Здравствуйте! Нашел еще одну проблемку:
При настройке частоты CPU частота устанавливается некорректно (заметил это при настройке UART). Код, сгенерированный программой:
void CPU_init ( void ){
     //Необходимая пауза для работы Flash-памяти программ
     MDR_EEPROM->CMD |= (1 << 3);

     MDR_RST_CLK->HS_CONTROL = 0x01;// вкл. HSE осцилятора
     while ((MDR_RST_CLK->CLOCK_STATUS & (1 << 2)) == 0x00);// ждем пока HSE выйдет в рабочий режим

     MDR_RST_CLK->PLL_CONTROL = ((1 << 2) | (2 << 8));//вкл. PLL  | коэф. умножения = 3
     while ((MDR_RST_CLK->CLOCK_STATUS & 0x02) != 0x02);// ждем когда PLL выйдет в раб. режим

     MDR_RST_CLK->CPU_CLOCK = ((2 << 0)//источник для CPU_C1
                             | (1 << 2)//источник для CPU_C2
                             | (0 << 4)//предделитель для CPU_C3
                             | (1 << 8));//источник для HCLK

     MDR_BKP->REG_0E |= (6 << 0); //режим встроенного регулятора напряжения DUcc
     MDR_BKP->REG_0E |= (6 << 3); //выбор доп.стабилизирующей нагрузки
}//void CPU_init


Здесть необходимо добавить строку
MDR_RST_CLK -> CPU_CLOCK = 0x00000002;
после первого 'while', иначе не устанавливается частота 48МГц.

Для теста параметры uart:
void Uart_Init( void  ){
   MDR_RST_CLK->PER_CLOCK |= (1UL << 24); //тактирование порта D

   MDR_PORTD->FUNC   |= ((2 << 1*2) | (2 << 0*2)); //режим работы порта 
   MDR_PORTD->ANALOG |= ((1 << 1)   | (1 << 0)); //цифровой
   MDR_PORTD->PWR    |= ((3 << 1*2) | (3 << 0*2)); //максимально быcтрый

   MDR_RST_CLK->PER_CLOCK |= (1UL << 7); //тактирование UART2
   MDR_RST_CLK->UART_CLOCK = ((0 << 8) /* установка делителя для UART_CLK = HCLK/1 */
                            |(1 << 25));  /* разрешение тактовой частоты UART2 */

   //Параметры делителя при частоте = 48 MHz Гц и скорости = 115 200 бит/с
   MDR_UART2->IBRD = 0x1A; //целая часть делителя скорости
   MDR_UART2->FBRD = 0x3; //дробная часть делителя скорости
   MDR_UART2->LCR_H = ((0 << 1) /* разрешение проверки четности */
                      |(0 << 2) /* четность/нечетность (Нет контроля) */
                      |(0 << 3) /* стоп-бит = 1 стоп-бит */
                      |(3 << 5) /* длина слова = 8 бит */
                      |(0 << 7)); /* передача бита четности */

   MDR_UART2->CR = ((1 << 8)|(1 << 9)|1); //передачик и приемник разрешен, разрешение приемопередатчика
}//void Uart_Init


Вернуться к началу
 Заголовок сообщения: Re: Расчет частот тактирования
СообщениеДобавлено: 2015-дек-18 16:25 
Не в сети
Аватара пользователя

Зарегистрирован: 2012-ноя-22 13:54
Сообщения: 72
Откуда: Нижний Новгород
Выкладываю новую версию:
В истории добавлены ссылки на сообщения форума с найденными ошибками
Исправлен баг в разделе SSP и CPU


Вложения:
MilandrPLLv2.6.zip [328.6 КБ]
374 скачивания


Последний раз редактировалось AntonAS 2015-дек-25 09:35, всего редактировалось 1 раз.
Вернуться к началу
 Заголовок сообщения: Re: Расчет частот тактирования
СообщениеДобавлено: 2015-дек-21 11:42 
Не в сети

Зарегистрирован: 2015-окт-29 15:54
Сообщения: 31
AntonAS, спасибо! А вы не хотите выложить программу с исходниками на github?


Вернуться к началу
Показать сообщения за:  Поле сортировки  
Начать новую тему  Ответить на тему  [ 169 сообщений ]  На страницу « 17 8 9 10 11 12 »

Часовой пояс: UTC+03:00


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

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


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

Перейти: 

Создано на основе phpBB® Forum Software © phpBB Limited
Русская поддержка phpBB