Перейти к содержанию

    

JohnKorsh

Свой
  • Публикаций

    182
  • Зарегистрирован

  • Посещение

Репутация

0 Обычный

Информация о JohnKorsh

  • Звание
    Частый гость
  • День рождения 09.06.1957

Контакты

  • AIM
    Нет
  • MSN
    Нет
  • Сайт
    http://Нет
  • ICQ
    0
  • Yahoo
    Нет

Информация

  • Город
    Россия, Москва

Старые поля

  • skype
    Нет
  • Facebook
    Нет
  • Vkontakte
    Нет
  • LinkedIn
    Нет
  • Twitter
    Нет
  • G+
    Нет
  • Одноклассники
    Нет
  1. Трансивер SX1276

    Добрый день! Код, приведённый выше не работает. Кто работал с SX1276-79, гляньте, пожалуйста, может поправите меня? Результат уж больно крамольный - ошибка в DataSheet. Отвечу на вопросы выше - корректировка нужна, в основном, при работе в узкой полосе - 7,8 КГц. и около - чутьё максимальное, но, для такой полосы надо либо TCXo с bpm, либо подстраивать, как указано в DataSheet. При кварцевых резонаторах видно на спектроанализаторе значительное различие несущих. При более широких полосах ppm кварцевого генератора вполне достаточно. В 8-битный регистр коррекции ppm пишется отклонения тактовой частоты в ppm, а не корректировка несущей. Повторюсь, в SX1276-SX1278 не замкнута петля ФАПЧ по несущей частоте. Это должен делать программист, считывая после принятия преамбулы, значение разницы частот приёмника и передатчика и самостоятельно добавляя (или вычитая) это число из текущей установки частоты. Предварительно умножив на коэффициент, зависящий от установленной полосы. Второй раз такое встречаю и именно в трансивере с ЛЧМ (первый раз - Nanotron). Попутный вопрос - не объяснит ли кто, почему так, то есть, что стоит фирме сделать это на аппаратном уровне, чтобы пользователь и не знал? Формула для расчёта коэффициента пропорциональности между отсчётом и требуемой корректировкой из DataSheet: Ferr = (([Value]*2^24)/Fxtal) * (BW [KHz]/500) (1) где: Value – число, считанное из регистров коррекции частоты [28,29,2A]; Fxtal – частота опорного кварца (32 000 000 Гц); BW – диапазон в КГц. Ferr – число, которое нужно добавлять (вычитать) к значениям регистров, задающих частоту [6,7,8]. По DataShet приёмник допускает отклонения +/- 25% от ширины полосы приёмника (стр. 37). При использовании формулы (1) сдвиг частоты намного превышает +/-25% от ширины полосы приёмника. Вне зависимости от режимов работы трансивера шаг подстройки синтезатора остаётся постоянным и равным 61 Гц. Следовательно, можно подсчитать требуемый коэффициент пропорциональности. Длина регистра отсчётов коррекции частоты 20 бит, включая знаковый бит - диапазон изменения отсчётов +/-2^19 = +/-524288. Из этого можно вывести коэффициент пропорциональности между отсчётом регистра коррекции частоты [28,29,2A] и требуемым значением корректировки частоты, которое нужно добавлять (или вычитать) из текущего значения [6,7,8]: Для диапазона 7,8 КГц вот что получается: 7,8 КГц * 0,25 = 1,95 КГц Шаг синтезатора 61 Гц, следовательно, показания отсчёта корректировки не должны быть больше 1,95/61=31,96, приблизительно, 32. Следовательно, корректировочный коэффициент должен быть 524288/32=0,000061035, а по формуле (1) это 0,008179. Это в 134 раза больше. Расчёты проведены для всех режимов работы - и всегда данные по формуле (1) надо делить на 134, то есть формула должна иметь вид: Ferr = (([Value]*2^24)/Fxtal) * (BW [KHz]/67000) (2) Если частота передатчика ниже частоты приёмника, то отсчёт положительный – в старшем разряде 0. Число из [28,29,2A], после умножения на коэффициент, надо вычитать из содержимого регистров, определяющих частоту. Если частота передатчика выше частоты приёмника, то отсчёт отрицательный – в старшем разряде 1. Полученное число, после умножения на коэффициент, надо добавлять к содержимому регистров, определяющих частоту, предварительно отбросив знаковый разряд и преобразовав результат из дополнительного кода. Проверил на практике - работает (если по формуле - приём разваливается после первой же корректировки частоты). Хотелось бы, чтобы кто-то поправил - как то не верится в ошибку в DataSheet. Да, конечное, 32/524288, а не 524288/32, приношу извинения.
  2. Оптимизация в AtmelStudio.

    Добрый вечер! Есть ли в AtmelStudio директива, позволяющая запретить оптимизацию отдельных участков кода, а не всего проекта?
  3. C и Asm в AtmelStudio

    Спасибо.
  4. C и Asm в AtmelStudio

    Добрый день! Не подскажете ли как грамотно включить две ассемблерные строки в C код? Более конкретно AtmelStudio, ATMega88PA. Для записи в EEPROM нужно, чтобы между выставлением EEMPE и выставлением EEPE прошло не более 4 тактов, то есть sbi EECR, EEMPE sbi EECR, EEPE как грамотно эту ассемблерную вставку вписать в C код?
  5. IDE для AVR

    Спасибо, Вы правы. Прерывания так "удачно" накладывались. Зря покусился на компилятор. Извиняюсь.
  6. Прерывания в Atmel Studio

    Спасибо, полегчало.
  7. IDE для AVR

    Добрый день! Мне хотелось бы спросить Вашего мнения об IDE для AVR. Я около двух лет использую бесплатную версию Atmel Studio 6.2. Работаю с ATMega88-168, то есть давно выпускающийся продукт. Пишу на C. Пока писал простенькие программки, занимающие до 30 % ресурсов - радовался компилятору и линковщику. Но потребовалось именно в такой микроконтроллер упаковать программу, занимающую 95-98% FLash ресурсов. Столкнулся с не очень понятным мне поведением результата компиляции. Для тестирования я "отстреливаю" по RS232 значения переменных в интересующие моменты времени. В коде программа считывает по SPI RSSI внешнего приёмника, после этого отстреливает мне значение не RSSI, а другой, независимой от RSSI переменной. Изменение порядка этих двух команд приводит к неустойчивой работе программы. Первый раз попробовал симулятор Atmel Studio. Совсем непонятно - перескакивает произвольно по несколько строк C-шного кода (Что потрясло, иногда сразу в середину оператора for () {...}). Ни в IAR, ни в Keil никогда такого не встречал. Убрал оптимизацию (Уровень 0) и, на всякий случай, запретил WatchDog, не помогло. К чему такие долгие объяснения? - Хотел спросить мнение разработчиков о IDE ATmel Studio, насколько надёжен результат компиляции, не лучше ли использовать CodeVision? Наверное, многие зашивали программы с использованием почти всех FLASH ресурсов микроконтроллера (95-98%). Не сталкивались ли Вы с "неустойчивыми" результатами компиляляции, возможно, есть какие то особенности?
  8. Спасибо. Просто и понятно.
  9. Добрый день! Не подскажет ли кто как подсчитать средний интервал времени между двумя ложными тревогами системы цифровой командной связи. Дано: период тактовой частоты потока команд (T), подсчитана вероятность однократного набора команды по шумам (Pe). Если кто знает, то как вывести или ссылку на источник знаний, если можно.
  10. Добрый день! Не посоветует ли кто тип защитных диодов по входу приёмника? Защититься хочу от возможных мощных сигналов, чтобы первый каскад не выгорел. Диапазон 850 МГц, то есть, ёмкость хотелось бы поменьше. Железо уже готово, поэтому, размеры хотелось поменьше. Думаю, такие есть специализированные. Искал у буржуев (NXP, Linear Technology, ST), по запросу clump diodes появляются огромные диодищи для защиты от статических разрядов, видимо, как то по-другому принято их называть.
  11. Запись в информационную Flash.

    Спасибо. Вы правы, дело именно Erase main and information memory.
  12. Запись в информационную Flash.

    Добрый день! Не подскажет ли кто причины следующего явления. Работаю с MSP430F5528. IAR, MSP-FET430UIF. Режим Debug. При записи в информационный сегмент D записанные данные во Flash читаются только в текущем сеансе отладки. Если выйти из режима отладки и снова войти, то читаются 0xFFFFFFFF – то есть сегмент стирается. При записи в сегмент A всё как и положено – после снятия и включения питания читается то, что записал. Привожу тестовые исходники для сегмента A с учётом его персонального LOCKA, хотя это копия примера. // // Write of the long word to the EEPROM. //***************************************************************** // void Write_Dayb (void) { unsigned long *Flash_ptrD = NULL; // Initialize Flash pointer Seg A. //--------------------------------------------------------------------------- Flash_ptrD = (unsigned long *) 0x1980; // Set of the segment A. // Write of the long words to the segment A. WDTCTL = WDTPW + WDTHOLD; // Stop of the WDT. asm ("DINT"); // Disable of the interrupts. // while ((FCTL3 & BUSY) == BUSY) { } // FCTL3 = FWKEY; // Clear Lock bit. FCTL3 = FWKEY + LOCKA; // Unlock of the A segment. if ((FCTL3 & LOCKA) == LOCKA) { FCTL3 = FWKEY + LOCKA; // Unlock of the A segment. } FCTL1 = FWKEY + ERASE; // Set of the segment Erase bit. *Flash_ptrD = 0; // Dummy write to erase Flash seg. while ((FCTL3 & BUSY) == BUSY) { } // FCTL1 = FWKEY + BLKWRT; // Enable long-word write. *Flash_ptrD = 0x12345678; // Write to Flash. while ((FCTL3 & BUSY) == BUSY) { } FCTL1 = FWKEY; // Clear WRT bit. FCTL3 = FWKEY + LOCK + LOCKA; // Set LOCK bits. if ((FCTL3 & LOCKA) != LOCKA) { FCTL3 = FWKEY + LOCK + LOCKA; // Set LOCK bits. } // asm ("EINT"); // Enable of the interrupts. Clr_WDT; // Start of the WDT. } // // Read of the daybook contents from the EEPROM. //***************************************************************** // void Read_Dayb (void) { unsigned long *Flash_ptrD = NULL; // Initialize Flash pointer Seg A. //--------------------------------------------------------------------------- Flash_ptrD = (unsigned long *) 0x1980; // Set of the segment A. Flash_Val = *Flash_ptrD; // (Flash_Val – global). }
  13. MSP430. Выставление напряжения ядра.

    Добрый день! Работаю с MSP430F5528. Частота кварца 8 МГц - как раз на границе графика, определяющего уровень повышения напряжения ядра. Надёжно ли оставлять уровень напряжения ядра номер 0 или надо выставить 1? (У меня критично время начальной инициализации, а время выставления уровня - это не менее 20 мСек, если всё по Exampl-у делать).