eeprom AT24C256

grbox
Offline
Зарегистрирован: 16.04.2015

или ваша помощь заключатся только в преобразования сорказма в текст ?

grbox
Offline
Зарегистрирован: 16.04.2015
/*
ASCII table

Prints out byte values in all possible formats:
* as raw binary values
* as ASCII-encoded decimal, hex, octal, and binary values

For more on ASCII, see http://www.asciitable.com and http://en.wikipedia.org/wiki/ASCII

The circuit: No external hardware needed.

created 2006
by Nicholas Zambetti
modified 9 Apr 2012
by Tom Igoe

This example code is in the public domain.

<http://www.zambetti.com>

 */
void setup() {
  //Initialize serial and wait for port to open:
  Serial.begin(9600);
  while (!Serial) {
    ; // wait for serial port to connect. Needed for native USB port only
  }

  // prints title with ending line break
  Serial.println("ASCII Table ~ Character Map");
}

// first visible ASCIIcharacter '!' is number 33:
int thisByte = 33;
// you can also write ASCII characters in single quotes.
// for example. '!' is the same as 33, so you could also use this:
//int thisByte = '!';

void loop() {
  // prints value unaltered, i.e. the raw binary version of the
  // byte. The serial monitor interprets all bytes as
  // ASCII, so 33, the first number, will show up as '!'
  Serial.write(thisByte);

  Serial.print(", dec: ");
  // prints value as string as an ASCII-encoded decimal (base 10).
  // Decimal is the default format for Serial.print() and Serial.println(),
  // so no modifier is needed:
  Serial.print(thisByte);
  // But you can declare the modifier for decimal if you want to.
  //this also works if you uncomment it:

  // Serial.print(thisByte, DEC);


  Serial.print(", hex: ");
  // prints value as string in hexadecimal (base 16):
  Serial.print(thisByte, HEX);

  Serial.print(", oct: ");
  // prints value as string in octal (base 8);
  Serial.print(thisByte, OCT);

  Serial.print(", bin: ");
  // prints value as string in binary (base 2)
  // also prints ending line break:
  Serial.println(thisByte, BIN);

  // if printed last visible character '~' or 126, stop:
  if (thisByte == 126) {    // you could also use if (thisByte == '~') {
    // This loop loops forever and does nothing
    while (true) {
      continue;
    }
  }
  // go on to the next character
thisByte++;
}

 

grbox
Offline
Зарегистрирован: 16.04.2015

представляете ваша уникальная помощь непонадобилась нашлось без вашей так утруднительной озадаченной помощи сорказмической )))

grbox
Offline
Зарегистрирован: 16.04.2015
ASCII Table ~ Character Map
!, dec: 33, hex: 21, oct: 41, bin: 100001
", dec: 34, hex: 22, oct: 42, bin: 100010
#, dec: 35, hex: 23, oct: 43, bin: 100011
$, dec: 36, hex: 24, oct: 44, bin: 100100
%, dec: 37, hex: 25, oct: 45, bin: 100101
&, dec: 38, hex: 26, oct: 46, bin: 100110
', dec: 39, hex: 27, oct: 47, bin: 100111
(, dec: 40, hex: 28, oct: 50, bin: 101000
), dec: 41, hex: 29, oct: 51, bin: 101001
*, dec: 42, hex: 2A, oct: 52, bin: 101010
+, dec: 43, hex: 2B, oct: 53, bin: 101011
,, dec: 44, hex: 2C, oct: 54, bin: 101100
-, dec: 45, hex: 2D, oct: 55, bin: 101101
., dec: 46, hex: 2E, oct: 56, bin: 101110
/, dec: 47, hex: 2F, oct: 57, bin: 101111
0, dec: 48, hex: 30, oct: 60, bin: 110000
1, dec: 49, hex: 31, oct: 61, bin: 110001
2, dec: 50, hex: 32, oct: 62, bin: 110010
3, dec: 51, hex: 33, oct: 63, bin: 110011
4, dec: 52, hex: 34, oct: 64, bin: 110100
5, dec: 53, hex: 35, oct: 65, bin: 110101
6, dec: 54, hex: 36, oct: 66, bin: 110110
7, dec: 55, hex: 37, oct: 67, bin: 110111
8, dec: 56, hex: 38, oct: 70, bin: 111000
9, dec: 57, hex: 39, oct: 71, bin: 111001
:, dec: 58, hex: 3A, oct: 72, bin: 111010
;, dec: 59, hex: 3B, oct: 73, bin: 111011
<, dec: 60, hex: 3C, oct: 74, bin: 111100
=, dec: 61, hex: 3D, oct: 75, bin: 111101
>, dec: 62, hex: 3E, oct: 76, bin: 111110
?, dec: 63, hex: 3F, oct: 77, bin: 111111
@, dec: 64, hex: 40, oct: 100, bin: 1000000
A, dec: 65, hex: 41, oct: 101, bin: 1000001
B, dec: 66, hex: 42, oct: 102, bin: 1000010
C, dec: 67, hex: 43, oct: 103, bin: 1000011
D, dec: 68, hex: 44, oct: 104, bin: 1000100
E, dec: 69, hex: 45, oct: 105, bin: 1000101

 

grbox
Offline
Зарегистрирован: 16.04.2015

результат выполнения программы также можете несколько раз изучить )))

Yarik.Yar
Offline
Зарегистрирован: 07.09.2014

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

grbox
Offline
Зарегистрирован: 16.04.2015

это не грубость, вам ненравится ваш сорказм ?

grbox
Offline
Зарегистрирован: 16.04.2015

Yarik.Yar пишет:
Знаете, помощь-это не "сделайте все для меня, я новичок". Это подсказка секретов человеку, стремящемуся выполнить задачу, а не получить всё на блюдечке с каёмочкой...ах да, ещё, обычно, тем, кто помогает, не грубят.

простите где в этом тексте хоть слово по теме указанной мной eeprom AT24C256. Так что ваша помощь неявляется не помощью не чем либо подобным

dr.lmg
dr.lmg аватар
Offline
Зарегистрирован: 07.01.2016

grbox, у Вас такая внешняя плата?

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

 

Штирлиц
Штирлиц аватар
Offline
Зарегистрирован: 13.06.2015

grbox, посмотрите по этой ссылке .Там и пример кода  для работы с внешним EEPROM на 256 и 512

grbox
Offline
Зарегистрирован: 16.04.2015

Большое спасибо за помощь.

dr.lmg
dr.lmg аватар
Offline
Зарегистрирован: 07.01.2016

Спасибо за ссылку! Скетч, который там приведен, работает. Но попытка вне цикла сделать запись в конкретный адрес и затем его прочитать у меня не увенчалась успехом. Что-то не так - не пойму.

#include <Wire.h>
#define i2caddr 0x50   

byte setTmp=0; 

//Записываем в постоянную внешнюю память заданную температуру (49)

  Wire.beginTransmission(0x50);
  Wire.write((int)(25000 >> 8)); // left-part of pointer address
  Wire.write((int)(25000 & 0xFF)); // and the right
  Wire.write(49);
  Wire.endTransmission();


// Читаем из внешней памяти записанное значение

  byte setTmp; // returned value
  Wire.beginTransmission(0x50); // these three lines set the pointer position in the EEPROM
  Wire.write((int)(25000 >> 8)); // left-part of pointer address
  Wire.write((int)(25000 & 0xFF)); // and the right
  Wire.endTransmission();
  Wire.requestFrom(i2caddr,1); // now get the byte of data...
  setTmp = Wire.read(); // записываем в переменную полученное из памяти значение

По идее в результате в переменной setTmp должно появиться значение 49. А там 0.

Yarik.Yar
Offline
Зарегистрирован: 07.09.2014

Хм...из того, что сразу бросается в глаза - у вас переменная с одним и тем же именем два раза инициализирована.

Yarik.Yar
Offline
Зарегистрирован: 07.09.2014

И, того...это всё надо делать либо в loop, либо в setup. Иначе не прокатит.

grbox
Offline
Зарегистрирован: 16.04.2015

у меня также неполучилось, я думаю писать можно только постранично.

dr.lmg
dr.lmg аватар
Offline
Зарегистрирован: 07.01.2016

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

Объявление библиотеки и устройства идут в начале кода, в setup() в память записываются данные и там же читаются. Вот более полный код.

#include <Wire.h>
#define i2caddr 0x50   

byte setTmp=0; 
// Подключаем библиотеки
#include <relay8.h>
#include <OneWire.h>
#include <DallasTemperature.h>


// библиотека для работы с дисплеем
#include <UTFT.h>
// создаём объект класса UTFT
// и передаём идентификатор модели дисплея и номера управляющих пинов
UTFT myGLCD(CTE32HR, 38, 39, 40, 41);
// объявления встроенного шрифта
extern uint8_t BigFont[];


void setup() {


//Записываем в постоянную внешнюю память заданную температуру
// writes a byte of data 'data' to the chip at I2C address 'device', in memory location 'add'

 Wire.beginTransmission(0x50);
  Wire.write((int)(25000 >> 8)); // left-part of pointer address
 Wire.write((int)(25000 & 0xFF)); // and the right
 Wire.write(49);
Wire.endTransmission();

//EEPROM.write(3, 30);

//Считаем из постоянной памяти заданную температуру


  byte setTmp; // returned value
  Wire.beginTransmission(0x50); // these three lines set the pointer position in the EEPROM
  Wire.write((int)(25000 >> 8)); // left-part of pointer address
  Wire.write((int)(25000 & 0xFF)); // and the right
  Wire.endTransmission();
  Wire.requestFrom(i2caddr,1); // now get the byte of data...
  setTmp = Wire.read();



// инициализируем дисплей
  myGLCD.InitLCD();
// очищаем экран
  myGLCD.clrScr();
// выбираем тип шрифта
  myGLCD.setFont(BigFont);

// выведем на дисплей заданное значение температуры
  
//myGLCD.setCursor(0, 0); 
myGLCD.print("HOME.lmg", CENTER, 0);

myGLCD.print("  Version 0.2  ", CENTER, 72);

myGLCD.print(setTmp, CENTER, 120);
delay(900);

// очищаем экран
myGLCD.clrScr();
}

 

Yarik.Yar
Offline
Зарегистрирован: 07.09.2014

Уберите строку #37.

dr.lmg
dr.lmg аватар
Offline
Зарегистрирован: 07.01.2016

Убрал. Теперь показывает значение 255.

Yarik.Yar
Offline
Зарегистрирован: 07.09.2014

Значит запись не прошла.

Yarik.Yar
Offline
Зарегистрирован: 07.09.2014

Попробуйте в строках 27,28,39,40 заменить (int) на (byte)

dr.lmg
dr.lmg аватар
Offline
Зарегистрирован: 07.01.2016

Без изменений. Ума не приложу, что не так :(

dr.lmg
dr.lmg аватар
Offline
Зарегистрирован: 07.01.2016

Вот скетч, который распрекрасно пишет во внешнюю память.


#include "Wire.h"  // for I2C
#define chip1 0x50 // device address for left-hand chip on our breadboard
#define chip2 0x51 // and the right

// always have your values in variables
unsigned int pointer = 69; // we need this to be unsigned, as you may have an address > 32767
byte d=0; // example variable to handle data going in and out of EERPROMS

void setup()
{
  Serial.begin(9600); // for screen output
  Wire.begin(); // wake up, I2C!
}

void writeData(int device, unsigned int add, byte data) 
// writes a byte of data 'data' to the chip at I2C address 'device', in memory location 'add'
{
  Wire.beginTransmission(device);
  Wire.write((int)(add >> 8)); // left-part of pointer address
  Wire.write((int)(add & 0xFF)); // and the right
  Wire.write(data);
  Wire.endTransmission();
  delay(10);
}

byte readData(int device, unsigned int add) 
// reads a byte of data from memory location 'add' in chip at I2C address 'device' 
{
  byte result; // returned value
  Wire.beginTransmission(device); // these three lines set the pointer position in the EEPROM
  Wire.write((int)(add >> 8)); // left-part of pointer address
  Wire.write((int)(add & 0xFF)); // and the right
  Wire.endTransmission();
  Wire.requestFrom(device,1); // now get the byte of data...
  result = Wire.read();
  return result; // and return it as a result of the function readData
}

void loop()
{
  Serial.println("Writing data...");
  for (int a=0; a<20; a++)
  {
    writeData(chip1,a,a);
    writeData(chip2,a,a); // looks like a tiny EEPROM RAID solution!
  }
  Serial.println("Reading data...");
  for (int a=0; a<20; a++)
  {
    Serial.print("chip1 pointer ");
    Serial.print(a);
    Serial.print(" holds ");
    d=readData(chip1,a);
    Serial.println(d, DEC);
  }
  for (int a=0; a<20; a++)
  {
    Serial.print("chip2 pointer ");
    Serial.print(a);
    Serial.print(" holds ");
    d=readData(chip2,a);
    Serial.println(d, DEC);
  } 
}

 

Andrey12
Andrey12 аватар
Offline
Зарегистрирован: 26.12.2014

Уважаемый dr.lmg подскажите что спасло ситуацию с записью?
Я вижу только одно различие в вашем коде, это задержка delay(10); в 23 строке работающего кода.

То есть после записи надо подождать 10мс перед следующей операцией?

MacSim
Offline
Зарегистрирован: 28.11.2012

пытался писать без задержки 24с32, при записи были сбои, причем все время одинаковые. писал в 10 ячеек значение 21. в 1 и 2 все время были значения  66 и 67. с задержкой все отлично.

но вроде память должна выдавать свое состояние, т.е. можно отслеживать когда она занята. проверять занятость до посылки записи. как проверить состояние занятости?

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

1. По дэйташиту требуется задержка 5 мс. Мои эксперименты показали, что по крайней мере для того экземпляра, что есть у меня, задержку можно уменьшить до 1.3 мс.

2. Пределах страницы можно писать сколько угодно байтов без задержек за один цикл записи. Т.е. при записи нескольких чисел целесообразно собрать их в байтовый массив и писать одномоментно.

3. ПО логике работы EEPROM используется в качестве "дискетки" т.е. для редко обновляемых данных. ПОэтому писать блок данных чаще, чем раз в 5 мс, как правило, не нужно. Исключение - если данные переходят через границу страницы - тогда их нужно писать в два цикла записи и задержкой между ними.

4. В EEPROM действительно предусмотрена индикация, когда в нее можно писать, а когда - нет. Но, почему-то в библиотеке wire реакция на нее не предусмотрена.

w5277c
Offline
Зарегистрирован: 11.09.2018

Вот умора, давненько так не смеялся.

grbox - Вы смешной, знаете почему?

Потому, что даже с ардуиной в которой все сделано пусть и через заднее место но зато для тех кто не хочет думать, даже здесь

Вы не в силах разобраться.

Впрочем как и с Русским языком, но это конечно оффтоп.

Работа с микроконтроллерами обязывает читать много даташитов, копаться много долго и нудно в коде, часами выискивать причину сбоев и тому подобное. Если Вы не готовы это делать и ждете, что за Вас это кто-то за спасибо будет делать, то наверное тогда Вам попросту не стоит этим заниматься.

А злой я потому, что форумы нужны для решения реальных проблем а не для удовлетвороения чьей-то лени.

Но такие как Вы засрали все, куда не копни везде лодыри со своими элементарными вопросами, чтож вы все не сидите на хабрахабрах и на мейл ру? Чтож вас так по всему интернету разбросало?...

 

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Два с половиной года копилось и, наконец, выплеснулось...

w5277c
Offline
Зарегистрирован: 11.09.2018

andriano пишет:

Два с половиной года копилось и, наконец, выплеснулось...

 

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

Ах да, это же форум ардуинщиков, прошу прощения.

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

А вот так и получается.

Практика показывает, что то, как пишет человек, от языка не зависит. Если по-русски не умеет сформулировать мысль, то и на Си - точно так же.

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

andriano пишет:

А вот так и получается.

Практика показывает, что то, как пишет человек, от языка не зависит. Если по-русски не умеет сформулировать мысль, то и на Си - точно так же.

Люто, бешено плюсую.   ЕГЭнутые зачастую и по-русски то писать не умеют, не то што на С. 

Logik
Offline
Зарегистрирован: 05.08.2014

Так чтоб сформулировать мысль - она должна быть. Если её нет, то на любом языке её не напишеш. Спрашывающий на форуме ведь не о том думает, чего нужно сделать чтоб работало. У него нет мыслей о этом. Уже нет, или еще нет, хуже если даже и не было. Зато есть мысли о том чего бы сделать, чтоб другие подсказали, что нужно чтоб работало. Он думает о том как переложить свои проблемы на других. Вот это он бы мог четко изложить ))) Но низя, противоречит задаче! Хотя конечно есть кадры которые впринципе четко ниче не напишут, ни по какому вопросу, никогда. То совсем уж печально.