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

    

athlon64

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

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

  • Посещение

Репутация

0 Обычный

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

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

Контакты

  • Сайт
    http://
  • ICQ
    323635752

Информация

  • Город
    Уфа

Посетители профиля

1 523 просмотра профиля
  1. Добрый день Возможно кто-нибудь сталкивался с коммерческими САПР для проектирования печатных плат, доступ к которым можно было бы арендовать на время? Скажем на 6 или 12 месяцев. Было бы интересно оценить целесообразность покупки такой аренды для не сильно большого проекта.
  2. Подключение к i2c магнитолы

    Цитата(pavel-pervomaysk @ Jun 3 2015, 20:12) Что-то не похоже на правду. ... Что именно не похоже? При частоте 100 КГц частоты атмеги в 1 МГц уже недостаточно, не говоря уже о 400 КГц
  3. Подключение к i2c магнитолы

    После поднятия частоты атмеги всё заработало! Рекомендацию эту нашёл в документе "AVR311: Using the TWI module as I2C slave" - частота работы avr должна быть хотя бы в 16 раз выше частоты работы twi.
  4. Подключение к i2c магнитолы

    В общем в итоге имею вот что. После включения питания магнитолы (и атмеги) сразу попадаю в обработчик TWI с TWSR=0x00, переинициализирую TWI. Больше в обработчик не попадаю. Тем временем шина в магнитоле работает, TDA7563 включается. Напоминаю, что атмега и TDA7563 сидят на одной шине с одинаковыми i2c-slave адресами. Возможно с этим связана проблема, хотя, с моей точки зрения, так делать можно и если выдавать мастеру в данных только байты = 0xFF, то всё должно работать. Или я не прав? Ещё завтра попробую поднять частоту атмеги до 8МГц, сейчас 1МГц
  5. Подключение к i2c магнитолы

    Цитата(Xenia @ May 23 2015, 18:56) Попробуйте адрес 0x36, а то среди адресов I2C постоянная путаница - одни считают с младшим битом, а другие без него. Я постоянно накалываюсь - в даташите один адрес написан, а в действиельности его надо либо умножить на два, либо поделить. Т.е. попробуйте здесь: TWAR = 0x6C << 1; не делать сдвига влево. Спасибо за совет, это я попробовал сразу же тоже накалывался, и не раз но в даташите на атмегу и TDA всё однозначно написано, нужно именно TWAR = 0x6C << 1;
  6. Подключение к i2c магнитолы

    В общем выяснилось, что была ошибка в обработчике прерывания от TWI, неправильно разбирался регистр TWSR, из-за чего автомат TWI оказывался в непонятном состоянии. Для магнитолы это выглядело как 0 на SDA и включаться она отказывалась. Теперь другая проблема - атмега не фиксирует обращений по i2c-адресу TDA7563 (0x6C). Пока разбираюсь.. На случай если кому то будет интересно глянуть: Инициализация TWI: Кодvoid Init_Twi(void) {   __disable_interrupt();   TWAR = 0x6C << 1;   TWCR |= (1 << TWEN) | (1 << TWIE) | (1 << TWEA);   __enable_interrupt(); } Обработчик: CODE#pragma vector=TWI_vect __interrupt void TWI_ISR() { LED_Flash(5); switch (TWSR & 0xF8) { //=== Передача данных case 0xa8: // Принят свой адрес, будет выдача Data. case 0xb8: // Выдан байт Data, получен ACK. case 0xc0: // Выдан байт Data, получен NACK. TWDR = 0xFF; break; //=== Прием данных case 0x60: // Принят свой адрес, будет прием Data. TWI_Buff_Idx = 0; break; case 0x80: // Принят байт Data, выдан ACK. case 0x88: // Принят байт Data, выдан NACK. Tst[TWI_Buff_Idx] = TWDR; TWI_Buff_Idx++; break; case 0xa0: // При приеме в своем адресе был принят STOP или RESTART. CheckTWIbuff(); break; default: break; } TWCR |= (1 << TWINT); // Сброс флага прерывания. }
  7. Подключение к i2c магнитолы

    Приветствую всех Делаю устройство на atmega8, которое подключается к шине i2c автомагнитолы и являясь i2c-слейвом, перехватывает команды включения/выключения встроенного усилителя на TDA7563. i2c в магнитоле 3,3-вольтовая. Так вот, атмегу запрограммировал, она исправна, тактируется от внутреннего генератора 1МГц. Использую аппаратный TWI, i2c адрес установил как у TDA, но столкнулся в внезапной проблемой. Подключаю свою плату к SDA, SCL и GND магнитолы и шина магнитолы перестаёт работать, т.к. уровень на SDA, SCL держится в районе нуля. Сама атмега не запитана (пробовал и запитывать), т.е. VCC в воздухе. При отключении GND магнитолы от атмеги, работа шины восстанавливается, а на GND атмеги напряжение ~3В. Плата атмеги простейшая, стабилизатора нет (планирую питаться от 3,3В магнитолы, есть только 2 отладочных LED и всё. КЗ между SDA, SCL и GND атмеги нет.
  8. Корпус/шасси 2U

    Излазил каталог Schroff и ещё нескольких производителей, не могу найти каркас который изображен на фото. В принципе сильно похож на euroPac PRO, но у europac высота бывает только 3 или 6 юнитов. Те модели, которые предлагаются в 2U, как правило не имеют рейку с отверстиями ближе к передней панели (нужно для крепления внутрь модулей). Также обычно на боковых стенках отсутствует направляющая для удобного монтажа/демонтажа в стойку.
  9. Видимо пропуск прерывания происходит из-за того, что при обработке прерывания от одного таймера между строками Кодuint32_t timer_status = *pTIMER_STATUS; и Код*pTIMER_STATUS = 0x00FF00FF; устанавливается флаг TIMIL другого таймера и, соответственно, сразу сбрасывается без обработки. Хотя, казалось бы, вероятность такого события чрезвычайно мала) Переписал обработчик следующим образом CODE #define TIMER_STATUS_FLAGS_MASK_T0 0x00000001 #define TIMER_STATUS_FLAGS_MASK_T1 0x00000002 #define TIMER_STATUS_FLAGS_MASK_T2 0x00000004 #define TIMER_STATUS_FLAGS_MASK_T3 0x00000008 #define TIMER_STATUS_FLAGS_MASK_T4 0x00010000 #define TIMER_STATUS_FLAGS_MASK_T5 0x00020000 #define TIMER_STATUS_FLAGS_MASK_T6 0x00040000 #define TIMER_STATUS_FLAGS_MASK_T7 0x00080000 ISR(ivg13_isr) { ssync(); if (*pTIMER_STATUS & TIMIL0) { *pTIMER_STATUS = TIMER_STATUS_FLAGS_MASK_T0; ssync(); } if (*pTIMER_STATUS & TIMIL1) { *pTIMER_STATUS = TIMER_STATUS_FLAGS_MASK_T1; ssync(); } if (*pTIMER_STATUS & TIMIL2) { *pTIMER_STATUS = TIMER_STATUS_FLAGS_MASK_T2; ssync(); } if (*pTIMER_STATUS & TIMIL3) { *pTIMER_STATUS = TIMER_STATUS_FLAGS_MASK_T3; ssync(); } if (*pTIMER_STATUS & TIMIL4) { *pTIMER_STATUS = TIMER_STATUS_FLAGS_MASK_T4; ssync(); } if (*pTIMER_STATUS & TIMIL5) { *pTIMER_STATUS = TIMER_STATUS_FLAGS_MASK_T5; ssync(); } if (*pTIMER_STATUS & TIMIL6) { *pTIMER_STATUS = TIMER_STATUS_FLAGS_MASK_T6; ssync(); } if (*pTIMER_STATUS & TIMIL7) { *pTIMER_STATUS = TIMER_STATUS_FLAGS_MASK_T7; ssync(); } }
  10. Добрый день У меня в проекте на BlackFin BF523 используются 3 таймера общего назначения с генерацией прерывания по достижению значения из TIMERx_PERIOD. Случайно обнаружил что периодически происходит пропуск обработки интервала счёта. Пересмотрел ещё раз даташит на тему таймеров и не нашёл у себя ничего криминального. Функции настройки таймера: CODE uint32_t Timer_Get_SICmask(uint8_t TimerNum) { uint32_t SIC_IAR_Mask = 0xFFFFFFFF; SIC_IAR_Mask &= ~(0xF << (TimerNum << 2)); return SIC_IAR_Mask; } int8_t Timer7_Start(uint32_t FreqHz) { if (!FreqHz) return -1; // Выключаем таймер *pTIMER_DISABLE = TIMDIS7; // Настраиваем таймер *pTIMER7_CONFIG = OUT_DIS | PWM_OUT | PERIOD_CNT | IRQ_ENA; // Выход ШИМ отключен, режим PWM_OUT, счёт до периода, прерывание включено, сброс таймера в 1 (не в 0) // Ширина испульса ШИМ (в данном случае не важно) *pTIMER7_WIDTH = 1; // Период счёта таймера до обнуления с формированием запроса на прерывание *pTIMER7_PERIOD = (TMR_SCLK / FreqHz);// - 1; // Приоритет *pSIC_IAR4 = (*pSIC_IAR4 & Timer_Get_SICmask(7)) | P39_IVG(12); // Присваиваем вектор прерывания для IVG 14 REGISTER_ISR(12, ivg12_isr); // Включаем у SIC вход от периферии *pSIC_IMASK1 |= IRQ_TIMER7; // Обнуляем регистр-счётчик *pTIMER7_COUNTER = 0; // Запускаем таймер *pTIMER_ENABLE = TIMEN7; return 0; } Обработчик прерываний, общий для всех таймеров: CODE ISR(ivg12_isr) { ssync(); uint32_t timer_status = *pTIMER_STATUS; // Снимаем флаги TIMILx и TOVF_ERRx с помощью W1C *pTIMER_STATUS = 0x00FF00FF; if (timer_status & TIMIL0) { } if (timer_status & TIMIL1) { } if (timer_status & TIMIL2) { } if (timer_status & TIMIL3) { } if (timer_status & TIMIL4) { } if (timer_status & TIMIL5) { } if (timer_status & TIMIL6) { } if (timer_status & TIMIL7) { } }
  11. Цитата(Salamander @ Apr 14 2013, 02:00) Почитал еще... Поменял биты. Картинка перевернулась. А вот текст почему-то оказался в той же ориентиции, что и раньше. В подпрограмме вывода текста не нашел ничего, влияющего на ориентацию. А библиотека у меня - ucGUI Вы в правильном направлении движетесь. Любой переворот делается регистрами ILI (Бит AM и биты I/D регистра Entry Mode). Также посмотрите низкоуровневые процедуры работы с экраном (очистка экрана, закрашивание прямоугольника, вывод символа), в одном из китайских проектов видел зеркалирование на уровне этих процедур.
  12. Цитата(l_fin_l @ Dec 7 2012, 10:22) Здравствуйте, вообщем проблема такая, использую stm32f207+lwIP v1.4.0+FreeRTOS, среда IAR. Сам стек TCP/IP работает, только единственное что меня смущает, это ошибки в структуре lwip_stats->sys->mbox в поле err, число их становится все больше и больше, и за пару часов работы достигает 40000!!! При просмотре пакетов Wireshark'ом все нормально, изредка вылетают TCP_Retransmittion и TCP_ZeroWindow. Заранее спасибо. Всё, что вы описали, взаимосвязано и причина ему - косяк в sys_arch.c. Решение я приводил здесь.
  13. У этого примера от ST несколько проблем, по которым есть информация в форуме. В вашем случае скорее всего теряются пакеты из-за косяков в порте Lwip для FreeRTOS.
  14. Точная синхронизация RTC в STM32F4

    Цитата(khach @ Nov 24 2012, 16:20) Смотрите в сторону PTP. Для начала гляньте AN3411 IEEE 1588 precision time protocol demonstration for STM32F107 connectivity line microcontroller. Конечно для достижения точности в наносекунды понадобится отдельный аппаратный TimeServer. С получением точного времени у меня проблем нет. Проблема в коррекции субсекундного счётчика RTC, который пытается изменить процедура, приведённая выше. Судя по RTC->SSR, коррекция не проходит, не понятно почему. Делаю в соответствии с документом AN3371: Using the hardware real-time clock (RTC) in STM32 F0, F2, F3, F4 and L1 series of MCUs. Оказалось всё просто. После установки времени и даты в регистрах DR и TR, субсекундный счётчик сбрасывается и остаётся только вычислить и установить его новое значение. Рабочий вариант процедуры: CODEvoid RTC_TimeSync(vTime DateTime) { uint32_t TimeReg, DateReg; // Преобразование времени в BCD TimeReg = ((DateTime.Sec % 10) & 0x0F); TimeReg |= (((DateTime.Sec / 10) & 0x07) << 4); TimeReg |= (((DateTime.Min % 10) & 0x0F) << 8); TimeReg |= (((DateTime.Min / 10) & 0x07) << 12); TimeReg |= (((DateTime.Hour % 10) & 0x0F) << 16); TimeReg |= (((DateTime.Hour / 10) & 0x03) << 20); // Преобразование даты в BCD DateReg = ((DateTime.Day % 10) & 0x0F); DateReg |= (((DateTime.Day / 10) & 0x03) << 4); DateReg |= (((DateTime.Month % 10) & 0x0F) << 8); DateReg |= (((DateTime.Month / 10) & 0x01) << 12); DateReg |= (((DateTime.Year % 10) & 0x0F) << 16); DateReg |= (((DateTime.Year / 10) & 0x0F) << 20); // Пишем ключи для доступа к регистрам RTC RTC->WPR = RTC_KEY1; RTC->WPR = RTC_KEY2; if (!(RTC->ISR & RTC_ISR_INITF)) // RTC не в режиме инициализации? { RTC->ISR = (uint32_t)RTC_INIT_MASK; // Переходим в режим инициализации RTC while (!(RTC->ISR & RTC_ISR_INITF)); // Ждём установки бита INIT в RTC->ISR } RTC->TR = TimeReg; // Пишем время в RTC RTC->DR = DateReg; // Пишем дату в RTC RTC->SHIFTR = (RTC_PREDIV_S - ((t100mks * 16384) / 10000) + 1) | RTC_SHIFTR_ADD1S; RTC->ISR &= ~RTC_ISR_INIT; // Выходим из режима инициализации RTC RTC->WPR = 0xFF; // Включаем защиту регистров RTC } Всем спасибо
  15. Точная синхронизация RTC в STM32F4

    Необходимо реализовать синхронизацию даты/времени в устройстве с внешним хостом (по SNTP и другим протоколам) с точностью до сотен микросекунд. Задача, получившая эталонное время вызывает следующую функцию и передаёт ей структуру с временем: CODEvoid RTC_TimeSync(vTime DateTime) { uint32_t TimeReg, DateReg; uint32_t SSR_old, SSR_new; // Преобразование времени в BCD TimeReg = ((DateTime.Sec % 10) & 0x0F); TimeReg |= (((DateTime.Sec / 10) & 0x07) << 4); TimeReg |= (((DateTime.Min % 10) & 0x0F) << 8); TimeReg |= (((DateTime.Min / 10) & 0x07) << 12); TimeReg |= (((DateTime.Hour % 10) & 0x0F) << 16); TimeReg |= (((DateTime.Hour / 10) & 0x03) << 20); // Преобразование даты в BCD DateReg = ((DateTime.Day % 10) & 0x0F); DateReg |= (((DateTime.Day / 10) & 0x03) << 4); DateReg |= (((DateTime.Month % 10) & 0x0F) << 8); DateReg |= (((DateTime.Month / 10) & 0x01) << 12); DateReg |= (((DateTime.Year % 10) & 0x0F) << 16); DateReg |= (((DateTime.Year / 10) & 0x0F) << 20); // Пишем ключи для доступа к регистрам RTC RTC->WPR = RTC_KEY1; RTC->WPR = RTC_KEY2; if (!(RTC->ISR & RTC_ISR_INITF)) // RTC не в режиме инициализации? { RTC->ISR = (uint32_t)RTC_INIT_MASK; // Переходим в режим инициализации RTC while (!(RTC->ISR & RTC_ISR_INITF)); // Ждём установки бита INIT в RTC->ISR } RTC->TR = TimeReg; // Пишем время в RTC RTC->DR = DateReg; // Пишем дату в RTC RTC->ISR &= ~RTC_ISR_INIT; // Выходим из режима инициализации RTC RTC->WPR = 0xFF; // Включаем защиту регистров RTC // Пишем ключи для доступа к регистрам RTC RTC->WPR = RTC_KEY1; RTC->WPR = RTC_KEY2; SSR_old = RTC->SSR; // Текущее значение синхронного счётчика SSR_new = RTC_PREDIV_S - ((DateTime.t100mks * 16384) / 10000); // Желаемое значение синхронного счётчика while (RTC->ISR & RTC_ISR_SHPF); if (SSR_new >= SSR_old) // К счётчику нужно прибавить (откат времени назад) RTC->SHIFTR = SSR_new - SSR_old; else // От счётчика нужно отнять (приращение времени) RTC->SHIFTR = ((16383 - SSR_old) + SSR_new) | RTC_SHIFTR_ADD1S; RTC->WPR = 0xFF; } RTC_PREDIV_S = 0x3FFF RTC_PREDIV_A = 0x01 Дата и время (до секунд) синхронизируется нормально, а вот коррекция доли секунд не отрабатывает. Вообще. Т.е. как будто я пишу только дату и время до секунд. Если заменить RTC простым счётом по таймеру, то синхронизация проходит верно и часы идут синхронно с удалёнными часами (т.е. пересчёт между форматами времени сделан верно).