через 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 битного типа данных?
А проверить?