через 67 секунд нарушается работа таймера

freeman86
Offline
Зарегистрирован: 07.09.2016
#include <SPI.h>
#include "nRF24L01.h"
#include "RF24.h"

RF24 radio(9,10); 

byte led = 3; // led 
byte beep = 5; // пищалка с шимом
byte pipeNo, gotByte;  

unsigned int last_time;
unsigned int last_time1;
byte address[][6] = {"1Node","2Node","3Node","4Node","5Node","6Node"};  

void setup(){

  pinMode(beep, OUTPUT); 
  pinMode(led, OUTPUT); 

 
  radio.begin(); 
  radio.setAutoAck(1);         
  radio.setRetries(0,15);     
  radio.enableAckPayload();    
  radio.setPayloadSize(32);    

  radio.openReadingPipe(1,address[0]);     
  radio.setChannel(0x60);  

  radio.setPALevel (RF24_PA_MAX); 
  radio.setDataRate (RF24_250KBPS); 
 
  radio.powerUp(); 
  radio.startListening(); 
}

void loop() {
                           
    while( radio.available(&pipeNo)){    
      radio.read( &gotByte, 1 );        
      }
      
      
    if(gotByte) {
      if (millis()- last_time > 250) {
       last_time = millis();
         digitalWrite(led, HIGH);
         analogWrite(beep, 15);
          if(millis() - last_time1 > 500){
            last_time1 = millis();
           digitalWrite(led, LOW);
           analogWrite(beep, 0);
              }
             }
            }
    if(!gotByte){
      digitalWrite(led, LOW);
       analogWrite(beep, 0);
    }
}

Суть устройства: он по модулю nRF24L01 принимает от такого же модуля сигнал HIGH или LOW. Затем конвертирует это в цифровой сигнал на светодиод и шим на пищалку. И все вроде бы работает, но первые ~ 67 секунд (от момента загрузки контроллера, а не от подачи сигнала). Из чего я думаю на то, что какой-то косяк с таймером. После 67 секунды пищалка начинает хрипеть, а светик просто горит. То есть, нарушается скважность шима, видимо..

freeman86
Offline
Зарегистрирован: 07.09.2016

но и светодиод визуально постоянно.

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

Посмотри, какая размерность переменной last_time и какой тип переменной возвращает millis. Найди два отличия.

freeman86
Offline
Зарегистрирован: 07.09.2016

DIYMan, спасибо! У меня глаз замылился, сам не увидел что int, а не long. Хотя странно, почему именно через 67 секунд 32 бита переполняются? 

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Там не 32 бита переполняются, а 16, и не через 57 секунд, а через 65.536 секунды.

freeman86
Offline
Зарегистрирован: 07.09.2016

я секундомером считал, поэтому ошибся на 1.5 секунды, но так то точнее конечно ) 

Я думал int 32 bit :) 

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Зависит от конкретного контроллера.

На 8 и 16-разрядных контроллерах - 16 разрядов, на 32-разрядных - 32.

freeman86
Offline
Зарегистрирован: 07.09.2016

32 битный тот, который на Due?

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

freeman86 пишет:

32 битный тот, который на Due?

Да. Советую на будущее юзать int8_t, uint8_t, int16_t, uint16_t, int32_t, uint32_t и т.п. - сразу видна разрядность переменной, и не зависит от платформы. Ардуина, что очевидно - прекрасно понимает эти типы.

freeman86
Offline
Зарегистрирован: 07.09.2016

unsigned long в моем случае это uint32_t

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

И во всех остальных случаях - тоже.

freeman86
Offline
Зарегистрирован: 07.09.2016

А в варианте с Due нет 64 битного типа данных?

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

А проверить?