#1 Програмування Arduino » Почему компилятор не проверяет индекс массива не в его диапазона? » 2022-07-08 23:53:30

Krepton85
відповідей: 2

Сейчас столкнулся с одной своей ошибкой которую отладить не так то просто было. Почему компилятор не проверяет на наличие ошибок, если присвоить значение индексу массива, который не в его диапазона?

char model[8];//8 - размер массива в байтах

bool test = 0;
void setup() {
  // put your setup code here, to run once:
Serial.begin(115200);
model[8] = 'n';//ошибка, индекс массива начинается с нуля и заканчиваться должен на 7
Serial.print(F("test = "));
Serial.println(test);

}

void loop() {
  // put your main code here, to run repeatedly:
Serial.print(F("test = "));
Serial.println(test);
delay(1000);
}

Воспроизвести эту ошибку в этом примере не получилось, но случилось следующее, в процессе работы моего огромного скетча на Raspberry Pi Pico , булевая переменная test, начала неожиданно принимать значение = 10. smile  Потратил кучу времени что бы найти в каком месте скетча это может происходить, хорошо хоть вспомнил, что недавно делал и по горячим следам нашел виновника. big_smile

#2 Re: Апаратні питання » Arduino без Bootloader'а » 2020-05-17 15:48:41

Ну записал я HEX прошивку с помощью USBASP, сторонней программой без загрузчика, установил BOOTRST в 0. МК Atmega32u4 и сейчас прошивка при подаче питания грузится аж 10 сек. почему то, но если "тыкнуть" RESET, то прошивка моментом за 1 секунду загружается, в чем дело?

#3 Re: Програмування Arduino » Конфликт FRAM FM25L16B и SD card при чтении FRAM. » 2020-03-07 12:29:25

Вячеслав Азаров пише:

И зачем было ломать библиотеку SD, а не сделать другую библиотеку? Это совершенно разные типы памяти.

Вы не так поняли меня, я библиотеку SD card вообще не ломал, я только библиотеку для SPIFlash редактировал, добавил туда функции для поддержки FRAM и все. В общем решил (почти решил) эту проблему через одно место...
За счет   больших ресурсов Arduino Due, сделал в своем программаторе PortableProg PRO (это мой автономный программатор, для которого все это и затеял, в Youtube есть.), что бы от начала загрузки не использовалось ни одной функции из библиотеки SD, затем содержимое FRAM целиком (всех 2 кБ) считывалось в буфер (переменную), а затем только использую функции библиотеки SD card, что бы сохранить в дамп-файл на SD Card содержимое буфера. Как бы так это все работает отлично, но только вот что делать с верификацией, ее то не проходит т.к. для записи из  файла на SD card в SPI FRAM вначале используются функции библиотеки SD (например для открытия файла)? roll

#4 Програмування Arduino » Конфликт FRAM FM25L16B и SD card при чтении FRAM. » 2020-02-29 20:53:52

Krepton85
відповідей: 6

У меня возникла проблема при чтении SPI FRAM FM25L16B в файл на SD карту - данные искажены, добавляет  к некоторым битам логические единицы в то время когда там хранится ноль логический. Если из скетча убрать все функции библиотеки SD, то данные в serial port считывает верные без искажений, но если использовать любую функцию из SD библиотеки то в serial port так же "криво" считывает данные. Кстати с др. SPI флэшками (не FRAM) 25 серии таких проблем нет. И запись FRAM работает отлично из файла на SD Card в FRAM, только естественно верификацию не проходит т.к. не корректно подсчитывает cecksum32 из FRAM.
Библиотеку для spi флэш использовал стандартную лишь добавил в ее свои функции для чтения и записи этой FRAM страницами, все делал по этому даташиту.
Скетчь работает на Ардуино Дуэ:

#include <SD.h>

#include <SPIFlash.h>
#include <SPI.h>
//#include <avr/wdt.h>
#ifdef  __SAM3X8E__//если DUE
#define SD_CLOCK 84000000//частота в Гц шины SPI для SD card, для DUE

#endif
#ifndef  __SAM3X8E__//если не DUE
#define SD_CLOCK 8000000//частота в Гц шины SPI для SD card, для МЕГА
#endif

byte buf[128];
SPIFlash flash(49, 0);
const int v3_3on = A10; //выход выключателя питания чипов 3,3 Вольта
#define SD_CS 37

File root;


void setup() {
  // put your setup code here, to run once:
  Serial.begin(115200);

pinMode(v3_3on, OUTPUT);
digitalWrite(v3_3on, LOW);//включить питание  чипа.

pinMode(SD_CS, OUTPUT);
digitalWrite(SD_CS, HIGH);
delay(4000);
if (!SD.begin(SD_CLOCK,SD_CS)) {
  Serial.println(F("SD card failed!"));
}else{
  Serial.println(F("SD card OK!"));
}

  delay(2000);
  while (!Serial);
  if (flash.initialize())
    Serial.println("Init OK!");
    
  else
    Serial.println("Init FAIL!");


    delay(5000);

/*    
if(SD.exists(F("SPI/damps/test.bin")) == true){//проверка есть ли файл дампа
   SD.remove(F("SPI/damps/test.bin")); //если есть, то удалить  
  }

*/  
      
for(int p = 0; p < 16; p++){
  read_fram( p*128, 128);
}
    

    
    
digitalWrite(v3_3on, HIGH);//
}

void read_fram(word addr, word len){
  digitalWrite(SD_CS, HIGH);
 flash.readBytes_fram(addr, buf, len);//считывает 1-у страницу в буфер 
 Serial.print(F("Fram read to offseet 0x"));
  Serial.println(addr, HEX);
  for(int s = 0; s < len; s ++){
    Serial.print(F("0x"));
    if(buf[s] <= 0xF)Serial.print('0');
    Serial.print(buf[s],HEX);
    Serial.print(F(", "));
    if((s+1)%16 == 0){
      Serial.print(F(" | "));
      for(int c = (s-16); c < s; c++){
        Serial.print((char)buf[c]);
    Serial.print(F(", "));
      }
      Serial.println();
    }
  }
  Serial.println();
  

  root = SD.open("SPI/damps/test.bin", FILE_WRITE);
  root.seek(addr);//установить курсор в нужную позицию   
 root.write(buf, len);//записываем данные в файл
 root.close();//закрываем файл.
  delay(10);
}

void loop() {
  // put your main code here, to run repeatedly:
  

}

#5 Re: Програмування Arduino » Проблема с библиотекой Wire для Ардуино DUE. » 2019-10-15 20:36:07

uint8_t TwoWire::endTransmission(uint8_t sendStop) {
	uint8_t error = 0;
	// transmit buffer (blocking)
	TWI_StartWrite(twi, txAddress, 0, 0, txBuffer[0]);
	if (!TWI_WaitByteSent(twi, XMIT_TIMEOUT))
		error = 2;	// error, got NACK on address transmit
	
	if (error == 0) {
		uint16_t sent = 1;
		while (sent < txBufferLength) {
			TWI_WriteByte(twi, txBuffer[sent++]);
			if (!TWI_WaitByteSent(twi, XMIT_TIMEOUT))
				error = 3;	// error, got NACK during data transmmit
		}
	}
	
	if (error == 0) {
		if(sendStop == true) {//  вот здесь я дописал
			TWI_Stop(twi);
} 
		if (!TWI_WaitTransferComplete(twi, XMIT_TIMEOUT))
			error = 4;	// error, finishing up
		
	}

	txBufferLength = 0;		// empty buffer
	status = MASTER_IDLE;
	return error;
}

#6 Re: Програмування Arduino » Проблема с библиотекой Wire для Ардуино DUE. » 2019-10-14 21:13:20

Kaka пише:

И чего ж ты хочешь?

Что бы показали как правильно нужно сделать.

#7 Re: Програмування Arduino » Проблема с библиотекой Wire для Ардуино DUE. » 2019-10-14 18:21:10

Watchdog пише:
Krepton85 пише:

... это фэйк.
Как исправить эту функцию что бы она работала так же замечательно как на  AVR микроконтроллерах?
В архиве библиотека wire для для Ардуино DUE. http://forum.arduino.ua/img/members/1759/Wire_DUE.rar

lol Самостоятельно! Вы также можете обсудить эту проблему с её разработчикми. Отут: https://github.com/arduino/ArduinoCore-sam/issues

Действительно моя проблема уже поднималась здесь: https://github.com/arduino/ArduinoCore-sam/issues/70  но ни кто так и не решил ее.
Я пробовал сам исправить но тогда данная функция возвращает ошибку error 3, при попытке использовать false.

#8 Програмування Arduino » Проблема с библиотекой Wire для Ардуино DUE. » 2019-10-13 23:45:13

Krepton85
відповідей: 6

Есть проблема с функцией Wire.endTransmission(stop) для Ардуино DUE, эта функция игнорирует аргумент stop , когда я отправляю команду Wire.endTransmission(false) то все равно выполняется команда Wire.endTransmission(true), это делает не возможным использовать RESTART с последующей командой  Wire.requestFrom();
Заглянул в библиотеку wire.cpp

uint8_t TwoWire::endTransmission(uint8_t sendStop) {
	uint8_t error = 0;
	// transmit buffer (blocking)
	TWI_StartWrite(twi, txAddress, 0, 0, txBuffer[0]);
	if (!TWI_WaitByteSent(twi, XMIT_TIMEOUT))
		error = 2;	// error, got NACK on address transmit
	
	if (error == 0) {
		uint16_t sent = 1;
		while (sent < txBufferLength) {
			TWI_WriteByte(twi, txBuffer[sent++]);
			if (!TWI_WaitByteSent(twi, XMIT_TIMEOUT))
				error = 3;	// error, got NACK during data transmmit
		}
	}
	
	if (error == 0) {
		
			TWI_Stop(twi);
		if (!TWI_WaitTransferComplete(twi, XMIT_TIMEOUT))
			error = 4;	// error, finishing up
		
	}

	txBufferLength = 0;		// empty buffer
	status = MASTER_IDLE;
	return error;
}

И что мы видим, что аргумент  uint8_t sendStop переданный в функцию
в самой функции не где не используется, это фэйк.
Как исправить эту функцию что бы она работала так же замечательно как на  AVR микроконтроллерах?
В архиве библиотека wire для для Ардуино DUE. Wire_DUE.rar

#9 Re: Проекты » Как из исходников проекта на GitHub собрать bin прошивку для Arduino? » 2017-11-24 13:35:54

mininvit пише:

Все добрый день!
Есть проект на GitHub:
https://github.com/spacehuhn/esp8266_deauther
Из него создали bin файл прошивки для Arduino:
https://github.com/spacehuhn/esp8266_deauther/releases/download/v.1.5/esp8266_deauther_1mb.bin
Как из этих файлов получить один bin? Хочу просто немного подредактировать проект под себя (добавить перевод и тп).

Так это же для esp8266 . Просто установите пакет для разработчиков esp8266 в arduino ide. И там скомпелируется скетчь.

Підвал форуму