• Система автоматизации с открытым исходным кодом на базе esp8266/esp32 микроконтроллеров и приложения IoT Manager. Наша группа в Telegram

Таймер esp8266 для arduino IDE

foxsto

New member
Вообщем вопрос прост как вот этот приведенный код запустить на 8266
мне нужно переписать таймер.
Код работает на меги 328
смысл в том что цикл ISR(TIMER1_COMPA_vect) имеет приоритет перед void loop() и паузит его чтобы совершить действие
в ISR(TIMER1_COMPA_vect) у меня несколько счетчиков будет и еще что то подобное ШИМ регулятора (ножки будут вкл и выкл с разной скважностью)
помогите поменять код под esp8266

Код:
enum Prescalers {
  PRESCALER_1 = 1, PRESCALER_8 = 2, PRESCALER_64 = 3, PRESCALER_256 = 4, PRESCALER_1024 = 5
};
int var =0;
int var2 =0;
int vol = 0;
int vow = 0;


void setup(){
  uint8_t prescaler = PRESCALER_64;
  uint16_t topValue = 125;
  pinMode(9, OUTPUT);
  TCCR1A = 0x40;      // Инвертирование пина 9 по сравнению
  TCCR1B = 0x08 | prescaler;  // Установить СТС режим и делитель частоты
  OCR1A = topValue;   // установить TOP равным topValue
  TIMSK1=0b00000010; // разрешение прерываний по совпадению OCR1A


 
ISR(TIMER1_COMPA_vect)
{

if (var2 == 1985) {
  vow++;
  var2 = 0;
  }
if (var == 500) {
  vol++;
  var = 0;
  }
var++;
var2++;
}

void loop() {
  //Тут у меня дисплей который все показывает
}
 

tretyakov_sa

Moderator
Команда форума
Посмотрите пример Basic Ticker. Может быть этот вариант подойдет.
 

pvvx

Активный участник сообщества
Никак. Это аппаратные таймеры, которых нет на esp8266.
Один для пользователей есть и даны примеры использования в описаниях к NON_OS_SDK. Второй используется системой.
Так-же есть примеры использования прерывания от аппаратного пользовательского таймера с включением к нему NMI, как раз для случаев генерации ШИМ.
 

Сергей_Ф

Moderator
Команда форума
@pvvx а разве его можно настроить на 16МГц/64= 250 кГц ? Как в примере у ТС.
Там ещё на 125 делится, если не ошибаюсь. Значит 2 кГц всего. Должно получится.
 
Последнее редактирование:

pvvx

Активный участник сообщества
@pvvx а разве его можно настроить на 16МГц/64= 250 кГц ? Как в примере у ТС.
Да. До 7 us - далее кранты системе. Без WiFi потянет и быстрее - 250 кГц справится.
Я АЦП опрашивал и передавал по UDP на 192 кГц, а там не в одном регистре ковыряться в прерывании... Пропуски есть, но виноват WiFi.
 
Последнее редактирование:

foxsto

New member
Один для пользователей есть и даны примеры использования в описаниях к NON_OS_SDK. Второй используется системой.
Так-же есть примеры использования прерывания от аппаратного пользовательского таймера с включением к нему NMI, как раз для случаев генерации ШИМ.
А речь не про os_timer_arm?
я погуглил немного и нашел вот такой код
Код:
//
// ESP8266 Timer Example
// SwitchDoc Labs  October 2015
//


extern "C" {
#include "user_interface.h"
}

os_timer_t myTimer;

bool tickOccured;

// start of timerCallback
void timerCallback(void *pArg) {

      tickOccured = true;

} // End of timerCallback

void user_init(void) {
/*
  os_timer_setfn - Define a function to be called when the timer fires

void os_timer_setfn(
      os_timer_t *pTimer,
      os_timer_func_t *pFunction,
      void *pArg)

Define the callback function that will be called when the timer reaches zero. The pTimer parameters is a pointer to the timer control structure.

The pFunction parameters is a pointer to the callback function.

The pArg parameter is a value that will be passed into the called back function. The callback function should have the signature:
void (*functionName)(void *pArg)

The pArg parameter is the value registered with the callback function.
*/

      os_timer_setfn(&myTimer, timerCallback, NULL);

/*
      os_timer_arm -  Enable a millisecond granularity timer.

void os_timer_arm(
      os_timer_t *pTimer,
      uint32_t milliseconds,
      bool repeat)

Arm a timer such that is starts ticking and fires when the clock reaches zero.

The pTimer parameter is a pointed to a timer control structure.
The milliseconds parameter is the duration of the timer measured in milliseconds. The repeat parameter is whether or not the timer will restart once it has reached zero.

*/

      os_timer_arm(&myTimer, 1000, true);
} // End of user_init


void setup() {


Serial.begin(115200);
Serial.println();
Serial.println();



Serial.println("");
Serial.println("--------------------------");
Serial.println("ESP8266 Timer Test");
Serial.println("--------------------------");
tickOccured = false;
user_init();

}

void loop() {

if (tickOccured == true)
{

    Serial.println("Tick Occurred");
    tickOccured = false;

}
yield();  // or delay(0);



}
какие параметры обязательны а какие можно опустить, и я так понимаю что таймер прерывается по милисекундам а не делит частоту как у меня
 

Вложения

pvvx

Активный участник сообщества
А речь не про os_timer_arm?
Нет. Он постоянно запрещается большинством процедур SDK.
Речь про аппаратный таймер. И про то, что в SDK много запретов всех аппаратных прерываний на неопределенное время. Потому только NMI, если код прерывания короткий. Для этого даже таблица векторов переносится из ROM в IRAM в последних SDK. У версии SDK, идущей с Arduino уже встроено.
 

Сергей_Ф

Moderator
Команда форума
пустить на нее RX TX (UART) от 8266
8266 может передавать по этому интерфейсу?
может, конечно. Почему бы и нет, только уровни согласуйте, хотя бы резистор на 500 Ом на RX у esp.
Ну и от задачи зависит, безусловно.

ISR(TIMER1_COMPA_vect) имеет приоритет перед void loop() и паузит его чтобы совершить действие в ISR(TIMER1_COMPA_vect)
только вот паузить loop() в любом случае надолго не стоит. В прерывании по минимуму флаги подняли и в основной цикл. Всю работу лучше там выполнять.
 

foxsto

New member
может, конечно. Почему бы и нет, только уровни согласуйте, хотя бы резистор на 500 Ом на RX у esp.
Ну и от задачи зависит, безусловно.
просто мне кажется я таким образом разгружу камень от всякого левого вычисления, 8266 будет только вайфай и дисплей держать а всю грязную работу будет делать mega328

(все равно 20 шт. мег валяется просто так, так хоть пригодятся))
 
Последнее редактирование:

foxsto

New member
Там внутри проц. Stm8, в нем есть)))
по описанию этот (процессор Stm8) с 8266 черех rx tx общается, получается никакого преимущества.
я хотел мегу328 так же подключить, зато свободных ног больше будет, вот мой самый большой +
теперь думаю не будет ли мешать таймер на 5кГц работе (UART) кто-нибудь знает?
 

=AK=

New member
Я уже че то подумываю запоять mega328 и пустить на нее RX TX (UART) от 8266
8266 может передавать по этому интерфейсу?
Передавать-то может. Вот с приемом у него проблемы. Когда отрабатываются процедуры WiFi, то принимаемое по UART сообщение может оказаться битым. Будьте готовы к тому, что время от времени у вас UART на прием просто не будет работать в течении примерно 200-300 мс. И программа ваша тоже на это время "уснет" и не сможет ничего делать.
 
Сверху Снизу