Не работает программа при размере буфера 4000 байт

artaf
Offline
Зарегистрирован: 19.08.2014

Не работает очень простой код, но в чем дело мне понять не удается. Если размер буфера установить в 4*100, то прогармма работает, если - 4*1000, то - нет. Буду признателен за помощь.

#define PIN_RX 2
#define INT0 0
#define BUF_SIZE 4*1000

volatile unsigned long rx_last;
volatile bool listening;
volatile byte data[BUF_SIZE];
volatile unsigned int capacity=BUF_SIZE;
volatile unsigned int position=0;
volatile unsigned int length=0;

bool put(byte in) {
  if(length < capacity) {
    // save data byte at end of buffer
    data[(position+length) % capacity] = in;
    length++;
    return true;
  }
  return false;
}

// interrupt 0
void rx_int() {
  cli();
  unsigned long rx_cur=micros();
  if(listening) {
      word dur=word(rx_cur-rx_last);
      if(digitalRead(PIN_RX)==HIGH) bitClear(dur,15); // was LOW
        else bitSet(dur,15); // was HIGH
        rx_last=rx_cur;
        put(byte(dur));
  }
  sei();
}

void loop() {
  if( Serial.available() > 0 ) {
    char theChar = Serial.read();
    switch (theChar) {
      case 'p':
        listening=false;
        Serial.println("Paused");
        break;
      case 'c':
        listening=true;
        Serial.println("Continued");
        break;
    }
  }
}

void setup() {
  noInterrupts();
  attachInterrupt(INT0, rx_int, CHANGE); // int0, pin2
  pinMode(PIN_RX, INPUT);
  Serial.begin(57600);
  listening=true;
  Serial.println("Listening...");
  interrupts();
}

 

__Alexander
Offline
Зарегистрирован: 24.10.2012

потому что нехватка ОЗУ.

artaf
Offline
Зарегистрирован: 19.08.2014

О! Нашел отличную вещь для строк, которые не изменяются: F()

The F() macro tells the compiler to keep your strings in PROGMEM.

kisoft
kisoft аватар
Offline
Зарегистрирован: 13.11.2012

Пошел за попкорном, щас начнутся вопросы, а как их читать из прогмема

 

artaf
Offline
Зарегистрирован: 19.08.2014

Это для Serial.print(), оно само читается. :)

kisoft
kisoft аватар
Offline
Зарегистрирован: 13.11.2012

А толку то. Массив из 4000 это не в каждый контроллер влезет. Потому сообщения в прогмем вряд ли помогут

artaf
Offline
Зарегистрирован: 19.08.2014

Я же проиграться взял и никак не думал, что там памяти почти и нет. В принципе хватить и примерно 4*300. С F() хоть на отладочных сообщениях сэкономить можно.