| Форум РадиоКот https://radiokot.ru/forum/ |
|
| Библиотека CVAVR EEPROM 24LC256 для записи: 2, 4 байт чисел? https://radiokot.ru/forum/viewtopic.php?f=53&t=170562 |
Страница 1 из 2 |
| Автор: | CAT86 [ Ср май 06, 2020 23:32:37 ] |
| Заголовок сообщения: | Библиотека CVAVR EEPROM 24LC256 для записи: 2, 4 байт чисел? |
Здравствуйте форумчане Компилятор:Codevisionavr v.3.12 Готовая библиотека 1-байт. Её нужно доработать, что бы можно 2, 4 байта записывать в память Код: #define EEPROM_BUS_ADDRESS 0xa0 // Tyt stavim adress for EEPROM /* Чтение байта из памяти EEPROM */ unsigned char eeplc24_read(unsigned char address_high, unsigned char address_low) { unsigned char data; i2c_start(); i2c_write(EEPROM_BUS_ADDRESS); i2c_write(address_high); i2c_write(address_low); i2c_start(); i2c_write(EEPROM_BUS_ADDRESS | 1); data=i2c_read(0); i2c_stop(); return data; } /* Запись байта в память EEPROM */ void eeplc24_write(unsigned char address_high, unsigned char address_low, unsigned char data) { i2c_start(); i2c_write(EEPROM_BUS_ADDRESS); i2c_write(address_high); i2c_write(address_low); i2c_write(data); i2c_stop(); /* 10ms delay to complete the write operation */ delay_ms(7); } Код: #ifndef _24lcxx_INCLUDED_
#define _24lcxx_INCLUDED_ #pragma used+ /* Чтение байта из памяти EEPROM */ unsigned char eeplc24_read(unsigned char address_high, unsigned char address_low); /* Запись байта в память EEPROM */ void eeplc24_write(unsigned char address_high, unsigned char address_low, unsigned char data); #pragma used- #pragma library 24lcxx.lib #endif |
|
| Автор: | microsystems [ Чт май 07, 2020 10:05:01 ] |
| Заголовок сообщения: | Re: Библиотека CVAVR EEPROM 24LC256 для записи: 2, 4 байт чи |
Т.е. один байт прочитать можете, а два -нет? Ну, ё-маё... Стопицоттыщ. |
|
| Автор: | ELECTROS [ Чт май 07, 2020 10:18:32 ] |
| Заголовок сообщения: | Re: Библиотека CVAVR EEPROM 24LC256 для записи: 2, 4 байт чи |
Код: /* Запись в память EEPROM len байт, *data - указатель на начало*/ void eeplc24_write(unsigned char address_high, unsigned char address_low, unsigned char *data, unsigned char len ) { i2c_start(); i2c_write(EEPROM_BUS_ADDRESS); i2c_write(address_high); i2c_write(address_low); while(len--){ i2c_write(*(data+len)); } i2c_stop(); /* 10ms delay to complete the write operation */ delay_ms(7); } Где деньги забирать? Передачу data возможно перевернуть надо, в документации на шину надо посмотреть как правильно (старшим или младшим вперёд). |
|
| Автор: | CAT86 [ Чт май 07, 2020 10:57:48 ] |
| Заголовок сообщения: | Re: Библиотека CVAVR EEPROM 24LC256 для записи: 2, 4 байт чи |
Где деньги забирать? Библиотеку напишите int, float, и с комментариями. Напишите в личку. |
|
| Автор: | ELECTROS [ Чт май 07, 2020 12:13:35 ] |
| Заголовок сообщения: | Re: Библиотека CVAVR EEPROM 24LC256 для записи: 2, 4 байт чи |
Вверху вы написали, что есть готовая библиотека её надо доработать, не о каких float там речи нет, речь только о байтах. Прошлое сообщение всерьёз восприняли, серьёзно? Там пару строчек добавить так же в функцию read и будет работать с любым количеством байт. |
|
| Автор: | CAT86 [ Чт май 07, 2020 17:13:32 ] |
| Заголовок сообщения: | Re: Библиотека CVAVR EEPROM 24LC256 для записи: 2, 4 байт чи |
Здравствуйте ELECTROS |
|
| Автор: | ELECTROS [ Чт май 07, 2020 18:12:09 ] |
| Заголовок сообщения: | Re: Библиотека CVAVR EEPROM 24LC256 для записи: 2, 4 байт чи |
Хорошо давайте разберёмся, вам нужно доделать две функции которые в первом вашем сообщении, чтобы можно было передавать любое число байт (до 4-х) так? |
|
| Автор: | CAT86 [ Чт май 07, 2020 18:20:53 ] |
| Заголовок сообщения: | Re: Библиотека CVAVR EEPROM 24LC256 для записи: 2, 4 байт чи |
Да Добавлено after 4 minutes 7 seconds: Re: Библиотека CVAVR EEPROM 24LC256 для записи: 2, 4 байт чисел? int от -32768 до 32767 long int от -2147483648 до 2147483647 |
|
| Автор: | ELECTROS [ Чт май 07, 2020 18:46:27 ] |
| Заголовок сообщения: | Re: Библиотека CVAVR EEPROM 24LC256 для записи: 2, 4 байт чи |
Лучше так как выше написал, через указатель и количество байт, ну если очень надо, но реализация так себе, все функции по всей видимости работают на ожидании: СпойлерКод: /* Чтение int из памяти EEPROM */ int eeplc24_read(unsigned char address_high, unsigned char address_low) { int data; i2c_start(); i2c_write(EEPROM_BUS_ADDRESS); i2c_write(address_high); i2c_write(address_low); i2c_start(); i2c_write(EEPROM_BUS_ADDRESS | 1); data = (((int)i2c_read(0))<<8) & 0xFF00; data |= i2c_read(0) & 0xFF; i2c_stop(); return data; } /* Запись int в память EEPROM */ void eeplc24_write(unsigned char address_high, unsigned char address_low, int data) { i2c_start(); i2c_write(EEPROM_BUS_ADDRESS); i2c_write(address_high); i2c_write(address_low); i2c_write((data>>8) & 0xFF); i2c_write(data & 0xFF); i2c_stop(); /* 10ms delay to complete the write operation */ delay_ms(7); } /* Чтение long int из памяти EEPROM */ long int eeplc24_read(unsigned char address_high, unsigned char address_low) { int data; i2c_start(); i2c_write(EEPROM_BUS_ADDRESS); i2c_write(address_high); i2c_write(address_low); i2c_start(); i2c_write(EEPROM_BUS_ADDRESS | 1); data = (((long int)i2c_read(0))<<24) & 0xFF000000; data |= (((long int)i2c_read(0))<<16) & 0xFF0000; data |= (((long int)i2c_read(0))<<8) & 0xFF00; data |= i2c_read(0) & 0xFF; i2c_stop(); return data; } /* Запись long int в память EEPROM */ void eeplc24_write(unsigned char address_high, unsigned char address_low, long int data) { i2c_start(); i2c_write(EEPROM_BUS_ADDRESS); i2c_write(address_high); i2c_write(address_low); i2c_write((data>>24) & 0xFF); i2c_write((data>>16) & 0xFF); i2c_write((data>>8) & 0xFF); i2c_write(data & 0xFF); i2c_stop(); /* 10ms delay to complete the write operation */ delay_ms(7); } В функции eeplc24_write параметр data поидее компилятор сам приведёт к uint8, но если ругаться будет приведёте. |
|
| Автор: | CAT86 [ Пт май 08, 2020 01:09:15 ] |
| Заголовок сообщения: | Re: Библиотека CVAVR EEPROM 24LC256 для записи: 2, 4 байт чи |
ошибки. записываю допустим число: 550 - считываю 767; записываю 34 считываю 255 |
|
| Автор: | ARV [ Пт май 08, 2020 08:30:25 ] |
| Заголовок сообщения: | Re: Библиотека CVAVR EEPROM 24LC256 для записи: 2, 4 байт чи |
ELECTROS, ваши функции на запись работать могут с ошибками, причем очень неприятными для содержимого микросхем. вы забыли, что запись ведется постранично... вот так будет работать, но медленно: Код: // это то, что уже есть unsigned char eeplc24_read(unsigned char address_high, unsigned char address_low); void eeplc24_write(unsigned char address_high, unsigned char address_low, unsigned char data); // это функция чтения любого числа, массива и т.п. void eeplc24_read_block(void *dest, unsigned int eadr, unsigned int len){ unsigned char * ptr = dest; while(len--){ *ptr++ = eeplc24_read(eadr>>8, eadr); eadr++; } } // это функция записи любого числа, массива и т.п. void eeplc24_write_block(void *src, unsigned int eadr, unsigned int len){ unsigned char * ptr = src; while(len--){ eeplc24_write(eadr>>8, eadr, *ptr++); eadr++; } } // запись float по адресу 123 float data = 0.12E-3; eeplc24_write_block(&data, 123, sizeof(float)); // чтение eeplc24_read_block(&data, 123, sizeof(float)); Добавлено after 4 minutes 26 seconds: Re: Библиотека CVAVR EEPROM 24LC256 для записи: 2, 4 байт чисел? запись массива Код: int array[12]; чтение аналогично
eeplc24_write_block(array, 100, sizeof(array)); |
|
| Автор: | ELECTROS [ Пт май 08, 2020 09:32:09 ] |
| Заголовок сообщения: | Re: Библиотека CVAVR EEPROM 24LC256 для записи: 2, 4 байт чи |
ARV, гляну а ж даташит интересно стало. Байт записать можно а больше нельзя, странно. Пы.сы. Ведь точно, считать можно как хочешь а записать только один байт или всю страницу. |
|
| Автор: | ARV [ Пт май 08, 2020 09:35:25 ] |
| Заголовок сообщения: | Re: Библиотека CVAVR EEPROM 24LC256 для записи: 2, 4 байт чи |
ELECTROS писал(а): Байт записать можно а больше нельзя больше тоже можно, но постранично - муторно, зато быстро: страница пишется за то же время, что и 1 байт. читайте даташит, да.
|
|
| Автор: | microsystems [ Пт май 08, 2020 10:13:15 ] |
| Заголовок сообщения: | Re: Библиотека CVAVR EEPROM 24LC256 для записи: 2, 4 байт чи |
да, да. если попали между страниц, то привет. запись будет с ошибкой. Тут либо по одному байту делать запись. либо контролировать страницы. |
|
| Автор: | CAT86 [ Пт май 08, 2020 17:26:48 ] |
| Заголовок сообщения: | Re: Библиотека CVAVR EEPROM 24LC256 для записи: 2, 4 байт чи |
Код: // это функция чтения любого числа, массива и т.п. void eeplc24_read_block(void *dest, unsigned int eadr, unsigned int len){ unsigned char * ptr = dest; while(len--){ *ptr++ = eeplc24_read(eadr>>8, eadr); eadr++; } } // это функция записи любого числа, массива и т.п. void eeplc24_write_block(void *src, unsigned int eadr, unsigned int len){ unsigned char * ptr = src; while(len--){ eeplc24_write(eadr>>8, eadr, *ptr++); eadr++; } } скажите, можно ли эти функции вставить в библиотеку? скажите как правильно вызвать? что означает указатель на переменную *dest ; *src ?. |
|
| Автор: | ATON [ Пт май 08, 2020 17:57:22 ] |
| Заголовок сообщения: | Re: Библиотека CVAVR EEPROM 24LC256 для записи: 2, 4 байт чи |
Указатель на переменную означает, внезапно, что это указатель на переменную. Букварь читать. И да, там рядом про приоритеты операций тоже написано, тоже внимательно изучите. |
|
| Автор: | ARV [ Пт май 08, 2020 20:47:32 ] |
| Заголовок сообщения: | Re: Библиотека CVAVR EEPROM 24LC256 для записи: 2, 4 байт чи |
Я же привёл примеры того, как использовать функции! Не знаю, что вы имеете ввиду под "библиотекой", но я бы просто вынес их в отдельный сишный файл, который бы просто добавлял к нужным проектам, да и все. Можно ещё сделать заголовочный файл, в котором просто написать прототипы этих функций... |
|
| Автор: | CAT86 [ Пт май 08, 2020 20:58:20 ] |
| Заголовок сообщения: | Re: Библиотека CVAVR EEPROM 24LC256 для записи: 2, 4 байт чи |
код не работает! всё равно передается 1 байт 0...255 смотрю запись/чтение логическим анализатором. Код: #ifndef _24lcxx_INCLUDED_ #define _24lcxx_INCLUDED_ #pragma used+ /* Чтение байта ипамяти EEPROM */ unsigned char eeplc24_read(unsigned char address_high, unsigned char address_low); /* запись в память EEPROM */ void eeplc24_write(unsigned char address_high, unsigned char address_low, unsigned char data); // это функция чтения любого числа, массива и т.п. void eeplc24_read_block(void *dest, unsigned int eadr, unsigned int len){ unsigned char * ptr = dest; while(len--){ *ptr++ = eeplc24_read(eadr>>8, eadr); eadr++; } } // это функция записи любого числа, массива и т.п. void eeplc24_write_block(void *src, unsigned int eadr, unsigned int len){ unsigned char * ptr = src; while(len--){ eeplc24_write(eadr>>8, eadr, *ptr++); eadr++; } } #pragma used- #pragma library 24lcxx.lib #endif Добавлено after 5 minutes 25 seconds: Re: Библиотека CVAVR EEPROM 24LC256 для записи: 2, 4 байт чисел? библиотека это и есть отдельный файл, который привязывается к сишному файлу 24lcXX.lib 24lcXX.h |
|
| Автор: | ELECTROS [ Пт май 08, 2020 21:54:06 ] |
| Заголовок сообщения: | Re: Библиотека CVAVR EEPROM 24LC256 для записи: 2, 4 байт чи |
Ну вообще то грубо говоря *.lib это закрытый *.с. Имея исходник, lib файл сделать легко, поэтому тут разговоры ни о чём на этот счёт. По мне так это нужно в одном случае - если отдаётся на сторону весь проект и не хочется светить отдельные его части. CAT86 Давай те с начало, говорите не работает. А с теми функциями которые вначале приводили работает? Как вы используете функции пример приведите. Поясните что значит передаётся один байт? (может и не то но всё же: как бы передача и будет идти по одному байту, но по инкрементируемому адресу, столько раз сколько укажите). ATON, я про указатели понял еще после первого своего сообщения |
|
| Автор: | CAT86 [ Пт май 08, 2020 22:53:56 ] |
| Заголовок сообщения: | Re: Библиотека CVAVR EEPROM 24LC256 для записи: 2, 4 байт чи |
тоже не работает я писал, несколько постов с верху. int M1_side_A=0; if (mem==1){ eeplc24_write(0, 0, M1_side_A);} M1_side_A=eeplc24_read(0,0); если я пытаюсь записать в переменную M1_side_A=300; то запишется 43, а если M1_side_A=-300; то 44 и в том духе |
|
| Страница 1 из 2 | Часовой пояс: UTC + 3 часа |
| Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group http://www.phpbb.com/ |
|


