| Микроконтроллеры, АЦП, память и т.д Темы касающиеся микроконтроллеров разных производителей, памяти, АЦП/ЦАП, периферийных модулей... |
24C64 байты в виде пакета
08.07.2011, 01:04
|
|
|
Частый гость
Регистрация: 07.11.2009
Сообщений: 11
Сказал спасибо: 5
Сказали Спасибо 11 раз(а) в 11 сообщении(ях)
|
24C64 байты в виде пакета
Всем привет!!!
Совсем не давно, занялся с одним проектом, пишу в CodeVisionAVR и столкнулся с некоторыми проблемами, вроде все решилось, но есть одно но, не смог решить одну задачу, да и вообще думаю это статья кому ни будь обязательно пригодится.
Значит EEPROM 24С64, имеет размер памяти 8192байта (8к) и задача такова считывать/записывать данные с EEPROM(24С64) по пакетам, размером 16байтов...
Сделал так, 8192байта поделил на 16байтов и получил 512пакетов по 16байтов. Например: если мне нужен третий пакет с данными то 3(пакет)*16(байтов) = получается адрес 3-го пакета с 48 до 63байта(48+15). Вот код:
|
Код:
|
Код:
#define MICROCIRCUIT_ADDRESS_24C64 0xA0 // адрес микросхемы
#define EX_EEPROM_WRITE 0x00 // Адрес записи
#define EX_EEPROM_READ 0x01 // Адрес чтение
#define SIZE_PAKCKET 16 // размер пакета
unsigned char eeprom_read(unsigned int NOM_packet)
{
char addres_bp, addres_NP; // адрес_байт_пакета, адрес_номера_пакета
unsigned char packet[SIZE_PAKCKET]; // массив, для сохранение данных одного пакета с EEPROM
addres_NP=NOM_packet*SIZE_PAKCKET; // находим адрес байта начало пакета(номер пакета умножаем на 16)
i2c_start(); // отсылка стартовой последовательности
i2c_write(MICROCIRCUIT_ADDRESS_24C64 | EX_EEPROM_WRITE); // Адрес микросхемы и устанавливаем запись
i2c_write(addres_NP››8 ); //
i2c_write(addres_NP); //
i2c_start(); // отсылка стартовой последовательности (делаем restart)
i2c_write( MICROCIRCUIT_ADDRESS_24C64 | EX_EEPROM_READ); // Адрес микросхемы и устанавливаем чтение пакета
for(addres_bp=0; addres_bp‹SIZE_PAKCKET; addres_bp++) // генерируем целость пакета
{[
packet[addres_bp]=i2c_read(0); // считываем байты с пакета и записываем в массив(packet) и не делаем подтверждение (0)
}
i2c_stop(); // отсылка завершающей последовательности
//return packet; // в функцию возвращаем значение переменной Edata
} |
Хочу сделать так: использовать подпрограмму "eeprom_read" в виде небольшой функции что бы записывать в программе типа *ctr=eeprom_read(3пакет) и НАПРИМЕР в программе обработать строковую переменную *ctr или массив с размером 16б... Если не мучатся, можно конечно массив packet[] объявить глобально, но я хочу получить полноценную функцию eeprom_read(3пакет) Чтобы просто вызвать функцию с заданным номером пакета eeprom_read(3пакет) и сразу получить в ответ данные с размером 16байтов. Пробовал для любопытства, оператор return прописывать так:
...................
*ctr=packet
return *ctr;
но это бред..
а если просто считывать один байт, то все без проблем работает
|
Код:
|
unsigned char eeprom_read(unsigned long int eeeprom_add)
{
unsigned char Edata;
i2c_start(); // отсылка стартовой последовательности
i2c_write( MICROCIRCUIT_ADDRESS_24C64 | EX_EEPROM_WRITE); // Адрес микросхемы и устанавливаем запись
i2c_write(eeeprom_add››8); //
i2c_write(eeeprom_add); //
i2c_start(); // отсылка стартовой последовательности (делаем restart)
i2c_write( MICROCIRCUIT_ADDRESS_24C64 | EX_EEPROM_READ); // Адрес микросхемы и устанавливаем чтение данных
Edata=i2c_read(0); // считываем пакет и записываем в переменную и не делаем потверждение (0)
i2c_stop(); // отсылка завершающей последовательности
return Edata; // в функцию возвращаем значение переменной Edata
}
void main (void)
{
.......
......
i=eeprom_read(любой байт с 0...819)
......
} |
НАРОД! какие варианты есть?
|
|
|
|
08.07.2011, 07:20
|
|
|
Почётный гражданин KAZUS.RUN
Регистрация: 06.06.2008
Сообщений: 1,519
Сказал спасибо: 76
Сказали Спасибо 427 раз(а) в 365 сообщении(ях)
|
Re: 24C64 байты в виде пакета
равно нулью, так как
|
Цитата:
|
|
char addres_bp, addres_NP;
|
он типа char (а должен int, а лучше определить две переменные, определяющие старший и младший байты адреса, на всякий случай выберите определите их unsigned ), и конечно на все прочитанные байты, кроме последнего надо посылать бит подтверждения, именно поэтому у Вас читается только первый байт в пакете.
PS. Внимательно прочитайте даташит на данную мс.
|
|
|
|
Эти 2 пользователя(ей) сказали Спасибо nonamedov за это сообщение:
|
|
|
08.07.2011, 10:03
|
|
|
Вид на жительство
Регистрация: 05.07.2006
Адрес: Tashkent
Сообщений: 454
Сказал спасибо: 24
Сказали Спасибо 67 раз(а) в 44 сообщении(ях)
|
Re: 24C64 байты в виде пакета
Если функция возвращает указатель на строку, то она соотвественно и должна быть декларирована как указатель на *char.
|
|
|
|
Эти 2 пользователя(ей) сказали Спасибо uk8amk за это сообщение:
|
|
|
08.07.2011, 11:51
|
|
|
Частый гость
Регистрация: 07.11.2009
Сообщений: 11
Сказал спасибо: 5
Сказали Спасибо 11 раз(а) в 11 сообщении(ях)
|
Re: 24C64 байты в виде пакета
Вроде все исправил, скомпилировал вроде ошибок нет...
Сегодня вечером попробую запустить...
nonamedov спасибо за подсказку по поводу подтверждения... совсем забыл про это
|
Код:
|
#define MICROCIRCUIT_ADDRESS_24C64 0xA0 // адрес микросхемы
#define EX_EEPROM_WRITE 0x00 // Адрес записи
#define EX_EEPROM_READ 0x01 // Адрес чтения
#define SIZE_PAKCKET 16 // размер пакета
char *eeprom_read(unsigned int NOM_packet)
{
unsigned char addres_bp, *ypacket; // адрес_байт_пакета,
unsigned int addres_NP; // адрес_номера_пакета
unsigned char packet[SIZE_PAKCKET]; // массив, для сохранение данных одного пакета с EEPROM
addres_NP=NOM_packet*SIZE_PAKCKET; // находим адрес байта начало пакета(номер пакета умнажаем на 16)
i2c_start(); // отсылка стартовой последовательности
i2c_write(MICROCIRCUIT_ADDRESS_24C64 | EX_EEPROM_WRITE); // Адрес микросхемы и устанавливаем запись
i2c_write(addres_NP››8); //
i2c_write(addres_NP); //
i2c_start(); // отсылка стартовой последовательности (делаем restart)
i2c_write( MICROCIRCUIT_ADDRESS_24C64 | EX_EEPROM_READ); // Адрес микросхемы и устанавливаем чтение пакета
for(addres_bp=0; addres_bp‹(SIZE_PAKCKET-1); addres_bp++) // генерируем пакет
{
packet[addres_bp]=i2c_read(1); // считываем байт с EEPROM и записывем в массив(packet)
} // и отсылаем подтверждение(1) для получения следующего байта
packet[SIZE_PAKCKET-1]=i2c_read(0); // получаем последний байт и не делаем подтверждение(0)
ypacket=packet; //
i2c_stop(); // отсылка завершающей последовательности
return ypacket; // в функцию возращаем значение переменной Edata
} |
кто подскажет, почему в некоторых примерах пишут так, например:
|
Код:
|
return (char*)ypacket; |
?????
|
|
|
|
09.07.2011, 08:10
|
|
|
Почётный гражданин KAZUS.RUN
Регистрация: 06.06.2008
Сообщений: 1,519
Сказал спасибо: 76
Сказали Спасибо 427 раз(а) в 365 сообщении(ях)
|
Re: 24C64 байты в виде пакета
Последний раз редактировалось nonamedov; 09.07.2011 в 12:55.
|
|
|
|
Сказали "Спасибо" nonamedov
|
|
|
18.07.2011, 10:52
|
|
|
Частый гость
Регистрация: 07.11.2009
Сообщений: 11
Сказал спасибо: 5
Сказали Спасибо 11 раз(а) в 11 сообщении(ях)
|
Re: 24C64 байты в виде пакета
Все заработало!!! 
но как всегда есть но.... 
Почему-то при чтения пакета в функции вывести данные в терминал puts(eeprom_read(0)); выдает копию последнего байта((( не могу понять почему... когда записываю пакет с данными "Proverka 16 byte"

Вот весь код:
|
Код:
|
/************************************************** ***
Chip type : ATmega16
Clock frequency : 16,000000 MHz
************************************************** ***/
#include ‹mega16.h›
#include ‹delay.h›
#include ‹stdio.h›
#asm
.equ __i2c_port=0x15 ;PORTC
.equ __sda_bit=6
.equ __scl_bit=7
#endasm
#include ‹i2c.h›
#define MICROCIRCUIT_ADDRESS_24C64 0xA0 // адрес микросхемы
#define EX_EEPROM_WRITE 0x00 // Адрес записи
#define EX_EEPROM_READ 0x01 // Адрес чтение
unsigned char fl;
unsigned char data_UART;
unsigned int i;
unsigned char *ctr, z;
char tr[20]="Proverka 16 byte";
/*
************************************************** ************************************************** ***************
* чтение EEPROM
************************************************** ************************************************** ***************
*/
#define SIZE_PAKCKET 16 // размер пакета(можем выбрать любой размер)
#define MICROCIRCUIT_ADDRESS_24C64 0xA0 // адрес микросхемы
#define EX_EEPROM_WRITE 0x00 // Адрес записи
#define EX_EEPROM_READ 0x01 // Адрес чтения
char *eeprom_read(unsigned int NOM_packet)
{
unsigned char addres_bp; // адрес_байт_пакета,
unsigned int addres_NP; // адрес_номера_пакета
unsigned char packet[SIZE_PAKCKET+2]; // массив, для сохранение данных одного пакета с EEPROM
addres_NP=NOM_packet*SIZE_PAKCKET; // находим адрес байта начало пакета(номер пакета умнажаем на 16)
i2c_start(); // отсылка стартовой последовательности
i2c_write(MICROCIRCUIT_ADDRESS_24C64 | EX_EEPROM_WRITE); // Адрес микросхемы и устанавливаем запись
i2c_write(addres_NP››8); //
i2c_write(addres_NP); //
i2c_start(); // отсылка стартовой последовательности (делаем restart)
i2c_write( MICROCIRCUIT_ADDRESS_24C64 | EX_EEPROM_READ); // Адрес микросхемы и устанавливаем чтение пакета
for(addres_bp=0; addres_bp‹(SIZE_PAKCKET-1); addres_bp++) // генерируем пакет
{
packet[addres_bp]=i2c_read(1); // считываем байт с EEPROM и записывем в массив(packet)
} // и отсылаем потверждение(1) для получения следующего байта
packet[SIZE_PAKCKET-1]=i2c_read(0); // получаем последний байт и не делаем потверждение(0)
i2c_stop(); // отсылка завершающей последовательности
return packet; // в функцию возращаем значение массива packet
}
/*
************************************************** ************************************************** ***************
* запись EEPROM
************************************************** ************************************************** ***************
*/
void eeprom_write(unsigned long int NOM_packet, char *buffer_tx)
{
unsigned char addres_bp; // адрес_байт_пакета
unsigned int addres_NP; // адрес ном.пакета
addres_NP=NOM_packet*SIZE_PAKCKET; // находим адрес байта начало пакета(номер пакета умнажаем на 16)
i2c_start(); // отсылка стартовой последовательности
i2c_write(MICROCIRCUIT_ADDRESS_24C64 | EX_EEPROM_WRITE);
i2c_write(addres_NP››8);
i2c_write(addres_NP);
for(addres_bp=0; addres_bp‹SIZE_PAKCKET; addres_bp++) // записываем SIZE_PAKCKET битный пакет
{
i2c_write(buffer_tx[addres_bp]); // Отправляем один байт в EEPROM с адресом NOM_packet+х
}
i2c_stop(); // отсылка завершающей последовательности
}
/*
************************************************** ************************************************** ***************
* Обработка UART
************************************************** ************************************************** ***************
*/
#define UPE 2
#define OVR 3
#define FE 4
#define FRAMING_ERROR (1‹‹FE)
#define PARITY_ERROR (1‹‹UPE)
#define DATA_OVERRUN (1‹‹OVR)
interrupt [USART_RXC] void usart_rx_isr(void)
{
char status;
status=UCSRA;
if ((status & (FRAMING_ERROR | PARITY_ERROR | DATA_OVERRUN))==0) // если пакет пришел с UART-а без ошибок то
{
data_UART=UDR;
fl=1;
}
UDR=data_UART; //и принятый пакет отпровляем обратно, для потверждение правильности
}
void main(void)
{
PORTA=0x00;
DDRA=0x0F;
PORTD=0x00;
DDRD=0x02;
// USART Baud Rate: 9600
UCSRA=0x00;
UCSRB=0x98;
UCSRC=0x86;
UBRRH=0x00;
UBRRL=0x33;
i2c_init();
#asm("sei")
eeprom_write(0, tr); // отправляем 0пакет с данными Proverka 16 byte
while (1)
{
if(fl==1)
{
ctr=eeprom_read(0); // опрашиваем 0 пакет и записывам в строковую переменную
puts(eeprom_read(0)); // полученный результат вывести в трминал
putchar('\r');
for(z=0; z‹SIZE_PAKCKET; z++) // другой способ отправки в терминал, по байтам
{
putchar(ctr[z]);
}
fl=0;
}
};
} |
можно таким способом... но это не то...
|
Код:
|
for(z=0; z‹SIZE_PAKCKET; z++) // другой способ отправки в терминал, по байтам
{
putchar(ctr[z]);
} |
хочется таким способом
|
Код:
|
puts(eeprom_read(0)); |
Вот файл с проектом, чтобы пакет появился на терминале, нажмите любую клавишу в терминале...
|
|
|
|
20.07.2011, 02:06
|
|
|
Почётный гражданин KAZUS.RUN
Регистрация: 06.06.2008
Сообщений: 1,519
Сказал спасибо: 76
Сказали Спасибо 427 раз(а) в 365 сообщении(ях)
|
Re: 24C64 байты в виде пакета
Сообщение от Roidi
|
|
Почему-то при чтения пакета в функции вывести данные в терминал puts(eeprom_read(0)); выдает копию последнего байта
|
Вот цитата из help-a, думаю, сами разберетесь.
|
Цитата:
|
void puts(char *str)
outputs, using putchar, the null terminated character string str, located in SRAM, followed by a new line character.
|
|
|
|
|
Сказали "Спасибо" nonamedov
|
|
|
20.07.2011, 12:17
|
|
|
Частый гость
Регистрация: 07.11.2009
Сообщений: 11
Сказал спасибо: 5
Сказали Спасибо 11 раз(а) в 11 сообщении(ях)
|
Re: 24C64 байты в виде пакета
не совсем разобрался, но понял. Я на самом деле не так сильен, начинающий! да и многое всего позабыл за учебное время)
Вроде все работает, просто увеличил размер буфера пакета
|
Код:
|
unsigned char packet[SIZE_PAKCKET+3]; |
Теперь я доволен)
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 00:22.
|
|