как на ESP32 настроить таймер

proga-ks

✩✩✩✩✩✩✩
20 Дек 2021
11
0
как на ESP32 настроить таймер на частоту работы 70Гц

вся проблема в том что контролер все время перезапускается
вот сам скетч

C++:
//#include "bitmap.h"
#include "111.h"

unsigned long last_time;

#define X_RES          320 // pixels
#define Y_RES          240 // pixels
#define REFRESH_RATE   70  // Hz

#define S    14 ///S
#define CL1  12
#define CL2  13
#define DISP  15
#define PSD0   16
#define PSD1   5
#define PSD2   4
#define PSD3   0
#define pulseCL2() {digitalWrite(CL2, HIGH);digitalWrite(CL2, LOW);}
#define ON true
#define OFF false


char* bitmap_ptr = (char*)bitmap;


#define SWAP(b)       b = (b << 4) | (b >> 4)


//#include "gpio.h"
#include "user_interface.h"
#include "hw_timer.h"
//#include "hw_timer.c"

#define REG_READ(_r)     (*(volatile uint32 *)(_r))
#define WDEV_NOW()    REG_READ(0x3ff20c00)



uint32 tick_now2 = 0;
static uint32 j = 0;
bool state = 0;
long ledOn = 300000, ledOff = 700000;
unsigned long lastMillis = 0;



void hw_test_timer_cb() {     
  refresh();
hw_timer_arm(14285);
    }



void ICACHE_FLASH_ATTR user_init(void) {

  //hw_timer_init(NMI_SOURCE, 0);
  hw_timer_init(FRC1_SOURCE, 0);
  hw_timer_set_func(hw_test_timer_cb);
  hw_timer_arm(14285);
} // End of user_init





void WR_DATA(uint8_t data)
{
 //   gpio_set_level(REGISTER_BIT7_ON_PIN, (disp_register & 0x80) >> 7);
//    gpio_set_level(REGISTER_BIT6_ON_PIN, (disp_register & 0x40) >> 6);
//    gpio_set_level(REGISTER_BIT5_ON_PIN, (disp_register & 0x20) >> 5);
 //   gpio_set_level(REGISTER_BIT4_ON_PIN, (disp_register & 0x10) >> 4);
    digitalWrite(PSD3, (data & 0x08) >> 3);
    digitalWrite(PSD2, (data & 0x04) >> 2);
    digitalWrite(PSD1, (data & 0x02) >> 1);
    digitalWrite(PSD0, (data & 0x01));
}

void refresh()
{
 
 
  // Critical Code here
//
//digitalWrite(S, !digitalRead(S));
///digitalWrite(CL2, !digitalRead(CL2));
//digitalWrite(CL1, !digitalRead(CL1));
//digitalWrite(D0, !digitalRead(D0));
//digitalWrite(D1, !digitalRead(D1));
//digitalWrite(D2, !digitalRead(D2));
//digitalWrite(D3, !digitalRead(D3));

uint8_t x, y, bitmap_byte, bitmap_byte1;

 
  for(y = 0; y < 240; y++) {   
    for(x = 0; x < 40; x++) {
      
    //  byte thisByte = pgm_read_byte(& bitmap ++);
   //   bitmap_byte = pgm_read_byte(bitmap_ptr++);
    // bitmap_byte1 =bitmap_byte;
    //  SWAP(bitmap_byte);
      
    
    
    PGM_P data1 = pgm_read_word(bitmap_ptr++);
    //  WR_DATA( bitmap_byte);
    digitalWrite(PSD3, (data1 & 0x80) >> 7);
    digitalWrite(PSD2, (data1 & 0x40) >> 6);
    digitalWrite(PSD1, (data1 & 0x20) >> 5);
    digitalWrite(PSD0, (data1 & 0x10) >> 4);

    
     digitalWrite(CL2, HIGH); // up
     digitalWrite(CL2, LOW); // down     

      
   //  WR_DATA (bitmap_byte1);
    digitalWrite(PSD3, (data1 & 0x08) >> 3);
    digitalWrite(PSD2, (data1 & 0x04) >> 2);
    digitalWrite(PSD1, (data1 & 0x02) >> 1);
    digitalWrite(PSD0, (data1 & 0x01));
  
      digitalWrite(CL2, HIGH); // up
      digitalWrite(CL2, LOW); // down     
      

    }



    // Clear S and toggle s on start of frame
   if (y == 0) {
      digitalWrite(S, HIGH); // Set First Lime Marker
   }
  
      digitalWrite(CL1, HIGH); // up
      digitalWrite(CL1, LOW); // down 
     digitalWrite(S, LOW);
  }     



}



void setup() {

  Serial.begin(115200);                                  //Serial connection
 

    delay(500);
    Serial.println("Waiting for connection");

  // hw_timer_init(NMI_SOURCE, 0);
  hw_timer_init(FRC1_SOURCE,0);
  hw_timer_set_func(hw_test_timer_cb);
  hw_timer_arm(14285);
 
  Serial.print(" hw_timer_init ");
 
 


  pinMode(S, OUTPUT);
  pinMode(DISP, OUTPUT);
  pinMode(CL1, OUTPUT);
  pinMode(CL2, OUTPUT);
  pinMode(PSD0, OUTPUT);
  pinMode(PSD1, OUTPUT);
  pinMode(PSD2, OUTPUT);
  pinMode(PSD3, OUTPUT);

  digitalWrite(DISP, HIGH);
  digitalWrite(S, LOW);   
  digitalWrite(CL1, LOW);
  digitalWrite(CL2, LOW);

  digitalWrite(PSD0, LOW);
  digitalWrite(PSD1, LOW);
  digitalWrite(PSD2, LOW);
  digitalWrite(PSD3, LOW);



}


void loop()
{
if  (micros() - last_time > 14285)
{
  last_time = micros();
//Serial.println(FPSTR(pgm_read_word(bitmap_ptr++))); 
//refresh(); 
}

  if (millis() - lastMillis > 1000) {
    lastMillis = millis();

  //  Serial.print("LED = ");
   // Serial.println(state);
  }

 
//
//delay(2000);
}
 

vortigont

★★★★★★✩
24 Апр 2020
1,022
542
Saint-Petersburg, Russia
Вам не таймер завести нужно, вам какую-то непонятную муть запускать нужно с частотой в 70 Гц.
Ставьте задачу правильно.

C++:
void refresh();

void runner(){

  TickType_t xLastWakeTime = xTaskGetTickCount();

  for (;;){
    if ( xTaskDelayUntil( &xLastWakeTime, pdMS_TO_TICKS(1000/70) ) ) taskYIELD();
    refresh();
  }

  // Task must self-terminate
  vTaskDelete(NULL);
}

TaskHandle_t runner_h;


setup(){

xTaskCreate(runner, "runner",
        2048, // set stack size
        (void *)NUL,
        1,
        &runner_h);

}
 

proga-ks

✩✩✩✩✩✩✩
20 Дек 2021
11
0
мне с частотой 70 Гц на LCD нужно отправлять данные, на ардуино нано запустил и работает но не хватает памяти
 

proga-ks

✩✩✩✩✩✩✩
20 Дек 2021
11
0
ну трудно сказать что LM32019T очень хороший), монохромный у меня таких парочку хотелось бы их куда нибудь задействовать
 

Старик Похабыч

★★★★★★★
14 Авг 2019
4,263
1,301
Москва
Вообще дисплей - визуализация чего то. Вы уверены, что сможете улавливать данные глазом с такой частотой ?
 

proga-ks

✩✩✩✩✩✩✩
20 Дек 2021
11
0
ну если честно то это не то что бы мне именно так хочется
в даташите написано , и то я немного ошибся не 70Гц , а 80 Гц2023-08-31_21-26-26.png

возможно конечно что я из даташита что то не так понял
 
Изменено:

proga-ks

✩✩✩✩✩✩✩
20 Дек 2021
11
0
хорошо
только тогда я не пойму, на ардуино нано при выставленной частоте работы таймера на 70Гц картинка на экране четкая, а на этом камне добиться четкого изображения не получается, мерцает
 

Bruzzer

★★★✩✩✩✩
23 Май 2020
472
134
@proga-ks,
Насколько я понял у этого дисплея нет встроенной памяти, он отображает по одной строке по очереди и чтобы не было заметного мерцания надо выводить (обновлять весь экран) с частотой 80 Гц. Если так, то по моему проще купить современный дисплей.
Если спортивный интерес, то надо считать тайминги, подсчитать сколько времени занимает обновление экрана при вашем конкретном алгоритме, успеваете ли вы, и не будет ли это мешать остальным модулям ESP.
 

proga-ks

✩✩✩✩✩✩✩
20 Дек 2021
11
0
да действительно так и есть этот экран без встроенной памяти
повторюсь на ардуино нано он работает нормально, но мне не хватает там самой памяти 328 меги, поэтому решил заморочиться с этим камнем
ну и да можно сказать спортивный интерес
 

Геннадий П

★★★★★★✩
14 Апр 2021
1,969
632
44
Первое. Не нужно нонстопом в дисплей заливать данные. Нужно обновлять картинку только когда обновляются данные в ней.
Второе. ESP не лучший выбор для "ногодрыганья", он больше подходит для стандартных интерфейсов, например SPI или I2C и т.п.
 

proga-ks

✩✩✩✩✩✩✩
20 Дек 2021
11
0
@Геннадий П
на этом дисплее не получается по чему то вывести изображение не обновляя его постоянно, если прогнать данные только один раз то у него отображается только нижняя полоса
 

proga-ks

✩✩✩✩✩✩✩
20 Дек 2021
11
0
@Bruzzer,
ну это только завтра , весь проект остался на работе, да и наверное логическим анализатором будет проще измерить

@Bruzzer
одно заполнение экрана проходит за 97ms
 

Bruzzer

★★★✩✩✩✩
23 Май 2020
472
134
@proga-ks,
Если каждые 12 мс (80Гц) вызывать функцию выполняющуюся 97 мс, то это плохо. Как конкретно реагирует на такое ESP32 я не знаю.

Дополнение.
При минимальных таймингах по даташиту (период clk > 0.13 мкс) обновление экрана происходит за 2,5 мс, и остается время для других действий.
Если перейти от digitalWrite к прямой записи в порт, и не по биту за раз, а сразу 4 бита, то наверное можно сильно сократить нынешние 97 мс. (Еще ускориться можно, если поставить на тактовый сигнал внешнюю задержку- сдвиг фронта, и изменять тактовый сигнал вместе с данными). Но повторюсь - на мой взгляд польза от этого в изучении на практике быстрой работы с портами. Если нет цели изучать это, то проще купить современный экран.
 
Изменено:

proga-ks

✩✩✩✩✩✩✩
20 Дек 2021
11
0
@Bruzzer
спасибо большое за подсказку, да действительно при работе с ардуино нано я напрямую в порт писал без digitalWrite
теперь надо только разобраться как на этом камне записать сразу 4 бита в порт
 

proga-ks

✩✩✩✩✩✩✩
20 Дек 2021
11
0
@vortigont, сейчас поищу инфу, спасибо
я вот думаю а может тогда стоит попробовать SPI а LCD подключить через 74hc595
 
Изменено: