Jump to content

carlogulliani

Members
  • Content Count

    49
  • Joined

  • Last visited

Community Reputation

0 Обычный

About carlogulliani

  • Rank
    Новенький

Электроника

  • Стаж в электронике
    Менее года

Recent Profile Visitors

1277 profile views
  1. Поторопился я с выводами, похоже дело именно в инициализации трансмиттера, так как проверил плату в режиме приемника ассинхронного последовательного порта и с помощью логического анализатора четко увидел мои данные с пульта (не энкодировал их, но по преамбуле и величине пакета понял, а еще нога входа микроконтроллера дрыгается в момент передачи)
  2. Прошу прощения за долгий ответ. Спасибо за ссылку, но данный форум отключил регистрацию, а проштудировав все страницы топика, не смог найти ответ. По коду вопросов нет, скорей всего, что-то не так с платой, а конкретно с антенной частью, тк чип по SPI читается. Но даже не знаю, как проверить эту часть
  3. Глухо, наверное, не правильное слово использовал. Диапазон рабочий и я вижу данные от сенсоров соседей (если быть точным, то частота у меня 433,92), которые используют эту же частоту. Имеется ввиду, что от моего трансмиттера глухо, то есть данные ни на спектре, ни на кодировщике не вижу. Попробовал несколько инструментов, и cubicSDR, и rtl_433, и urh, нигде нет моего сигнала, хотя есть китайская железка с резонатором на 433,92 МГц, его я вижу, когда отправляю данные. По коду, уточнял у специалистов TI как работают режимы, вопросов нет. Полосу разную пробовал, в целом всегда беру с запасом или максимальную 5 кГц Дабы удостовериться, что код рабочий, заказал на Али этот чип CC1101 с выводами для подключения к MCU, чтобы протестить готовое решение. Вообще такой чип уже есть, но борда с ним использует 8-битник stm8, что немного ограничивает возможности чипа, но даже там на анализаторе я видел свой сигнал
  4. Сделал себе плату с трансивером TI CC1101, схемотехнику и разводку ревьювил у Texas Instrumets, всю пассивку взял согласно BOM листу, в итоге запаял плату, написал тест код и слушаю эфир на этой частоте с помощью RTL-SDR, все глухо. Сам чип рабочий, так как по SPI получаю значения регистров как в референсах, а также контрольные значения самого чипа (версию, и тд.) Сам трансивер имеет 2 режима передачи данных, прозрачный режим, когда MCU дергает ногу трансмиттера, а он эти биты передает и пакетный режим. Скажу, что изначально регистры для работы чипа настроил с помощью TI SmartRF, когда в прозрачном режиме дергаю ногу, анализатором вижу те биты, что передаю, в эфире не вижу. Также собрал и настроил пакетный режим, и также ничего в эфире нет. Качество пайки проверил прозвоном дорожек и микроскопом, обрывов и спайки нескольких контактов нет. Схему и трасировку приаттачил, к сожалению, не силен в радиочастотной электронике, поэтому прошу помощи сообщества подсказать или направить на поиск неисправности и решение проблемы. Хочется получить борд с 3 радио модулями WIFI/BLE/Radio. Коллизий по радио части (наложение частот) нет, так как в момент тестирования WIFI и блютуз выключены. Вся радио часть находится в верхней части платы. Сами характеристики платы стандартные, FR-4, 1.6mm,
  5. Да и так объявлял и через дефайны, в main.asm видно, что в таблице векторов данное прерывание есть - только толку от этого 0, как писал выше из прерываний все убрал, оставил только сброс флага (и установкой 0 в SR1, SR2, и чтением CC1L) печать символа, чтобы протестить, что срабатывает.
  6. Короче, ерунда какая-то с этим микроконтроллером, и флаги сбрасывал и перепроверил все - так и не входит в прерывание. Думаю забить на него, основная цель была считать и вывести декодированный сигнал, но я его анализатором считал и руками на бумаге декодировал.
  7. Компилю 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"); } } }
  8. Ребутится из-за таймера, как только не включаю его, то все ок (еще были проблемы с проводами, контакт отходил). По таймеру не входит в прерывание по захвату, в ДШ написано, что флаг прерывания стирается при чтении младших битов регистра CCR2, закомментил все в прерывании и оставил две строчки TIM2_SR1 = 0; // еще пробовал так uint16_t r = (TIM2_CCR2H << 8) | TIM2_CCR2L; printf("|\r\n"); Но так и не увидел printf, сигнал на ноге есть (вижу логическим анализатором), да и тупо подавал на пин контроллера высокий и низкий сигнал с питания 3.3v Вообще перечитал несколько раз блок про TIM2 в ДШ, перепроверил все настройки, ошибок не нашел - но почему-то не хочет работать
  9. Да, так и хочу сделать, но схема постоянное ребутится и даже до прерывания не доходит. Вот так настроил прерывание, нога настроена на вход 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; }
  10. Вот его как раз и смотрю, получается, что если у меня пришел передний фронт, то надо смотреть на вход IC1, задний - IC2. Соответственно, на прерывании проверяю регистр TIM2_SR1 if (TIM2_SR1 & 0x02){} // передний фронт if (TIM2_SR1 & 0x04){} // задний фронт
  11. К сожалению, пришлось с данным контроллером разбираться, тк китайская плата с радиочипом работает с этой схемой. Период, а вернее скваженость собираюсь декодировать, зная длину пакета. Посмотрел в референсы, захват здесь тоже можно настроить по обоим фронтам, например, так Но пока не могу понять, как мне определить, прерывание вызвало передний или задний фронт
  12. Есть 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, но как посчитать ширину пульса, ведь захват по переднему фронту, а пульс заканчивается на заднем фронте, еще и период считать
  13. Спасибо за ваш комментарий! Прерывание по переполнению сделал для того, чтобы, когда досчитает то предельного значения (в данном случае до 65535) и обнулится, не получилось так, что при первом вызове значения, условно будут, 60000, а во втором 14000, то есть дельта тогда будет не правильно считаться. CС хотел использовать для подсчета периода сигнала, условно, когда первый раз дрыгнулась нога и флаг 0, включаю таймер, как только прошел период - считаю значения СС. Про остановку таймера, вы правы, незачем.
  14. Добрый день, пытаюсь разобраться с декодированием сигнала 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; } }
×
×
  • Create New...