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

carlogulliani

Members
  • Постов

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

  • Посещение

Весь контент carlogulliani

  1. Спасибо за ответы. Прочитал заново, что написал, да, скорей всего не понятно. Собрал плату, следуя инструкции из апноута радио устройства, но не посмотрев, сделал петлю фидера в 3-4 см, естественно, ничего не ловлю, вернее ловлю на очень маленьком расстоянии, поэтому хочу согласовать антенный тракт с учетом своего фидера. Посмотрел, как это делается, в разрыв цепи паяятся кабель от анализатора, перед фидером у меня стоит П-фильтр и емкость. Вроде как вижу такой процесс, паяю провод до П-фильра, а на месте катушки паяю перемычку, замеряю R антенты и по калькулятору высчитываю катушку и емкость, чтобы КСВ был приближен к 1. Далее беру номиналы катушки и емкости и также припаиваю на плату, замеряю заново. Процесс повторяю, пока не достигну приемленного КСВ. Верно? Второй вопрос по самому проводу, который идет от анализатора до точек пайки на плате. В силу того, что на плате не предусмотрен разъем sma для согласования антенны (антенна пружинчитая, паяится на плату), снимаю с одного конца провода этот раъем и получаю две точки пайки: само жало и оплетку, жало паяю на линию к антенне, оплетку к земле, вопрос в том, есть ли особенности пайки этих двух точек? Например, при сильной скрутки оплетки меняются характеристики кабеля (сопротивление) или еще что-то. Еще третий вопрос возник, радио часть платы содержит компоненты в 0402 корпусе и из-за этого сложно подпаяться и жалом и оплеткой к ним, можно ли согласовывать на пустой плате (где ничего не припаяно) или обязательно нужен генератор для согласования? Вопрос возник, потому что изначально к анализатору подсоединяют антенну (через фидер или напрямую) и вроде как генератор в процессе не участвует.
  2. Подскажите, при согласовании антенны жало коаксила надо припаивать до п-фильтра или до фидера? Ещё вопрос, есть ли особенности в пайке оплётки коаксила к земле(скручивание и тд), особенности, чтобы увеличить чистоту замера КСВ?
  3. Поторопился я с выводами, похоже дело именно в инициализации трансмиттера, так как проверил плату в режиме приемника ассинхронного последовательного порта и с помощью логического анализатора четко увидел мои данные с пульта (не энкодировал их, но по преамбуле и величине пакета понял, а еще нога входа микроконтроллера дрыгается в момент передачи)
  4. Прошу прощения за долгий ответ. Спасибо за ссылку, но данный форум отключил регистрацию, а проштудировав все страницы топика, не смог найти ответ. По коду вопросов нет, скорей всего, что-то не так с платой, а конкретно с антенной частью, тк чип по SPI читается. Но даже не знаю, как проверить эту часть
  5. Глухо, наверное, не правильное слово использовал. Диапазон рабочий и я вижу данные от сенсоров соседей (если быть точным, то частота у меня 433,92), которые используют эту же частоту. Имеется ввиду, что от моего трансмиттера глухо, то есть данные ни на спектре, ни на кодировщике не вижу. Попробовал несколько инструментов, и cubicSDR, и rtl_433, и urh, нигде нет моего сигнала, хотя есть китайская железка с резонатором на 433,92 МГц, его я вижу, когда отправляю данные. По коду, уточнял у специалистов TI как работают режимы, вопросов нет. Полосу разную пробовал, в целом всегда беру с запасом или максимальную 5 кГц Дабы удостовериться, что код рабочий, заказал на Али этот чип CC1101 с выводами для подключения к MCU, чтобы протестить готовое решение. Вообще такой чип уже есть, но борда с ним использует 8-битник stm8, что немного ограничивает возможности чипа, но даже там на анализаторе я видел свой сигнал
  6. Сделал себе плату с трансивером TI CC1101, схемотехнику и разводку ревьювил у Texas Instrumets, всю пассивку взял согласно BOM листу, в итоге запаял плату, написал тест код и слушаю эфир на этой частоте с помощью RTL-SDR, все глухо. Сам чип рабочий, так как по SPI получаю значения регистров как в референсах, а также контрольные значения самого чипа (версию, и тд.) Сам трансивер имеет 2 режима передачи данных, прозрачный режим, когда MCU дергает ногу трансмиттера, а он эти биты передает и пакетный режим. Скажу, что изначально регистры для работы чипа настроил с помощью TI SmartRF, когда в прозрачном режиме дергаю ногу, анализатором вижу те биты, что передаю, в эфире не вижу. Также собрал и настроил пакетный режим, и также ничего в эфире нет. Качество пайки проверил прозвоном дорожек и микроскопом, обрывов и спайки нескольких контактов нет. Схему и трасировку приаттачил, к сожалению, не силен в радиочастотной электронике, поэтому прошу помощи сообщества подсказать или направить на поиск неисправности и решение проблемы. Хочется получить борд с 3 радио модулями WIFI/BLE/Radio. Коллизий по радио части (наложение частот) нет, так как в момент тестирования WIFI и блютуз выключены. Вся радио часть находится в верхней части платы. Сами характеристики платы стандартные, FR-4, 1.6mm,
  7. Да и так объявлял и через дефайны, в main.asm видно, что в таблице векторов данное прерывание есть - только толку от этого 0, как писал выше из прерываний все убрал, оставил только сброс флага (и установкой 0 в SR1, SR2, и чтением CC1L) печать символа, чтобы протестить, что срабатывает.
  8. Короче, ерунда какая-то с этим микроконтроллером, и флаги сбрасывал и перепроверил все - так и не входит в прерывание. Думаю забить на него, основная цель была считать и вывести декодированный сигнал, но я его анализатором считал и руками на бумаге декодировал.
  9. Компилю SDCC, первая ошибка была, что прототип обработчика прерываний должен быть в файле с main функцией, иначе он ее не линкует. В итоге вынес сам обработчик в main.c. Теперь смотрю ассемблер код (таблицу векторов) и доташит, вектор совпадает, но результат все тот же. Убрал из обработчика все лишнее, вывожу только printf, в последовательном порту ничего, ну кроме того, что не ребутится больше. Упростил еще больше, в обработчике оставил только одну строчку, которая переключает флаг и в main функции в цикле, если флаг true, то печатаю printf , тоже ничего (поднял приоритет прерывание до High) Таблица векторов прерывания (первый столбик - номер прерывания, последний адрес) ;-------------------------------------------------------- ; interrupt vector ;-------------------------------------------------------- .area HOME __interrupt_vect: int s_GSINIT ; reset int 0x000000 ; trap int 0x000000 ; int0 int 0x000000 ; int1 int 0x000000 ; int2 int 0x000000 ; int3 int 0x000000 ; int4 int 0x000000 ; int5 int 0x000000 ; int6 int 0x000000 ; int7 int 0x000000 ; int8 int 0x000000 ; int9 int 0x000000 ; int10 int 0x000000 ; int11 int 0x000000 ; int12 int 0x000000 ; int13 int _TIM2_CAP_COM ; int14 ISR_TIM2_CC(TIM2_CAP_COM) { TIM2_CC_FLAG = 1; } void main(void) { ... while(1){ if(TIM2_CC_FLAG) { TIM2_CC_FLAG = 0; printf("/\r\n"); } } }
  10. Ребутится из-за таймера, как только не включаю его, то все ок (еще были проблемы с проводами, контакт отходил). По таймеру не входит в прерывание по захвату, в ДШ написано, что флаг прерывания стирается при чтении младших битов регистра CCR2, закомментил все в прерывании и оставил две строчки TIM2_SR1 = 0; // еще пробовал так uint16_t r = (TIM2_CCR2H << 8) | TIM2_CCR2L; printf("|\r\n"); Но так и не увидел printf, сигнал на ноге есть (вижу логическим анализатором), да и тупо подавал на пин контроллера высокий и низкий сигнал с питания 3.3v Вообще перечитал несколько раз блок про TIM2 в ДШ, перепроверил все настройки, ошибок не нашел - но почему-то не хочет работать
  11. Да, так и хочу сделать, но схема постоянное ребутится и даже до прерывания не доходит. Вот так настроил прерывание, нога настроена на вход void tim2_init(void) { tim2_DeInit(); TIM2_PSCR = 0x04;// 16/2^4 = 1MHz // set up capture compare //(N=4 samples filter, input for CH1=TI2FP1) TIM2_CCMR1 |= (1 << 1); // CC1 channel is configured as input, IC1 is mapped on TI2FP1 TIM2_CCMR1 |= (1 << 5); // Input capture 1 filter, N = 4 //(N=4 samples filter, input for CH2=TI2FP2) TIM2_CCMR2 |= (1 << 0); // CC2 channel is configured as input, IC2 is mapped on TI2FP2 TIM2_CCMR2 |= (1 << 5); // Input capture 2 filter, N = 4 TIM2_CCER1 |= (1 << 4); // Capture enable for CC2IE TIM2_CCER1 |= (1 << 0); // Capture enable for CC1IE // Enable interruption and start timer TIM2_IER |= (1 << 0); // set bit CC2IE TIM2_IER |= (1 << 1); // set bit CC1IE TIM2_IER |= (1 << 2); // set bit UIE // start timer TIM2_CR1 = 0x01; }
  12. Вот его как раз и смотрю, получается, что если у меня пришел передний фронт, то надо смотреть на вход IC1, задний - IC2. Соответственно, на прерывании проверяю регистр TIM2_SR1 if (TIM2_SR1 & 0x02){} // передний фронт if (TIM2_SR1 & 0x04){} // задний фронт
  13. К сожалению, пришлось с данным контроллером разбираться, тк китайская плата с радиочипом работает с этой схемой. Период, а вернее скваженость собираюсь декодировать, зная длину пакета. Посмотрел в референсы, захват здесь тоже можно настроить по обоим фронтам, например, так Но пока не могу понять, как мне определить, прерывание вызвало передний или задний фронт
  14. Есть stm8s003 с подключенной к ноге PD3 периферией, которая генерирует ШИМ сигнал с +- одинаковым периодом, но с разной шириной пульса, где ширина пульса < половины периода - это 0, а ширина пульса > Т/2 - это 1. Для решения данной задачи хочу настроить таймер на режим захват/сравнение. Так как сигнал на ноге D3, то беру таймер 2 со 2 каналом Частоту контроллера ставлю 16МГц, а таймера 1МГц CLK_CKDIVR = 0; // 16MHz CLK_PCKENR1 = 0xFF; // Тактирование периферии CLK_PCKENR2 = 0; А далее инициирую таймер, запускаю и слушаю прерывания ISR_TIM2_CC(TIM2_CAP_COM) { // как считать ширину пульса и период? } void tim2_DeInit(void) { TIM2_CR1 = 0; TIM2_IER = 0; TIM2_SR1 = 0; TIM2_SR2 = 0; TIM2_EGR = 0; TIM2_CCMR1 = 0; TIM2_CCMR2 = 0; TIM2_CCMR3 = 0; TIM2_CCER1 = 0; TIM2_CCER2 = 0; TIM2_CNTRH = 0; TIM2_CNTRL = 0; TIM2_PSCR = 0; TIM2_ARRH = 0xFF; TIM2_ARRL = 0xFF; TIM2_CCR1H = 0; TIM2_CCR1L = 0; TIM2_CCR2H = 0; TIM2_CCR2L = 0; TIM2_CCR3H = 0; TIM2_CCR3L = 0; } void tim2_init(void) { tim2_DeInit(); TIM2_PSCR = 0x04;// 16/2^4 = 1MHz // Настройка режима захвата сравнения TIM2_CCMR2 = 0x01; TIM2_CCER2 = 0x20 | 0x11; // Прерывание и включение TIM2_IER |= (1 << 2); // канал 2 для захвата/сравнения TIM2_CR1 = TIM2_CR1_ARPE | TIM2_CR1_CEN; } Есть неуверенность в настройке захвата и я так понимаю, что прерывание срабатывает по каждому переднему фронту, и чтобы посчитать ширину пульса, мне надо ввести некий флаг, если flag = 0, но как посчитать ширину пульса, ведь захват по переднему фронту, а пульс заканчивается на заднем фронте, еще и период считать
  15. Спасибо за ваш комментарий! Прерывание по переполнению сделал для того, чтобы, когда досчитает то предельного значения (в данном случае до 65535) и обнулится, не получилось так, что при первом вызове значения, условно будут, 60000, а во втором 14000, то есть дельта тогда будет не правильно считаться. CС хотел использовать для подсчета периода сигнала, условно, когда первый раз дрыгнулась нога и флаг 0, включаю таймер, как только прошел период - считаю значения СС. Про остановку таймера, вы правы, незачем.
  16. Добрый день, пытаюсь разобраться с декодированием сигнала ASK/OOK на stm8s003. В OOK главную роль играют период сигнала, так, например, 0 - 400 мкс, 1 - 800 мкс. +- 10%. Поэтому основная для меня проблема считать количество микросекунд между событиями, в ардуино за это отвечает функция micros() Включаю внутреннее тактирование 16МГц, настраиваю таймер TIM1 на частоту 1MHz (1 микросекунда), у таймера стоит прерывание по переполнению, и когда счетчик доходит до предела, я в некую переменную добавляю максимальное значение счетчика, на выводе вижу не те значения, которые ожидаю, также попробовал считать через capture compare, тоже безрезультатно #include "stm8s.h" #include "timer.h" #include "gpio.h" volatile uint32_t tick = 0; //Interruption ISR_TIM1(TIM1_OVF) { tick += 65535; TIM1_SR1 &= ~0x01; // clear all interrupt flags TIM1_SR1 = 0; TIM1_SR2 = 0; TIM1_CR1 = 0; TIM1_CCER1 &= ~0X11; // STOP TIMER //TIM1_SR1 = 0; //PinToggle(PORTD, PIN5); } uint8_t flag = 0; ISR_TIM1_CC(TIM1_CAP_COM) { if (TIM1_SR1 & 0x01) { TIM1_SR1 = 0; TIM1_CR1 = 0; TIM1_CCER1 &= ~0x11; if (TIM1_SR2) { TIM1_SR2 = 0; flag = 1; } else { flag = 0; } } if (TIM1_SR1 & 0x02) { TIM1_SR1 &= ~0x02; } } uint32_t systick() { return (uint32_t)(TIM1_CNTRH << 8) | TIM1_CNTRL; } uint32_t millis() { return tick + (systick() / (F_CPU / 1000)); } uint32_t micros() { return tick + (systick() / (F_CPU / 1000000ul)); } void tim1_init(void) { // 1MHz = 1uS TIM1_PSCRH = 0x00; TIM1_PSCRL = 0x15; TIM1_IER = 0x04 | 0x02 | 0x01; // Enable interrups TIM1_CCMR1 = 1; TIM1_CCMR2 = 2; TIM1_CCER1 = 0x20; TIM1_SMCR = 0x54; } void tim1_start() { TIM1_CNTRH = 0; TIM1_CNTRL = 0; TIM1_CCR2H = 0; TIM1_CCR2L = 0; TIM1_CCER1 |= 0x11; TIM1_CR1 = 0x01; } uint16_t tim1_pulse_len() { return ((uint16_t)(TIM1_CCR2H << 8) | TIM1_CCR2L); } Принимаю сигнал ISR_PORTD(handlerD) { state = PinRead(GD0_PORT, GD0_PIN); uint32_t m = micros(); if (state == HIGH) { lolen = m - prevtime; printf("//"); } else { hilen = m - prevtime; printf("\\"); } prevtime = m; if (state == HIGH) { if (flag == 0) { // the end of packet if (CheckValue(Pe, hilen) && CheckValue(Pe2, lolen)) // valid 1 { printf("OK-PE\r\n"); if (bcounter < 32) code1 = (code1 << 1) | 1; else if (bcounter < 64) code2 = (code2 << 1) | 1; bcounter++; } else if (CheckValue(Pe2, hilen) && CheckValue(Pe, lolen)) // valid 0 { printf("OK-PE2\r\n"); if (bcounter < 32) code1 = (code1 << 1) | 0; else if (bcounter < 64) code2 = (code2 << 1) | 0; bcounter++; } else bcounter = 0; } else { if (bcounter < 32) code1 = (code1 << 1) | 1; else if (bcounter < 64) code2 = (code2 << 1) | 1; bcounter++; } } //printf("bcounter: %d\r\n", bcounter); if (bcounter >= 65) { printf("Got: %x %x\r\n", code1, code2); Pe2 = lolen; Pe = hilen; flag = 1; bcounter = 0; code1 = 0; code2 = 0; } }
  17. Добрый день, собрал в кубе проект для USB HID, ничего лишнего, только инициализация USB, выбор HID и настройка внешнего кварца. Частота 72 для всего устройства и 48 для USB, скорость передачи 12Мбит/с Затем изменил несколько дефайнов и сам дескриптор устройства #define HID_EPIN_SIZE 0x08 #define HID_MOUSE_REPORT_DESC_SIZE 187 ... 0x01, /*nInterfaceProtocol : 0=none, 1=keyboard, 2=mouse*/ дескриптор устройства забрал из видео от STMElectronics Там же в видео и описана структура данных для передачи Отправляю один символ R (код 0x15 согласно этому документу) uint8_t USB_TX_BUF[8] = {0}; ... while(1) { USB_TX_BUF[3] = 0x15; USBD_HID_SendReport(&hUsbDeviceFS, USB_TX_BUF, 8); HAL_Delay(100); USB_TX_BUF[3] = 0x00; USBD_HID_SendReport(&hUsbDeviceFS, USB_TX_BUF, 8); HAL_Delay(100); } И ничего не отправляется, хотя lsusb выводит мое устройство, может кто сталкивался с подобным?
  18. Вот решение void SPI1_IRQHandler(void) { if (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_RXNE)) { RX_BUF[index] = SPI_I2S_ReceiveData(SPI1); index++; if(index >= RX_LEN) { index = 0; print_buf(32); } } } Спасибо за помощь. Код в первом посте действительно с ошибками, так как из проекта выдирал куски и дописывал уже в дело стенде недостающие объявления, где-то глаз замылился
  19. Проблема решилась. В SPI1_IRQHandler я считывал данные в цикле, надо было писать в буффер, инкрементируя его индекс. Вроде получается, что пришёл один байт, а я в цикле его BUF_LEN раз читаю. Ещё переписал немного обработчик, доберусь до компа, выложу решение
  20. Код работает, до момента приемки данных. А в чем "явные ошибки"??? Что не так с GPIO? На текущий момент есть задача использовать stdperph, причем тут HAL?
  21. в main.c есть бесконечный цикл, где постоянно опрашиваются датчики, управляется светодиодами и тд. И вот когда срабатывает прерывание на приемку SPI, после чтения всех байтов - управление не возвращается и бесконечный цикл не возобновляется (светодиоды не мигают а находятся в последнем состоянии перед прерывание, принт не печатает). Пакет данным у меня 32 байта, при этом в самом прерывании все 32 байта считываются. Если убрать while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_RXNE) == RESET); в ф-ции SPI_RW(), то бесконечный цикл работает, но каждый байт считывается по много раз (иногда слишком много) - то есть проблема либо с этим циклом, либо с приоритетом прерывания у SPI, пробовал ему 7 выставлять - то же самое. Я собрал тестовый стенд с минимум кода, где эта проблема воспроизводится // SPI.c #include "SPI.h" #include "stdio.h" #include "stm32f10x.h" void SPI_Init(void) { GPIO_InitTypeDef GPIO_InitDef; SPI_InitTypeDef SPI_InitDef; // initialize init structs GPIO_StructInit(&GPIO_InitDef); SPI_StructInit(&SPI_InitDef); // initialize clocks RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1 | RCC_APB2Periph_AFIO | RCC_APB2Periph_GPIOA, ENABLE); // initialize A4/SS alternate function open-drain (50 MHz) GPIO_InitDef.GPIO_Pin = GPIO_Pin_4 | GPIO_Pin_6; GPIO_InitDef.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_InitDef.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA, &GPIO_InitDef); // initialize A5/SCK alternate function open-drain (50 MHz) GPIO_InitDef.GPIO_Pin = GPIO_Pin_5 | GPIO_Pin_7; GPIO_InitDef.GPIO_Mode = GPIO_Mode_IN_FLOATING; GPIO_InitDef.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA, &GPIO_InitDef); // initialize SPI slave // for slave, no need to define SPI_BaudRatePrescaler SPI_InitDef.SPI_Direction = SPI_Direction_2Lines_FullDuplex; SPI_InitDef.SPI_Mode = SPI_Mode_Slave; SPI_InitDef.SPI_DataSize = SPI_DataSize_8b; // 8-bit transactions SPI_InitDef.SPI_FirstBit = SPI_FirstBit_MSB; // MSB first SPI_InitDef.SPI_CPOL = SPI_CPOL_Low; // CPOL = 0, clock idle low SPI_InitDef.SPI_CPHA = SPI_CPHA_1Edge; // CPHA = 1 SPI_InitDef.SPI_NSS = SPI_NSS_Soft; // use hardware SS SPI_InitDef.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_64; // APB2 72/64 = 1.125 MHz SPI_InitDef.SPI_CRCPolynomial = 7; SPI_Init(SPI1, &SPI_InitDef); SPI_I2S_ITConfig(SPI1, SPI_I2S_IT_RXNE, ENABLE); SPI_Cmd(SPI1, ENABLE); NVIC_EnableIRQ(SPI1_IRQn); NVIC_SetPriority(SPI1_IRQn, 7); printf("SPI bus init success...\r\n"); } void SPI_RW() { while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_IT_RXNE) == RESET); return SPI_I2S_ReceiveData(SPI1); } // main.c #include "stm32f10x.h" #include "stm32f10x_gpio.h" #include "stm32f10x_rcc.h" #include "stm32f10x_spi.h" #include "SPI.h" #ifdef OS_USE_SEMIHOSTING extern void initialise_monitor_handles(void); #endif static void SysTickConfig(void) { /* Setup SysTick Timer for 10ms interrupts */ if (SysTick_Config(SystemCoreClock / 1000)) { /* Capture error */ while (1); } /* Configure the SysTick handler priority */ NVIC_SetPriority(SysTick_IRQn, 1); // if I change Priority to 0 then I can't catch SPI' interruption } uint8_t RX_LEN = 32; uint8_t RX_BUF[RX_LEN] = {0}; void print_buf(uint8_t len) { for (uint8_t i=0; i<len; i++) { printf("0x%02x \r\n", RX_BUF[i]); } printf("\r\n"); } void SPI1_IRQn(void) { for (uint8_t i=0; i<RX_LEN; i++) { RX_BUF[i] = SPI_RW(); } print_buf(RX_LEN); } void main() { /* Enable semihosting */ #ifdef OS_USE_SEMIHOSTING initialise_monitor_handles(); #endif /* SysTickConfig */ SysTickConfig(); SPI_Init(); while(1) { printf("hello\r\n"); } } Помогите разобраться и пофиксить этот баг
  22. Я имел ввиду резервуар в диспенсере, но судя по-всему его там нет
  23. Спасибо! А что значит стравливать? Устройство не разбирал, но предполагаю, что там есть свой резервуар для воздуха, я же могу по монометру отследить, например, наполнение до 90%?
×
×
  • Создать...