Регистратор данных с прерываниями
sd
Я пытаюсь сделать регистратор данных. Запись на SD - карту должна прекратиться, когда millis()
=1000. Возможно, у меня проблема между millis()
и моим прерыванием, потому что регистратор данных не останавливается после millis()
=1000. Я работаю с Arduino Mega.
#include <SPI.h>
#include <SD.h>
volatile unsigned int cuenta = 0;
unsigned char contador = 0x00;
const int chipSelect = 53;
long currentMillis = 0;
long previousMillis = 0;
long interval = 1000;
void setup() {
DDRA = B11111111;
cli();//stop interrupts
TCCR0A = 0;// set entire TCCR2A register to 0
TCCR0B = 0;// same for TCCR2B
TCNT0 = 0;//initialize counter value to 0
// set compare match register for 10000khz increments
OCR0A = 25;// = (16*10^6) / (1000*64) - 1 (must be <256)
// turn on CTC mode
TCCR0A |= (1 << WGM01);
// Set CS01 and CS00 bits for 64 prescaler
TCCR0B |= (1 << CS01) | (1 << CS00);
// enable timer compare interrupt
TIMSK0 |= (1 << OCIE0A);
sei();//allow interrupts
//periodo de cada pulso 255ms del tren total de pulsos aproximadamnte 255ms
Serial.begin(9600);
while (!Serial) {
;
}
Serial.print("Initializing SD card...");
if (!SD.begin(chipSelect)) {
Serial.println("Card failed, or not present");
while (1);
}
Serial.println("card initialized.");
}
ISR(TIMER0_COMPA_vect) {
cuenta++;
if (cuenta > 9) {
PORTA = ++contador;
cuenta = 0;
} else {
PORTA = 0X00;
}
}
void loop() {
currentMillis = millis();
if (currentMillis - previousMillis <= interval)
{
String dataString = "";
for (int analogPin = 0; analogPin < 1; analogPin++) {
int sensor = analogRead(analogPin);
dataString = String(sensor);
if (analogPin = 1) {
dataString += ",";
}
}
File dataFile = SD.open("datalog2.txt", FILE_WRITE);
if (dataFile) {
dataFile.println(dataString);
dataFile.close();
// print to the serial port too:
Serial.println(dataString);
}
else {
Serial.println("error opening datalog.txt");
}
}
}
1 ответ
▲ 2
Функция millis()
основана на счетчике, который увеличивается с помощью
прерывания переполнения таймера 0. Поскольку вы перенастроили
этот таймер так, чтобы он никогда не переполнялся, этот счетчик больше не увеличивается.
Если вы хотите настроить таймер Arduino для своих собственных целей, вам необходимо либо:
- используйте любой таймер, отличный от таймера 0, или
- освободите стандартные функции хронометража Arduino:
millis()
,micros()
иdelay()
.
Я бы предпочел первый вариант, особенно на Mega, у которого довольно много запасных таймеров.
,
@Edgar Bonet
Смотрите также:
- Режимы открытия файлов на SD-карте Arduino добавление/перезапись
- Правильная схема карты Micro SD
- Сохранение файла .txt на SD-карту и чтение данных каждого содержимого в файл txt, а затем сохранение его в переменной
- Как установить атрибуты для SD-файлов?
- Использование SD-адаптера 5 В в системе 3,3 В
- Лучшая практика буферизации для непрерывной записи на SD-карту
- Проблема с открытием нескольких текстовых файлов одновременно/по порядку с использованием <SD.h>
- DFPlayer для записи на SD-карту