через 67 секунд нарушается работа таймера
- Войдите на сайт для отправки комментариев
Сб, 26/05/2018 - 18:58
#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 секунды пищалка начинает хрипеть, а светик просто горит. То есть, нарушается скважность шима, видимо..
но и светодиод визуально постоянно.
Посмотри, какая размерность переменной last_time и какой тип переменной возвращает millis. Найди два отличия.
DIYMan, спасибо! У меня глаз замылился, сам не увидел что int, а не long. Хотя странно, почему именно через 67 секунд 32 бита переполняются?
Там не 32 бита переполняются, а 16, и не через 57 секунд, а через 65.536 секунды.
я секундомером считал, поэтому ошибся на 1.5 секунды, но так то точнее конечно )
Я думал int 32 bit :)
Зависит от конкретного контроллера.
На 8 и 16-разрядных контроллерах - 16 разрядов, на 32-разрядных - 32.
32 битный тот, который на Due?
32 битный тот, который на Due?
Да. Советую на будущее юзать int8_t, uint8_t, int16_t, uint16_t, int32_t, uint32_t и т.п. - сразу видна разрядность переменной, и не зависит от платформы. Ардуина, что очевидно - прекрасно понимает эти типы.
unsigned long в моем случае это uint32_t ?
И во всех остальных случаях - тоже.
А в варианте с Due нет 64 битного типа данных?
А проверить?