Arduino+24C256

sergeclause
sergeclause аватар
Offline
Зарегистрирован: 08.09.2016

Народ, please, help me!

Есть такая штука. Вроде бы 256К памяти. Как в неё записать файл, например, с картинкой в формате BMP или ролик MP4? А потом прочесть. Чтобы через  Arduino. Буду весьма благодарен за пример.

Пример с чтением с SD Card не нужен - не использую.

 

 

b707
Онлайн
Зарегистрирован: 26.05.2017

у нее емкость 256 Кбит, а не Килобайт , то есть килобайт там всего 32

Чтобы записать туда файл. нужно сначала организовать на этом носителе файловую систему. Это, прямо скажем, не самый эффективный способ использования для такого маленькго обьема. Лучше положить туда картинку в виде байтового массива. без всяких файлов, аналогично тому как загружаются BMP в ПРОГМЕМ

sergeclause
sergeclause аватар
Offline
Зарегистрирован: 08.09.2016

Если по минимуму, то мне нужно положить туда три картинки BMP и звуковой файлик MP3.
30 килобайт должно хватить. Но даже по-байтно не получается разместить. Все примеры, которые нашел - один-два байта, и с адресацией полная неясность

 

b707
Онлайн
Зарегистрирован: 26.05.2017

Какая может быть "неясность" с адресами, ведь есть же даташит, где все расписано? А мало даташита - почему бы для начала не поискать в гугле что-нибудь типа "arduino at24с32" ?

примеров просто валом, например вот библиотека

https://github.com/mikaelpatel/Arduino-Storage

andriano
andriano аватар
Онлайн
Зарегистрирован: 20.06.2015

sergeclause пишет:

Если по минимуму, то мне нужно положить туда три картинки BMP и звуковой файлик MP3.
30 килобайт должно хватить. Но даже по-байтно не получается разместить. Все примеры, которые нашел - один-два байта, и с адресацией полная неясность

Адресация там самая простая, какая только может быть - все пишется и читается последовательно.

Единственная тонкость: память имеет страничную организацию и на запись страницы уходит довольно много времени, в течение которого микросхему не следует беспокоить.

Т.е. если Вы при записи переходите с одной страницы на другую, либо если Вы сразу после записи осуществляете чтение, необходимо выдержать паузу 5 мс. Размер страницы, если мне не изменяет память, 64 байта.

Кстати, если объема одной микросхемы не хватит, их без проблем можно установить до 8 штук. Т.е. всего получите 256 кбайт.

sergeclause
sergeclause аватар
Offline
Зарегистрирован: 08.09.2016

Валом то валом, но я искал даташит на 24С256. Нашел, но в нем сугубо физические характеристики, по программированию ничего нет.

Попытка скачать zip из github-а по вашей ссылке дает ошибку

500: Internal Server Error

 

sergeclause
sergeclause аватар
Offline
Зарегистрирован: 08.09.2016

А можно программку, которая заполняет всю эту память байтиками типа 0хFF
и другую программку, которая все это читает?

sergeclause
sergeclause аватар
Offline
Зарегистрирован: 08.09.2016

andriano пишет:

Кстати, если объема одной микросхемы не хватит, их без проблем можно установить до 8 штук. Т.е. всего получите 256 кбайт.

Я знаю, спасибо! Но тут хотя бы одну "победить".

b707
Онлайн
Зарегистрирован: 26.05.2017

sergeclause пишет:

Валом то валом, но я искал даташит на 24С256.

ищите даташит на 24с32 или 64 - во всех чипах этой серии обьемом 32 кбит и более принцпип адресации одинаков

Удивляюсь на вас. Вроде 4 года на форуме и, судя по истории поиска - даже одно время брали коммерческие заказы на программирование... Примеров на 24с32 в инете много. Предлагаете искать из за вас? - переходите в "Ищу исполнителя", назначайте цену - договоримся :)

sergeclause
sergeclause аватар
Offline
Зарегистрирован: 08.09.2016

b707 пишет:

Удивляюсь на вас. Вроде 4 года на форуме и, судя по истории поиска - даже одно время брали коммерческие заказы на программирование... Примеров на 24с32 в инете много. Предлагаете искать из за вас? -

Любезный!
Водительские права у меня с 1975 года.
А вот на "Запорожце" ездить ни разу не приходилось.
Вы хотите меня обсудить или помочь мне?
Я не хочу вас утруждать, чес слово...

sergeclause
sergeclause аватар
Offline
Зарегистрирован: 08.09.2016

b707 пишет:

переходите в "Ищу исполнителя", назначайте цену - договоримся :)

И еще...
Что касается моего водительского удостоверения и коммерческих заказов...
Когда я куда-нибудь еду и попадаются попутчики, я НИКОГДА не требую с них денег...
Знаете, бывает иногда такое - стоят рядом с дорогой, голосуют...
Ситуация может быть такой, что у человека нет денег даже на автобусный билет...
Но когда ко мне подходят и просят отвезти в другой город, поселок, на дачу и т п...
То это совсем другое дело...

Я спросил у тех, кто сталкивался с этим устройством, пример программы...
У тех, кто с этой приблудой не сталкивался,
но готов разобраться за деньги в течении NN-ого количества дней,
я помощи не прошу.
Только и всего...

sergeclause
sergeclause аватар
Offline
Зарегистрирован: 08.09.2016

Кстати, сегодня zip по вашей ссылке скачался!
Спасибо!

b707
Онлайн
Зарегистрирован: 26.05.2017

sergeclause пишет:

У тех, кто с этой приблудой не сталкивался,
но готов разобраться за деньги в течении NN-ого количества дней,
я помощи не прошу.

принято, удачи в поисках :)

b707
Онлайн
Зарегистрирован: 26.05.2017

sergeclause пишет:

А можно программку, которая заполняет всю эту память байтиками типа 0хFF
и другую программку, которая все это читает?

Все-таки удивляюсь когда люди даже в гугле ничего найти не могут :)

запись:

#include <Wire.h>
#include <AT24CX.h>

// EEPROM object
AT24CX mem;

// array to write
byte yy[] = {
    0X01, 0X80, 0X01, 0X80, 0X01, 0X80, 0X01, 0X80, 0X01, 0X80, 0X01, 0X80, 0X01, 0X82,
  };

// setup
void setup() {
  // serial init
  Serial.begin(115200);
  Serial.println("AT24CX read/write demo");
  Serial.println("----------------------");

 // write array start from mem index 20
  mem.write(20, (byte*)yy, sizeof(yy));
}

void loop() {
}

чтение:

#include <Wire.h>
#include <AT24CX.h>

// EEPROM object
AT24CX mem;

// setup
void setup() {
  // serial init
  Serial.begin(115200);
  Serial.println("AT24CX read/write demo");
  Serial.println("----------------------");

   Serial.println("Read 14 single bytes starting at address 20");
  for (int i = 0; i < 14; i++) {
    byte sc = mem.read(20 + i);
    Serial.print("[");
    Serial.print(20+i);
    Serial.print("] = ");
    Serial.println(sc, HEX);
  }

}

// main loop
void loop() {
}

источник кода: https://forum.arduino.cc/index.php?topic=555794.0

библиотека: https://github.com/cyberp/AT24Cx

ЗЫ если чо - код не проверял, могут быть опечатки. Хотя грубых ошибок вроде нет

Green
Онлайн
Зарегистрирован: 01.10.2015

sergeclause пишет:
И еще...

Что касается моего водительского удостоверения и коммерческих заказов...
Когда я куда-нибудь еду и попадаются попутчики, я НИКОГДА не требую с них денег...
Знаете, бывает иногда такое - стоят рядом с дорогой, голосуют...
Ситуация может быть такой, что у человека нет денег даже на автобусный билет...
Но когда ко мне подходят и просят отвезти в другой город, поселок, на дачу и т п...
То это совсем другое дело...


Старая гвардия. Сейчас всё по другому. Всё упирается в деньги. Редкие исключения не в счёт.

b707
Онлайн
Зарегистрирован: 26.05.2017

Green пишет:

Старая гвардия. Сейчас всё по другому. Всё упирается в деньги. Редкие исключения не в счёт.

старая гвардия хотя бы гуглем пользоваться умеет

sergeclause
sergeclause аватар
Offline
Зарегистрирован: 08.09.2016

Green пишет:

Старая гвардия. Сейчас всё по другому. Всё упирается в деньги. Редкие исключения не в счёт.

То, что в деньги, это понятно.

Подобный пример у меня есть. Вот он. Работает. Но  теперь непонятки со страничкой. Ладно. Попытаюсь заменить содержимое yy[] на картинку BMP, если прокатит, то ура!

#include <Wire.h>
#include "AT24C256.h" //Include AT24C256 Code Libraries

AT24C256 g_eeprom(0x50); //Start code 0x50 Address

void printContents() {
int eeaddress = 0;
byte value;

  while (true) {
    value = g_eeprom.read(eeaddress++);
    if ((value == 0xFF) || (eeaddress == 32768)) {
      Serial.println();
      break;
    }
    Serial.print((char)value);
  }
}

void setup() {
  Serial.begin(9600);
  Serial.println ( "14CORE | 24C256 EEPROM TEST CODE"); // send a message to the serial monitor   
  Serial.println ( "--------------------------------");
  Serial.println ( "START... ");
  Wire.begin();
  printContents();
}

void loop() {
  //Serial.print ( "Serial.available = ");
  //Serial.println( Serial.available());
  while (Serial.available()) {
    int i, m;
    String data = Serial.readStringUntil('\n');
    Serial.print ( "data.length = ");
    Serial.println( data.length());
    for (i = 0, m = data.length(); i < m; ++i) {
      g_eeprom.write(i, data[i]);
    
    Serial.println("14CORE | AT24C256 WRITE CODE TEST");
    Serial.println("---------------------------------");
      Serial.println("Writing  : ");
      Serial.print(data[i]);
      Serial.println(" IN : ");
      Serial.println(i);
    }
    g_eeprom.write(i, 0xFF); //Start write 
    printContents();
  }
  delay(1);
}

 

b707
Онлайн
Зарегистрирован: 26.05.2017

sergeclause пишет:

Подобный пример у меня есть. Вот он. Работает.

ну-ну...

Во-первых, в вашем чипе нет ячейки с адресом 32768. Во-вторых. писать в чип значения FF не стоит, некоторые чипы памяти с завода именно FF и заполнены, выберите что-то другое.

DetSimen
DetSimen аватар
Онлайн
Зарегистрирован: 25.01.2017

b707 пишет:

писать в чип значения FF не стоит, некоторые чипы памяти с завода именно FF и заполнены

Не некоторые, а все, которые прикидываюся ПЗУ. Традиция-с. 

DetSimen
DetSimen аватар
Онлайн
Зарегистрирован: 25.01.2017

ТС, анажды я написал биб-ку для всех AT24Схх (хх=32...512), с кэшированием страницы как на запись, так и на чтение.  Если еще актуально, завтра могу поделиться, потестироваешь. 

b707
Онлайн
Зарегистрирован: 26.05.2017

DetSimen пишет:

ТС, анажды я написал биб-ку для всех AT24Схх (хх=32...512)

это не твоя? :)

https://github.com/cyberp/AT24Cx

sadman41
Онлайн
Зарегистрирован: 19.10.2016

Во всей этой истории меня озадачивает MP3 в EEPROM-ке. С BMP, может, TC и справится, но вот MP3...

DetSimen
DetSimen аватар
Онлайн
Зарегистрирован: 25.01.2017

b707 пишет:

DetSimen пишет:

ТС, анажды я написал биб-ку для всех AT24Схх (хх=32...512)

это не твоя? :)

https://github.com/cyberp/AT24Cx

Не, я на Git не выкладывал.  Моя отличается тем, что единообразно работает и с внутренним EEPROM и с любым внешним.  Разница только в конструкторе. 

b707
Онлайн
Зарегистрирован: 26.05.2017

sadman41 пишет:

Во всей этой истории меня озадачивает MP3 в EEPROM-ке. С BMP, может, TC и справится, но вот MP3...

даже не МР3, а МР4 - см в первом сообщении

sergeclause
sergeclause аватар
Offline
Зарегистрирован: 08.09.2016

b707 пишет:

ну-ну...

Во-первых, в вашем чипе нет ячейки с адресом 32768. Во-вторых. писать в чип значения FF не стоит, некоторые чипы памяти с завода именно FF и заполнены, выберите что-то другое.

Это из даташита
I2C-Compatible (2-Wire) Serial EEPROM
256-Kbit (32,768 x 8)
Могу выслать

sergeclause
sergeclause аватар
Offline
Зарегистрирован: 08.09.2016

b707 пишет:

 писать в чип значения FF не стоит, некоторые чипы памяти с завода именно FF и заполнены, выберите что-то другое.


 

Да ради бога! Подскажите. Можно 10101010?

b707
Онлайн
Зарегистрирован: 26.05.2017

sergeclause пишет:

Это из даташита
256-Kbit (32,768 x 8)
Могу выслать

Ага,  ячеек 32,768, с номерами с 0 по 32767 :)

вы меня все больше и больше веселите :)

sergeclause
sergeclause аватар
Offline
Зарегистрирован: 08.09.2016

DetSimen пишет:

ТС, анажды я написал биб-ку для всех AT24Схх (хх=32...512), с кэшированием страницы как на запись, так и на чтение.  Если еще актуально, завтра могу поделиться, потестироваешь. 

С удовольствием! И доложу результаты!

b707
Онлайн
Зарегистрирован: 26.05.2017

sergeclause пишет:

Да ради бога! Подскажите. Можно 10101010?

любой за пределами стандартной таблицы ASCII, да хотя бы FE вместо FF

sergeclause
sergeclause аватар
Offline
Зарегистрирован: 08.09.2016

*********************

sergeclause
sergeclause аватар
Offline
Зарегистрирован: 08.09.2016

sadman41 пишет:

Во всей этой истории меня озадачивает MP3 в EEPROM-ке. С BMP, может, TC и справится, но вот MP3...

 

Как то надо обозначать нажатие кнопок на пульте. Где-то и когда-то мне попадался скетч с проигрышем звуков.
Задумка - при "оживлении" пульта на экранчике происходит "взрыв" логотипа, сопровождающийся звуком. Затем появляются пронумерованные кнопки. При нажатии кнопок - короткий звук.

b707
Онлайн
Зарегистрирован: 26.05.2017

sergeclause пишет:

Как то надо обозначать нажатие кнопок на пульте. Где-то и когда-то мне попадался скетч с проигрышем звуков.
Задумка - при "оживлении" пульта на экранчике происходит "взрыв" логотипа, сопровождающийся звуком. Затем появляются пронумерованные кнопки. При нажатии кнопок - короткий звук.

МП3 для этого явно излишен. Если хотите с МП3 - вставьте в конструкцию внешний МП3 плеер, у китайцев есть готовые маленькие модули в два раза меньше Ардуино-Нано

sadman41
Онлайн
Зарегистрирован: 19.10.2016

sergeclause пишет:

Как то надо обозначать нажатие кнопок на пульте. Где-то и когда-то мне попадался скетч с проигрышем звуков.

Прямо с MP3-декодированием 328-м МК и проигрышем на спикер? Я бы посмотрел на это.

sergeclause
sergeclause аватар
Offline
Зарегистрирован: 08.09.2016

sadman41 пишет:

Прямо с MP3-декодированием 328-м МК и проигрышем на спикер? Я бы посмотрел на это.

Такие нюансы мне неизвестны

sergeclause
sergeclause аватар
Offline
Зарегистрирован: 08.09.2016

b707 пишет:

МП3 для этого явно излишен. Если хотите с МП3 - вставьте в конструкцию внешний МП3 плеер, у китайцев есть готовые маленькие модули в два раза меньше Ардуино-Нано

Спасибо! Поищу!

andriano
andriano аватар
Онлайн
Зарегистрирован: 20.06.2015

sergeclause пишет:

sadman41 пишет:

Прямо с MP3-декодированием 328-м МК и проигрышем на спикер? Я бы посмотрел на это.

Такие нюансы мне неизвестны

А в чем тут нюансы?

В исходном сообщении Вы говорили про записать/прочитать - это без проблем.

А потом уже пишете про "озвучку", а для стандартной Ардуины воспроизведение mp3 - явно за гранью реальности.

Вы уж определитесь, чего именно Вы хотите.

DetSimen
DetSimen аватар
Онлайн
Зарегистрирован: 25.01.2017

sergeclause пишет:

b707 пишет:

в вашем чипе нет ячейки с адресом 32768. 

Это из даташита
I2C-Compatible (2-Wire) Serial EEPROM
256-Kbit (32,768 x 8)
Могу выслать

После этого, желание что-то выкладывать существенно поубавилось. Не в коня авёс. 

FoxJone
Offline
Зарегистрирован: 19.04.2019

andriano пишет:

А потом уже пишете про "озвучку", а для стандартной Ардуины воспроизведение mp3 - явно за гранью реальности.

Вы уж определитесь, чего именно Вы хотите.

Я так понимаю, ТС хочет просто какой то звук, а не оперные концерты в HiFi слушать.

Никогда так не делал, но нельзя ли просто прицепить бипер на аналоговый выход и подавать на него сигнал 00-FF с периодом (к примеру) 100 мс? Вот массив этих сигналов и записать в память...

nevkon
Offline
Зарегистрирован: 20.01.2015

Поинтересуйтесь стандартным способом тестирования памяти на ошибки. Можно просто запустить memtest и посмотреть какие тесты он прогоняет.

Самый простой вариант - запись/чтение 10101010, затем 01010101. Ну и напоследок 0. Это покажет есть ли битые биты памяти.

Ну и если страница равна 64 байта, то отдать первую страницу под результат диагностики - если бит равен 0, то страница неисправна, если 1, то исправна. Причем первый бит будет показывать исправность контрольной страницы.

rkit
Онлайн
Зарегистрирован: 23.11.2016

FoxJone пишет:

Никогда так не делал, но нельзя ли просто прицепить бипер на аналоговый выход и подавать на него сигнал 00-FF с периодом (к примеру) 100 мс? Вот массив этих сигналов и записать в память...

Можно, только звука слышимого эта конструкция издавать не будет.

nevkon
Offline
Зарегистрирован: 20.01.2015

rkit пишет:

FoxJone пишет:

Никогда так не делал, но нельзя ли просто прицепить бипер на аналоговый выход и подавать на него сигнал 00-FF с периодом (к примеру) 100 мс? Вот массив этих сигналов и записать в память...

Можно, только звука слышимого эта конструкция издавать не будет.

Все верно. Надо частоту повыше. Ну и я думаю частота еще и плавающая должна быть. Можно конечно и буззер сделать - 50Гц, 20мс на цикл 00-FF. Но хоть какую-нибудь музыку можно от 8кГц сделать вроде (12.5мкс на период). Надо смотреть как во всяких старых ПК делалось (например у Спектрума).

Green
Онлайн
Зарегистрирован: 01.10.2015

Не моё. Автор указан.)

/*
  Project : Музончик
  Version : 0.1.2
  Date    : 14.06.2006
  Author  : Pavel Sirotkin

  Chip type           : AT90S2313
  Clock frequency     : 4,000000 MHz
  Compiler            : WinAVR 2006.04.21

  Note :  По большому счету глубоко пофигу для какого чипа эта программа.
          Для какой частоты и прочее.
          Главное, чтоб было два внешних прерывания и таймер щелкал на частоте 31,250 КГц.
*/
// Нет определений входов/выхода, подтяжек для кнопок!  2015-feb-8 OKF

#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>
#include <avr/pgmspace.h>


#define M_PORT  PORTB                   //modify OKF
#define M_DDR   DDRB
#define M_BIT   0

// Bit Operations macroses
#define BIT(x)          (1 << (x))
#define CLEARBITS(x,y)  ((x) &= ~(y))
#define CLEARBIT(x,y)   CLEARBITS((x), (BIT(y)))


// Global vars
#include "music.h"
unsigned char T1Reload;
unsigned char Play = 1;
unsigned char Song = 0;
unsigned char melody_index;


// Timer0 interrupt
ISR(TIMER0_OVF0_vect)
{
  TCNT0 = T1Reload; 
  if (T1Reload != Silence && Play)
    M_PORT ^= (BIT(M_BIT));             //change polarity
  else
    CLEARBIT(M_PORT, M_BIT);
}

// External interrupt 0
ISR(INT0_vect)
{
  T1Reload = Silence;
  melody_index = 0;
  Play = 1;
  
  GIMSK = 0;                            //ext int disable - no key pressed
  MCUCR = 0;
  GIFR = 0;
}

// External interrupt 1
ISR(INT1_vect)
{
  Song++;
  T1Reload = Silence;
  melody_index = 0;
  Play = 1;
  
  GIMSK = 0;                            //ext int disable
  MCUCR = 0;
  GIFR = 0;
}

/*  External interrupt init:
  INT0:   On
  INT0 Mode:  Falling Edge
  INT1:   On
  INT1 Mode:  Falling Edge
  INT2:   Off
  Interrupt on any change on pins PCINT0-7: Off
*/
void ExtIntEnable(void)
{
  GIMSK = 0xC0;
  MCUCR = 0x2A;
  GIFR = 0xC0;
}

//==============================================================================

int main(void)
{
  unsigned int lang = 0;

  // Port init
  M_PORT &= ~M_BIT;
  M_DDR |= M_BIT;

  // Timer0 init
  // Clock source: System Clock
  // Clock value: 31,250 kHz
  TCCR0 = 0x03;
  TCNT0 = 0x00;
  TIMSK = 0x02;                         //timer0 overflow interrupt enabled
  ExtIntEnable();
  asm("sei");

  while (1)
  {
    if (!Play)
    {
      melody_index = 0;
      asm ("Sleep");                    //sleep, if no playing
    }

    switch (Song)
    {
      case 0:                           //"Бумер"
        if (melody_index >= BUMER_LAENGE)
        {
          Play = 0;
          ExtIntEnable();
          break;
        }
        T1Reload = pgm_read_byte(&Bumer[melody_index][0]);
        lang = pgm_read_byte(&Bumer[melody_index][1]);
        break;

      case 1:                           //"Листья"
        if (melody_index >= LIST_LAENGE)
        {
          Play = 0;
          ExtIntEnable();
          break;
        }
        T1Reload = pgm_read_byte(&List[melody_index][0]);
        lang = pgm_read_byte(&List[melody_index][1]);
        break;
        
      case 2:                           //"Служебный роман"
        if (melody_index >= ROMAN_LAENGE)
        {
          Play = 0;
          ExtIntEnable();
          break;
        }
        T1Reload = pgm_read_byte(&Roman[melody_index][0]);
        lang = pgm_read_byte(&Roman[melody_index][1]);
        break;
      
      case 3:                           //"Ва Банк"
        if (melody_index >= BANK_LAENGE)
        {
          Play = 0;
          ExtIntEnable();
          break;
        }
        T1Reload = pgm_read_byte(&Bank[melody_index][0]);
        lang = pgm_read_byte(&Bank[melody_index][1]);
        break;
      
      case 4:                           //"Джентельмены у Дачи"
        if (melody_index >= DJEN_LAENGE)
        {
          Play = 0;
          ExtIntEnable();
          break;
        }
        T1Reload = pgm_read_byte(&Djen[melody_index][0]);
        lang = pgm_read_byte(&Djen[melody_index][1]);
        break;
      
      default:
        Song = 0;
        break;
    }

    while (lang)                        //current note
    {
      _delay_ms(50);
      lang--;
    }
    melody_index++;                     //next note
    T1Reload = Silence;                 //пауза, чтоб не было щелчков
    _delay_ms(40);
  }
}

music.h

// music.h - melody

#define CEL   32  //  1/1
#define SEM   16  //  1/2
#define QV    8   //  1/4
#define D_Cr  6   //  3/16
#define Cr    4   //  1/8
#define Qu    2   //  1/16  
#define SQ    1   //  1/32
  
#define C1    17  // 262 -> До
#define Cis1  31  // 278 -> До Диез
#define D1    43  // 294 -> Ре
#define Dis1  56  // 312 -> Ре Диез
#define E1    67  // 330 -> Ми
#define F1    77  // 350 -> Фа
#define Fis1  87  // 370 -> Фа Диез
#define G1    97  // 392 -> Соль
#define Gis1  106 // 416 -> Соль Диез
#define A1    114 // 440 -> Ля
#define Ais1  122 // 467 -> Ля Диез
#define H1    130 // 495 -> Си

#define C2    137 // 523 -> До
#define Cis2  143 // 554 -> До Диез
#define D2    150 // 588 -> Ре
#define Dis2  156 // 623 -> Ре Диез
#define E2    161 // 660 -> Ми
#define F2    167 // 699 -> Фа
#define Fis2  171 // 741 -> Фа Диез
#define G2    176 // 785 -> Соль
#define Gis2  180 // 830 -> Соль Диез
#define A2    184 // 880 -> Ля
#define H2    192 // 988 -> Си

#define C3    196 // 1048 -> До
#define Cis3  199 // 1112 -> До Диез
#define D3    202 // 1176 -> Ре
#define Dis3  204 // 1248 -> Ре Диез
#define E3    207 // 1320 -> Ми
#define F3    210 // 1400 -> Фа
#define Fis3  213 // 1480 -> Фа Диез

#define Silence 0

// "Бумер"
#define BUMER_LAENGE 35
PROGMEM const char Bumer [BUMER_LAENGE][2] =
{
  { Silence, SQ },
  { E2, Cr },
  { G2, QV },
  { Silence, SEM },
  { G2, Cr },
  { E2, QV },
  { Silence, SEM },
  { A2, Cr },
  { G2, Cr },
  { A2, Cr },
  { G2, Cr },
  { A2, Cr },
  { G2, Cr },
  { A2, Cr },
  { G2, Cr },
  { A2, Cr },
  { H2, QV },
  { Silence, SEM },
  { E2, Cr },
  { G2, QV },
  { Silence, SEM },
  { G2, Cr },
  { E2, QV },
  { Silence, SEM },
  { A2, Cr },
  { G2, Cr },
  { A2, Cr },
  { G2, Cr },
  { A2, Cr },
  { G2, Cr },
  { A2, Cr },
  { G2, Cr },
  { A2, Cr },
  { H2, QV },
  { Silence, SQ }
};

// "Листья"
#define LIST_LAENGE 50
PROGMEM const char  List [LIST_LAENGE][2] =
{
  { Silence, SQ },
  { A2, QV },
  { H2, QV },
  { C3, QV },
  { H2, D_Cr },
  { A2, SEM },
  { E2, 3 },
  { C3, QV },
  { H2, D_Cr },
  { A2, QV },
  { E2, QV },
  { G2, SEM },
  { F2, CEL },
  
  { H1, QV },
  { C2, QV },
  { E2, QV },
  { D2, D_Cr },
  { H1, SEM },
  { E1, 3 },
  { E2, QV },
  { D2, D_Cr },
  { C2, QV },
  { Gis1, 12 },
  { H1, SEM },
  { A1, CEL },
  
  { A2, QV },
  { H2, QV },
  { C3, QV },
  { H2, D_Cr },
  { A2, SEM },
  { E2, 3 },
  { C3, D_Cr },
  { H2, QV },
  { A2, QV },
  { E2, 12 },
  { G2, SEM },
  { F2, CEL },
  
  { H1, QV },
  { C2, QV },
  { E2, QV },
  { D2, D_Cr },
  { H1, SEM },
  { E1, 3 },
  { E2, QV },
  { D2, QV },
  { C2, QV },
  { Gis1, QV },
  { H1, SEM },
  { A1, CEL },
  { Silence, Qu }
};

// "Служебный роман"
#define ROMAN_LAENGE 44
PROGMEM const char  Roman [ROMAN_LAENGE][2] =
{
  { Silence, SQ },
  { C2, Cr },
  { F2, Cr },
  { G2, Cr },
  { Gis2, Cr },
  { G2, Cr },
  { G2, Cr },
  { F2, Cr },
  { F2, Cr },
  { E2, Cr },
  { D2, Cr },
  { E2, Cr },
  { F2, QV },
  { Silence, 12 },
  { C2, Cr },
  { Cis2, Cr },
  { C2, Cr },
  { Ais1, QV },
  { Silence, 12 },
  { F2, Cr },
  { G2, Cr },
  { F2, Cr },
  { E2, QV },
  { Silence, 12 },
  { C2, Cr },
  { F2, Cr },
  { G2, Cr },
  { Gis2, Cr },
  { G2, Cr },
  { G2, Cr },
  { F2, Cr },
  { F2, Cr },
  { E2, Cr },
  { D2, Cr },
  { E2, Cr },
  { F2, QV },
  { Silence, 12 },
  { F2, Cr },
  { G2, Cr },
  { Gis2, Cr },
  { G2, SEM },
  { F2, QV },
  { G2, QV },
  { Silence, SQ }
};

// "Ва Банк" 
#define BANK_LAENGE 43
PROGMEM const char  Bank [BANK_LAENGE][2] =
{
  { Silence, SQ },
  { F2, Cr },
  { D2, Qu },
  { Silence, Cr },
  { A1, Cr },
  { Silence, Qu },
  { F2, Qu },
  { D2, Cr },
  { A1, Qu },
  { F2, Cr },
  { D2, Qu },
  { Silence, Cr },
  { A1, Cr },
  { Silence, Qu },
  { F2, Qu },
  { E2, Cr },
  { D2, Qu },
  { F2, Cr },
  { E2, Qu },
  { Silence, Cr },
  { Gis1, SEM },
  { Silence, QV },
  { F2, Cr },
  { E2, Qu },
  { Silence, Cr },
  { G1, Cr },
  { Silence, Qu },
  { F2, Qu },
  { E2, Cr },
  { G1, Qu },
  { F2, Cr },
  { E2, Qu },
  { Silence, Cr },
  { G1, Cr },
  { Silence, Qu },
  { F2, Qu },
  { E2, Cr },
  { G1, Qu },
  { E2, Cr },
  { D2, Qu },
  { Silence, Cr },
  { A2, SEM },
  { Silence, SQ }
};

// "Джентельмены удачи" 
#define DJEN_LAENGE 43
PROGMEM const char  Djen [DJEN_LAENGE][2] =
{
  { Silence, SQ },
  { E2, Cr },
  { F2, Cr },
  { Silence, Qu },
  { E2, Qu },
  { Dis2, Qu },
  { E2, Qu },
  { Silence, Qu },
  { C2, QV },
  { Silence, QV },
  { E2, Cr },
  { F2, Cr },
  { Silence, Qu },
  
  { E2, Qu },
  { Dis2, Qu },
  { E2, Qu },
  { Silence, Qu },
  { H1, QV },
  { Silence, QV },
  { E2, Cr },
  { C3, Cr },
  { H2, Cr },
  { A2, Cr },
  
  { E2, Cr },
  { G2, Cr },
  { Silence, Qu },
  { F2, Qu },
  { E2, Cr },
  { F2, Cr },
  { E2, Qu },
  { F2, Qu },
  { E2, Qu },
  { D2, SEM },
  { Silence, SQ }
};

 

sergeclause
sergeclause аватар
Offline
Зарегистрирован: 08.09.2016

DetSimen пишет:

После этого, желание что-то выкладывать существенно поубавилось. Не в коня авёс. 

Что вас обидело? Не нашли свою библиотеку?

sergeclause
sergeclause аватар
Offline
Зарегистрирован: 08.09.2016

nevkon пишет:

Поинтересуйтесь стандартным способом тестирования памяти на ошибки. Можно просто запустить memtest и посмотреть какие тесты он прогоняет.

Самый простой вариант - запись/чтение 10101010, затем 01010101. Ну и напоследок 0. Это покажет есть ли битые биты памяти.

Ну и если страница равна 64 байта, то отдать первую страницу под результат диагностики - если бит равен 0, то страница неисправна, если 1, то исправна. Причем первый бит будет показывать исправность контрольной страницы.


В добрые старые времена был целый комплекс тестов МОЗУ для ЭВМ "М-222"
и указанный вами, и такой FF00FF00FF00... 00FF00FF00... и FFFFFFF.... 0000000....
Дисплеев не было - были табло, при проверках МОЗУ сияли как новогодние елки.
Хотя при работе машины тоже сияли. Светодиодов тогда не было,
в табло использовались советские микролампочки, но, удивительно,
они были довольно надежными и перегорали очень редко.

Ну у нас не такое массовое производство, плохие микросхемы будем сразу отбраковывать.
Будем прогонять через барокамеру ( давление ) и термокамеру (температура ),
в работу пускать "выжившие".

 

sergeclause
sergeclause аватар
Offline
Зарегистрирован: 08.09.2016

andriano пишет:

Вы уж определитесь, чего именно Вы хотите.

В том то и дело, что еще не определились.
И определять будет директор ( он же владелец ) завода.
Мне только подготовить рекомендации.
Но вначале надо, чтобы механика заработала...
Но это уже чисто мои проблемы, тем более, что они постепенно преодолеваются,
там особых проблем нет.

sergeclause
sergeclause аватар
Offline
Зарегистрирован: 08.09.2016

FoxJone пишет:

Я так понимаю, ТС хочет просто какой то звук, а не оперные концерты в HiFi слушать.

Никогда так не делал, но нельзя ли просто прицепить бипер на аналоговый выход и подавать на него сигнал 00-FF с периодом (к примеру) 100 мс? Вот массив этих сигналов и записать в память...

Совершенно верно.
Нажали кнопочку на пульте - "бип!"
Включился или отработал какой-то процесс - "би-бип!"

sergeclause
sergeclause аватар
Offline
Зарегистрирован: 08.09.2016

rkit пишет:

Можно, только звука слышимого эта конструкция издавать не будет.

Через усилок пустить?

 

andriano
andriano аватар
Онлайн
Зарегистрирован: 20.06.2015

FoxJone пишет:

Никогда так не делал, но нельзя ли просто прицепить бипер на аналоговый выход и подавать на него сигнал 00-FF с периодом (к примеру) 100 мс? Вот массив этих сигналов и записать в память...

Единственная Ардуина, у которой есть аналоговый выход - это Due, но она, как правило, не рассматривается в качестве "стандартной", т.к. ее поддержка не включена в стандартную поставку.

Да, Arduino Due вполне способна воспроизводить звук, и даже довольно высокого качества (выше, чем советская аудиоаппаратура высшего класса), но вот справится ли она с декодированием mp3 в реальном времени - не знаю. При этом объем flash у нее таков, что может хранить короткие несжатые аудиофрагменты (порядка трех секунд СТЕРЕО). 

andriano
andriano аватар
Онлайн
Зарегистрирован: 20.06.2015

sergeclause пишет:

Нажали кнопочку на пульте - "бип!"

Включился или отработал какой-то процесс - "би-бип!"

Это совсем другая задача. Генерация фиксированной частоты - стандартная нересурсоемкая операция для Ардуины, причем не требующая ни байта в EEPROM.

andriano
andriano аватар
Онлайн
Зарегистрирован: 20.06.2015

sergeclause пишет:

rkit пишет:

Можно, только звука слышимого эта конструкция издавать не будет.

Через усилок пустить?

 

Да, через усилитель постоянного тока, а на выходе - электромагнит, молоточек и колокольчик.

sadman41
Онлайн
Зарегистрирован: 19.10.2016

Т.е. рекомендации производителю к железу готовит человек, который не знает, чего от этого железа ожидать нельзя и на чем можно сыканомить. Это что, советская школа?