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
 
Сверху Снизу