• Уважаемые посетители сайта esp8266.ru!
    Мы отказались от размещения рекламы на страницах форума для большего комфорта пользователей.
    Вы можете оказать посильную поддержку администрации форума. Данные средства пойдут на оплату услуг облачных провайдеров для сайта esp8266.ru
  • Система автоматизации с открытым исходным кодом на базе esp8266/esp32 микроконтроллеров и приложения IoT Manager. Наша группа в Telegram

RTL и приемник 433Mhz

GoblinHero

New member
Хочу собрать приёмник сигналов от метеостанции. На простейшей ардуине все работало. А здесь - перенес старый код и нифига (((. Нашел другой рабочий код от ESP8266 - тоже нифига. И что-то мне подумалось, а не мешает ли мне здесь RTOS со своей многозадачностью? Ведь мне надо измерять импульсы по 800 микросекунд. Это вообще возможно здесь? Хотя я других потоков не стартую, вайфай не включаю.
 

Юрий Ботов

Moderator
Команда форума
Какие ноги используешь? В курсе что ноги esp далеко не взаимозаменяемы?
 

pvvx

Активный участник сообщества
Ведь мне надо измерять импульсы по 800 микросекунд.
Тестовый замер длительностей импульса приходящих на PC_4 (в 800 ms):
Код:
===== Enter Image: Test ====
SoftAP ip: 192.168.4.1
atipc4
Init test...
>Period: 6396488 us (0 hz), Lo: 400001 us, Hi: 5996487 us
Period: 800001 us (1 hz), Lo: 400001 us, Hi: 400000 us
Period: 800002 us (1 hz), Lo: 400001 us, Hi: 400001 us
Period: 800001 us (1 hz), Lo: 400001 us, Hi: 400000 us
Period: 800002 us (1 hz), Lo: 400001 us, Hi: 400001 us
Period: 800001 us (1 hz), Lo: 400000 us, Hi: 400001 us
Period: 800002 us (1 hz), Lo: 400001 us, Hi: 400001 us
Period: 800001 us (1 hz), Lo: 400001 us, Hi: 400000 us
Period: 800001 us (1 hz), Lo: 400001 us, Hi: 400000 us
Period: 800002 us (1 hz), Lo: 400001 us, Hi: 400001 us
Period: 800002 us (1 hz), Lo: 400000 us, Hi: 400002 us
atipc4
DeInit test.
>?
CONSOLE COMMAND SET:
================================
ATST: Memory info
ATLW: LwIP Info
ATSB=<ADDRES(hex)>[,COUNT(dec)]: Dump byte register
ATSD=<ADDRES(hex)>[,COUNT(dec)]: Dump dword register
ATSW=<ADDRES(hex)>,<DATA(hex)>: Set register
ATDS=[TIME(ms)]: Deep sleep
ATSP=<a,r>,<wakelock_status:1|2|4|8>: Power
ATPN=<SSID>[,password[,encryption[,auto-reconnect[,reconnect pause]]]: WIFI Connect to AP
ATPA=<SSID>[,password[,encryption[,channel[,hidden[,max connections]]]]]: Start WIFI AP
ATWR: WIFI Connect, Disconnect
ATWI: WiFi Info
ATWT=<tx_power>: WiFi tx power: 0 - 100%, 1 - 75%, 2 - 50%, 3 - 25%, 4 - 12.5%
ATSF: Test TSF value
ATWP: WiFi power
ATSN: Scan networks
ATIPC4:  Test input pulse in PC_4
PR=<1/0>: Printf on/off
?: This Help
================================
>
Полный проект приложен.
Т.к. там пример с переключением на ходу типа фронта, то наблюдается ошибка - дает смещение на коротких импульсах... Но это пример чисто для проверки работоспособности прерывания по фронтам на пине (меандр 800 us с генератора на PC_4 модуля):
Код:
>atipc4
Init test...
>Period: 15341 us (65 hz), Lo: 399 us, Hi: 14942 us
Period: 809 us (1236 hz), Lo: 409 us, Hi: 400 us
Period: 808 us (1237 hz), Lo: 408 us, Hi: 400 us
Period: 808 us (1237 hz), Lo: 398 us, Hi: 410 us
Period: 808 us (1237 hz), Lo: 398 us, Hi: 410 us
Period: 809 us (1236 hz), Lo: 399 us, Hi: 410 us
Period: 809 us (1236 hz), Lo: 399 us, Hi: 410 us
Period: 809 us (1236 hz), Lo: 399 us, Hi: 410 us
Period: 809 us (1236 hz), Lo: 399 us, Hi: 410 us
Period: 809 us (1236 hz), Lo: 399 us, Hi: 410 us
Period: 809 us (1236 hz), Lo: 399 us, Hi: 410 us
Period: 809 us (1236 hz), Lo: 409 us, Hi: 400 us
Period: 809 us (1236 hz), Lo: 409 us, Hi: 400 us
atipc4
DeInit test.
>
В вашем случае достаточно задействовать один из 7 свободных аппаратных таймеров в RTL со стробом в 32768 Гц, т.к. точности до 1 us в данных задачах не требуется...
 

Вложения

Последнее редактирование:

GoblinHero

New member
Полный проект приложен.
Ух ты! Огромное спасибо. Я правда пишу в ардуино, но это не важно. Самое главное из вашего кода - использование таймера TSF я позаимствовал и все заработало. Осталось непонятное поведение. Если в функции loop() я ставлю вызов delay(), то все начинает крашиться примерно вот так:
Код:
RTL8195A[HAL]: Hard Fault Error!!!!09
RTL8195A[HAL]: R0 = 0x0
RTL8195A[HAL]: R1 = 0x1
RTL8195A[HAL]: R2 = 0x1000d5e9
RTL8195A[HAL]: R3 = 0x40080560
RTL8195A[HAL]: R12 = 0x5
RTL8195A[HAL]: LR = 0x1000d5f3
RTL8195A[HAL]: PC = 0x1000d7aa
RTL8195A[HAL]: PSR = 0x1000017
RTL8195A[HAL]: BFAR = 0x40080560
RTL8195A[HAL]: CFSR = 0x82
RTL8195A[HAL]: HFSR = 0x40000000
RTL8195A[HAL]: DFSR = 0x0
RTL8195A[HAL]: AFSR = 0x0
RTL8195A[HAL]: PriMask 0x0
RTL8195A[HAL]: BasePri 0x0
RTL8195A[HAL]: SVC priority: 0x00
RTL8195A[HAL]: PendSVC priority: 0xf0
RTL8195A[HAL]: Systick priority: 0xf0
Похоже delay как-то портит работу прерываний. Как мне правильно отправить текущий поток в сон на некоторое время?
 

pvvx

Активный участник сообщества
@GoblinHero - в режиме Station WiFi модуль у RTL автоматом переходит в режим экономии и WiFi блок работает импульсно - отключается. При отключении и возникает "протектед" при обращении в пустое адресное пространство... Надо или выключать https://esp8266.ru/forum/threads/wifi-mode-ips-lps-tdma-dtim.2424/ режимы или включать SoftAP.
По этому и написал вам - включите свободный таймер и по его счетчику 1/32768 секунды вам будет достаточно разрешения (шаг 31 мкс).
Счетчик тактов процессора вам тоже не подойдет - он так-же участвует в режимах экономии энергии...
 

GoblinHero

New member
Наконец то я выздоровел и снова взялся за проект.
По этому и написал вам - включите свободный таймер и по его счетчику 1/32768 секунды вам будет достаточно разрешения (шаг 31 мкс).
Включил:
Код:
volatile uint32_t theOregonTick = 0;
void OregonTMRHandler(uint32_t id)
{
theOregonTick++;
}
gtimer_init(&theOregonTMR, TIMER1);
gtimer_start_periodical(&theOregonTMR, GTIMER_TICK_US, (void*)OregonTMRHandler, 0);
Ничего не заработало. Начал разбираться - оказалось, что разрешение таймера ровно в два раза ниже: 1/16384. Почему так? Я что-то не так инициализирую или это особенность RTLDuino?
 

pvvx

Активный участник сообщества
Код:
extern "C" {
  #include "timer_api.h"
}

extern "C" {
void UserPreInit(void)
{
   Init_CPU_CLK_UART(1,38400); // 83.3 MHz
   // 0 - 166666666 Hz, 1 - 83333333 Hz, 2 - 41666666 Hz, 3 - 20833333 Hz, 4 - 10416666 Hz, 5 - 4000000 Hz
   // 6 - 200000000 Hz, 7 - 10000000 Hz, 8 - 50000000 Hz, 9 - 25000000 Hz, 10 - 12500000 Hz, 11 - 4000000 Hz
}
} // extern "C"

gtimer_t timer0, timer1;


int counter = 0;
void timer0handler(uint32_t data) {
  printf("TIMER%u IntCounter: %u\n", data-TIMER0, counter++);
}

void setup() {
  sys_info();
  gtimer_init(&timer0, TIMER0);
  gtimer_init(&timer1, TIMER1);
  gtimer_start(&timer0);
  gtimer_start_periodical(&timer1, 10000000, (void *)timer0handler, TIMER1);
  delay(10);
}

void loop() {
  uint32_t t = gtimer_read_tick(&timer0);
  delay(1000);
  t -= gtimer_read_tick(&timer0);
  printf("Delta(tick) = %u, Delta(ms) = %u\n", t, t*1000/32768);
}
Код:
5:26:53.909> TIMER1 IntCounter: 77
5:26:54.908> Delta(tick) = 32914, Delta(ms) = 1004
5:26:55.904> Delta(tick) = 32741, Delta(ms) = 999
5:26:56.905> Delta(tick) = 32749, Delta(ms) = 999
5:26:57.902> Delta(tick) = 32750, Delta(ms) = 999
5:26:58.901> Delta(tick) = 32751, Delta(ms) = 999
5:26:59.901> Delta(tick) = 32757, Delta(ms) = 999
RtlDuino/development/rtl87xx/libraries/GTimer/examples/gtimer_api at master · pvvx/RtlDuino · GitHub
 
Последнее редактирование:

pvvx

Активный участник сообщества
Код:
#include "us_ticker_api.h"

extern "C" {
void UserPreInit(void)
{
   Init_CPU_CLK_UART(1,38400); // 83.3 MHz
   // 0 - 166666666 Hz, 1 - 83333333 Hz, 2 - 41666666 Hz, 3 - 20833333 Hz, 4 - 10416666 Hz, 5 - 4000000 Hz
   // 6 - 200000000 Hz, 7 - 10000000 Hz, 8 - 50000000 Hz, 9 - 25000000 Hz, 10 - 12500000 Hz, 11 - 4000000 Hz
} 
} // extern "C"

void setup() {
  sys_info();
  us_ticker_init();
}

void loop() {
  uint32_t t = us_ticker_read();
  delay(1000);
  t = us_ticker_read() - t;
  printf("Delta(us) = %u\n", t);
}
Код:
5:40:37.157> CLK CPU        83333333 Hz
5:40:37.157> RAM heap    400200 bytes
5:40:37.157> TCM heap    64768 bytes
5:40:38.154> Delta(us) = 999146
5:40:39.154> Delta(us) = 999420
5:40:40.152> Delta(us) = 999267
5:40:41.151> Delta(us) = 999359
5:40:42.149> Delta(us) = 999298
5:40:43.210> Delta(us) = 999359
5:40:44.208> Delta(us) = 999298
RtlDuino/development/rtl87xx/libraries/GTimer/examples/us_ticker at master · pvvx/RtlDuino · GitHub
 
Последнее редактирование:

pvvx

Активный участник сообщества
MBED
Код:
#include "mbed.h"
#include "system_8195a.h"

Timer t;

int main() {
    printf("\r\nHello Mbed!\r\n");
    printf("CPU CLK: %u Hz\r\n", (unsigned int)SystemGetCpuClk());
    t.start();
    wait_ms(1000);
    printf("The time taken was %u us\r\n", t.read_us());
    wait_ms(1000);
    printf("The time taken was %u us\r\n", t.read_us());
}
Код:
7:22:11.881> Hello Mbed!
7:22:12.016> CPU CLK: 83333333 Hz
7:22:12.942> The time taken was 1000000 us
7:22:13.944> The time taken was 2007660 us
 
Сверху Снизу