carlogulliani
Members-
Постов
51 -
Зарегистрирован
-
Посещение
Тип контента
Профили
Форумы
Блоги
Весь контент carlogulliani
-
Спасибо за ответы. Прочитал заново, что написал, да, скорей всего не понятно. Собрал плату, следуя инструкции из апноута радио устройства, но не посмотрев, сделал петлю фидера в 3-4 см, естественно, ничего не ловлю, вернее ловлю на очень маленьком расстоянии, поэтому хочу согласовать антенный тракт с учетом своего фидера. Посмотрел, как это делается, в разрыв цепи паяятся кабель от анализатора, перед фидером у меня стоит П-фильтр и емкость. Вроде как вижу такой процесс, паяю провод до П-фильра, а на месте катушки паяю перемычку, замеряю R антенты и по калькулятору высчитываю катушку и емкость, чтобы КСВ был приближен к 1. Далее беру номиналы катушки и емкости и также припаиваю на плату, замеряю заново. Процесс повторяю, пока не достигну приемленного КСВ. Верно? Второй вопрос по самому проводу, который идет от анализатора до точек пайки на плате. В силу того, что на плате не предусмотрен разъем sma для согласования антенны (антенна пружинчитая, паяится на плату), снимаю с одного конца провода этот раъем и получаю две точки пайки: само жало и оплетку, жало паяю на линию к антенне, оплетку к земле, вопрос в том, есть ли особенности пайки этих двух точек? Например, при сильной скрутки оплетки меняются характеристики кабеля (сопротивление) или еще что-то. Еще третий вопрос возник, радио часть платы содержит компоненты в 0402 корпусе и из-за этого сложно подпаяться и жалом и оплеткой к ним, можно ли согласовывать на пустой плате (где ничего не припаяно) или обязательно нужен генератор для согласования? Вопрос возник, потому что изначально к анализатору подсоединяют антенну (через фидер или напрямую) и вроде как генератор в процессе не участвует.
-
Подскажите, при согласовании антенны жало коаксила надо припаивать до п-фильтра или до фидера? Ещё вопрос, есть ли особенности в пайке оплётки коаксила к земле(скручивание и тд), особенности, чтобы увеличить чистоту замера КСВ?
-
Поторопился я с выводами, похоже дело именно в инициализации трансмиттера, так как проверил плату в режиме приемника ассинхронного последовательного порта и с помощью логического анализатора четко увидел мои данные с пульта (не энкодировал их, но по преамбуле и величине пакета понял, а еще нога входа микроконтроллера дрыгается в момент передачи)
-
Прошу прощения за долгий ответ. Спасибо за ссылку, но данный форум отключил регистрацию, а проштудировав все страницы топика, не смог найти ответ. По коду вопросов нет, скорей всего, что-то не так с платой, а конкретно с антенной частью, тк чип по SPI читается. Но даже не знаю, как проверить эту часть
-
Глухо, наверное, не правильное слово использовал. Диапазон рабочий и я вижу данные от сенсоров соседей (если быть точным, то частота у меня 433,92), которые используют эту же частоту. Имеется ввиду, что от моего трансмиттера глухо, то есть данные ни на спектре, ни на кодировщике не вижу. Попробовал несколько инструментов, и cubicSDR, и rtl_433, и urh, нигде нет моего сигнала, хотя есть китайская железка с резонатором на 433,92 МГц, его я вижу, когда отправляю данные. По коду, уточнял у специалистов TI как работают режимы, вопросов нет. Полосу разную пробовал, в целом всегда беру с запасом или максимальную 5 кГц Дабы удостовериться, что код рабочий, заказал на Али этот чип CC1101 с выводами для подключения к MCU, чтобы протестить готовое решение. Вообще такой чип уже есть, но борда с ним использует 8-битник stm8, что немного ограничивает возможности чипа, но даже там на анализаторе я видел свой сигнал
-
Сделал себе плату с трансивером TI CC1101, схемотехнику и разводку ревьювил у Texas Instrumets, всю пассивку взял согласно BOM листу, в итоге запаял плату, написал тест код и слушаю эфир на этой частоте с помощью RTL-SDR, все глухо. Сам чип рабочий, так как по SPI получаю значения регистров как в референсах, а также контрольные значения самого чипа (версию, и тд.) Сам трансивер имеет 2 режима передачи данных, прозрачный режим, когда MCU дергает ногу трансмиттера, а он эти биты передает и пакетный режим. Скажу, что изначально регистры для работы чипа настроил с помощью TI SmartRF, когда в прозрачном режиме дергаю ногу, анализатором вижу те биты, что передаю, в эфире не вижу. Также собрал и настроил пакетный режим, и также ничего в эфире нет. Качество пайки проверил прозвоном дорожек и микроскопом, обрывов и спайки нескольких контактов нет. Схему и трасировку приаттачил, к сожалению, не силен в радиочастотной электронике, поэтому прошу помощи сообщества подсказать или направить на поиск неисправности и решение проблемы. Хочется получить борд с 3 радио модулями WIFI/BLE/Radio. Коллизий по радио части (наложение частот) нет, так как в момент тестирования WIFI и блютуз выключены. Вся радио часть находится в верхней части платы. Сами характеристики платы стандартные, FR-4, 1.6mm,
-
Компилю 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"); } } }
-
Ребутится из-за таймера, как только не включаю его, то все ок (еще были проблемы с проводами, контакт отходил). По таймеру не входит в прерывание по захвату, в ДШ написано, что флаг прерывания стирается при чтении младших битов регистра CCR2, закомментил все в прерывании и оставил две строчки TIM2_SR1 = 0; // еще пробовал так uint16_t r = (TIM2_CCR2H << 8) | TIM2_CCR2L; printf("|\r\n"); Но так и не увидел printf, сигнал на ноге есть (вижу логическим анализатором), да и тупо подавал на пин контроллера высокий и низкий сигнал с питания 3.3v Вообще перечитал несколько раз блок про TIM2 в ДШ, перепроверил все настройки, ошибок не нашел - но почему-то не хочет работать
-
Да, так и хочу сделать, но схема постоянное ребутится и даже до прерывания не доходит. Вот так настроил прерывание, нога настроена на вход 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; }
-
К сожалению, пришлось с данным контроллером разбираться, тк китайская плата с радиочипом работает с этой схемой. Период, а вернее скваженость собираюсь декодировать, зная длину пакета. Посмотрел в референсы, захват здесь тоже можно настроить по обоим фронтам, например, так Но пока не могу понять, как мне определить, прерывание вызвало передний или задний фронт
-
Есть 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, но как посчитать ширину пульса, ведь захват по переднему фронту, а пульс заканчивается на заднем фронте, еще и период считать
-
Спасибо
-
Спасибо за ваш комментарий! Прерывание по переполнению сделал для того, чтобы, когда досчитает то предельного значения (в данном случае до 65535) и обнулится, не получилось так, что при первом вызове значения, условно будут, 60000, а во втором 14000, то есть дельта тогда будет не правильно считаться. CС хотел использовать для подсчета периода сигнала, условно, когда первый раз дрыгнулась нога и флаг 0, включаю таймер, как только прошел период - считаю значения СС. Про остановку таймера, вы правы, незачем.
-
Добрый день, пытаюсь разобраться с декодированием сигнала 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; } }
-
Добрый день, собрал в кубе проект для 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 выводит мое устройство, может кто сталкивался с подобным?
-
Вот решение 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); } } } Спасибо за помощь. Код в первом посте действительно с ошибками, так как из проекта выдирал куски и дописывал уже в дело стенде недостающие объявления, где-то глаз замылился
-
в 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"); } } Помогите разобраться и пофиксить этот баг