/*
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++;
}
Знаете, помощь-это не "сделайте все для меня, я новичок". Это подсказка секретов человеку, стремящемуся выполнить задачу, а не получить всё на блюдечке с каёмочкой...ах да, ещё, обычно, тем, кто помогает, не грубят.
Знаете, помощь-это не "сделайте все для меня, я новичок". Это подсказка секретов человеку, стремящемуся выполнить задачу, а не получить всё на блюдечке с каёмочкой...ах да, ещё, обычно, тем, кто помогает, не грубят.
простите где в этом тексте хоть слово по теме указанной мной eeprom AT24C256. Так что ваша помощь неявляется не помощью не чем либо подобным
Спасибо за ссылку! Скетч, который там приведен, работает. Но попытка вне цикла сделать запись в конкретный адрес и затем его прочитать у меня не увенчалась успехом. Что-то не так - не пойму.
#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, я просто из своего кода выдрал те куски кода, которые используются для работы с внешней памятью.
Объявление библиотеки и устройства идут в начале кода, в 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();
}
Вот скетч, который распрекрасно пишет во внешнюю память.
#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);
}
}
Уважаемый dr.lmg подскажите что спасло ситуацию с записью?
Я вижу только одно различие в вашем коде, это задержка delay(10); в 23 строке работающего кода.
То есть после записи надо подождать 10мс перед следующей операцией?
пытался писать без задержки 24с32, при записи были сбои, причем все время одинаковые. писал в 10 ячеек значение 21. в 1 и 2 все время были значения 66 и 67. с задержкой все отлично.
но вроде память должна выдавать свое состояние, т.е. можно отслеживать когда она занята. проверять занятость до посылки записи. как проверить состояние занятости?
1. По дэйташиту требуется задержка 5 мс. Мои эксперименты показали, что по крайней мере для того экземпляра, что есть у меня, задержку можно уменьшить до 1.3 мс.
2. Пределах страницы можно писать сколько угодно байтов без задержек за один цикл записи. Т.е. при записи нескольких чисел целесообразно собрать их в байтовый массив и писать одномоментно.
3. ПО логике работы EEPROM используется в качестве "дискетки" т.е. для редко обновляемых данных. ПОэтому писать блок данных чаще, чем раз в 5 мс, как правило, не нужно. Исключение - если данные переходят через границу страницы - тогда их нужно писать в два цикла записи и задержкой между ними.
4. В EEPROM действительно предусмотрена индикация, когда в нее можно писать, а когда - нет. Но, почему-то в библиотеке wire реакция на нее не предусмотрена.
Потому, что даже с ардуиной в которой все сделано пусть и через заднее место но зато для тех кто не хочет думать, даже здесь
Вы не в силах разобраться.
Впрочем как и с Русским языком, но это конечно оффтоп.
Работа с микроконтроллерами обязывает читать много даташитов, копаться много долго и нудно в коде, часами выискивать причину сбоев и тому подобное. Если Вы не готовы это делать и ждете, что за Вас это кто-то за спасибо будет делать, то наверное тогда Вам попросту не стоит этим заниматься.
А злой я потому, что форумы нужны для решения реальных проблем а не для удовлетвороения чьей-то лени.
Но такие как Вы засрали все, куда не копни везде лодыри со своими элементарными вопросами, чтож вы все не сидите на хабрахабрах и на мейл ру? Чтож вас так по всему интернету разбросало?...
Так чтоб сформулировать мысль - она должна быть. Если её нет, то на любом языке её не напишеш. Спрашывающий на форуме ведь не о том думает, чего нужно сделать чтоб работало. У него нет мыслей о этом. Уже нет, или еще нет, хуже если даже и не было. Зато есть мысли о том чего бы сделать, чтоб другие подсказали, что нужно чтоб работало. Он думает о том как переложить свои проблемы на других. Вот это он бы мог четко изложить ))) Но низя, противоречит задаче! Хотя конечно есть кадры которые впринципе четко ниче не напишут, ни по какому вопросу, никогда. То совсем уж печально.
или ваша помощь заключатся только в преобразования сорказма в текст ?
представляете ваша уникальная помощь непонадобилась нашлось без вашей так утруднительной озадаченной помощи сорказмической )))
результат выполнения программы также можете несколько раз изучить )))
Знаете, помощь-это не "сделайте все для меня, я новичок". Это подсказка секретов человеку, стремящемуся выполнить задачу, а не получить всё на блюдечке с каёмочкой...ах да, ещё, обычно, тем, кто помогает, не грубят.
это не грубость, вам ненравится ваш сорказм ?
простите где в этом тексте хоть слово по теме указанной мной eeprom AT24C256. Так что ваша помощь неявляется не помощью не чем либо подобным
grbox, у Вас такая внешняя плата?
А то в затруднении, как записывать / читать из внешней памяти, не трогая внутрненнюю.
grbox, посмотрите по этой ссылке .Там и пример кода для работы с внешним EEPROM на 256 и 512
Большое спасибо за помощь.
Спасибо за ссылку! Скетч, который там приведен, работает. Но попытка вне цикла сделать запись в конкретный адрес и затем его прочитать у меня не увенчалась успехом. Что-то не так - не пойму.
По идее в результате в переменной setTmp должно появиться значение 49. А там 0.
Хм...из того, что сразу бросается в глаза - у вас переменная с одним и тем же именем два раза инициализирована.
И, того...это всё надо делать либо в loop, либо в setup. Иначе не прокатит.
у меня также неполучилось, я думаю писать можно только постранично.
Yarik.Yar, я просто из своего кода выдрал те куски кода, которые используются для работы с внешней памятью.
Объявление библиотеки и устройства идут в начале кода, в setup() в память записываются данные и там же читаются. Вот более полный код.
Уберите строку #37.
Убрал. Теперь показывает значение 255.
Значит запись не прошла.
Попробуйте в строках 27,28,39,40 заменить (int) на (byte)
Без изменений. Ума не приложу, что не так :(
Вот скетч, который распрекрасно пишет во внешнюю память.
Уважаемый dr.lmg подскажите что спасло ситуацию с записью?
Я вижу только одно различие в вашем коде, это задержка
delay(10);
в 23 строке работающего кода.То есть после записи надо подождать 10мс перед следующей операцией?
пытался писать без задержки 24с32, при записи были сбои, причем все время одинаковые. писал в 10 ячеек значение 21. в 1 и 2 все время были значения 66 и 67. с задержкой все отлично.
но вроде память должна выдавать свое состояние, т.е. можно отслеживать когда она занята. проверять занятость до посылки записи. как проверить состояние занятости?
1. По дэйташиту требуется задержка 5 мс. Мои эксперименты показали, что по крайней мере для того экземпляра, что есть у меня, задержку можно уменьшить до 1.3 мс.
2. Пределах страницы можно писать сколько угодно байтов без задержек за один цикл записи. Т.е. при записи нескольких чисел целесообразно собрать их в байтовый массив и писать одномоментно.
3. ПО логике работы EEPROM используется в качестве "дискетки" т.е. для редко обновляемых данных. ПОэтому писать блок данных чаще, чем раз в 5 мс, как правило, не нужно. Исключение - если данные переходят через границу страницы - тогда их нужно писать в два цикла записи и задержкой между ними.
4. В EEPROM действительно предусмотрена индикация, когда в нее можно писать, а когда - нет. Но, почему-то в библиотеке wire реакция на нее не предусмотрена.
Вот умора, давненько так не смеялся.
grbox - Вы смешной, знаете почему?
Потому, что даже с ардуиной в которой все сделано пусть и через заднее место но зато для тех кто не хочет думать, даже здесь
Вы не в силах разобраться.
Впрочем как и с Русским языком, но это конечно оффтоп.
Работа с микроконтроллерами обязывает читать много даташитов, копаться много долго и нудно в коде, часами выискивать причину сбоев и тому подобное. Если Вы не готовы это делать и ждете, что за Вас это кто-то за спасибо будет делать, то наверное тогда Вам попросту не стоит этим заниматься.
А злой я потому, что форумы нужны для решения реальных проблем а не для удовлетвороения чьей-то лени.
Но такие как Вы засрали все, куда не копни везде лодыри со своими элементарными вопросами, чтож вы все не сидите на хабрахабрах и на мейл ру? Чтож вас так по всему интернету разбросало?...
Два с половиной года копилось и, наконец, выплеснулось...
Два с половиной года копилось и, наконец, выплеснулось...
Мне вот всегда было интересно, как вообще у людей получается код писать с таким логичесим мышлением.
Ах да, это же форум ардуинщиков, прошу прощения.
А вот так и получается.
Практика показывает, что то, как пишет человек, от языка не зависит. Если по-русски не умеет сформулировать мысль, то и на Си - точно так же.
А вот так и получается.
Практика показывает, что то, как пишет человек, от языка не зависит. Если по-русски не умеет сформулировать мысль, то и на Си - точно так же.
Люто, бешено плюсую. ЕГЭнутые зачастую и по-русски то писать не умеют, не то што на С.
Так чтоб сформулировать мысль - она должна быть. Если её нет, то на любом языке её не напишеш. Спрашывающий на форуме ведь не о том думает, чего нужно сделать чтоб работало. У него нет мыслей о этом. Уже нет, или еще нет, хуже если даже и не было. Зато есть мысли о том чего бы сделать, чтоб другие подсказали, что нужно чтоб работало. Он думает о том как переложить свои проблемы на других. Вот это он бы мог четко изложить ))) Но низя, противоречит задаче! Хотя конечно есть кадры которые впринципе четко ниче не напишут, ни по какому вопросу, никогда. То совсем уж печально.