Реклама на сайте DatasheetsDatasheets

KAZUS.RUN - Электронный портал. Принципиальные схемы, Datasheets, Форум по электронике

Новости электроники Новости Литература, электронные книги Литература Документация, даташиты Документация Поиск даташитов (datasheets)Поиск PDF
  От производителей
Новости поставщиков
В мире электроники

  Сборник статей
Книги и журналы
FAQ по электронике

  Datasheets
Поиск SMD
Онлайн справочник

Принципиальные схемы Схемы Каталоги программ, сайтов Каталоги Общение, форум Общение Ваш аккаунтАккаунт
  Каталог схем
Схемы и проекты
Принципиальные схемы
  Программы
Каталог сайтов
Калькуляторы
  Форумы по электронике
Помощь проекту

Микроконтроллеры, АЦП, память и т.д Темы касающиеся микроконтроллеров разных производителей, памяти, АЦП/ЦАП, периферийных модулей...

 
Опции темы

24C64 байты в виде пакета

Непрочитано 08.07.2011, 01:04  
Roidi
Частый гость
 
Регистрация: 07.11.2009
Сообщений: 11
Сказал спасибо: 5
Сказали Спасибо 11 раз(а) в 11 сообщении(ях)
Roidi на пути к лучшему
По умолчанию 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)
......
}
НАРОД! какие варианты есть?
Реклама:
Roidi вне форума  
Сказали "Спасибо" Roidi
warel (28.06.2019)
Непрочитано 08.07.2011, 07:20  
nonamedov
Почётный гражданин KAZUS.RUN
 
Регистрация: 06.06.2008
Сообщений: 1,519
Сказал спасибо: 76
Сказали Спасибо 427 раз(а) в 365 сообщении(ях)
nonamedov на пути к лучшему
По умолчанию Re: 24C64 байты в виде пакета

Цитата:
addres_NP››8
равно нулью, так как
Цитата:
char addres_bp, addres_NP;
он типа char (а должен int, а лучше определить две переменные, определяющие старший и младший байты адреса, на всякий случай выберите определите их unsigned ), и конечно на все прочитанные байты, кроме последнего надо посылать бит подтверждения, именно поэтому у Вас читается только первый байт в пакете.

PS. Внимательно прочитайте даташит на данную мс.
nonamedov вне форума  
Эти 2 пользователя(ей) сказали Спасибо nonamedov за это сообщение:
Roidi (08.07.2011), warel (28.06.2019)
Непрочитано 08.07.2011, 10:03  
uk8amk
Вид на жительство
 
Регистрация: 05.07.2006
Адрес: Tashkent
Сообщений: 454
Сказал спасибо: 24
Сказали Спасибо 67 раз(а) в 44 сообщении(ях)
uk8amk на пути к лучшему
По умолчанию Re: 24C64 байты в виде пакета

Если функция возвращает указатель на строку, то она соотвественно и должна быть декларирована как указатель на *char.
uk8amk вне форума  
Эти 2 пользователя(ей) сказали Спасибо uk8amk за это сообщение:
Roidi (08.07.2011), warel (28.06.2019)
Непрочитано 08.07.2011, 11:51  
Roidi
Частый гость
 
Регистрация: 07.11.2009
Сообщений: 11
Сказал спасибо: 5
Сказали Спасибо 11 раз(а) в 11 сообщении(ях)
Roidi на пути к лучшему
По умолчанию 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;
?????
Roidi вне форума  
Сказали "Спасибо" Roidi
warel (28.06.2019)
Непрочитано 09.07.2011, 08:10  
nonamedov
Почётный гражданин KAZUS.RUN
 
Регистрация: 06.06.2008
Сообщений: 1,519
Сказал спасибо: 76
Сказали Спасибо 427 раз(а) в 365 сообщении(ях)
nonamedov на пути к лучшему
По умолчанию Re: 24C64 байты в виде пакета

Сообщение от Roidi Посмотреть сообщение
return (char*)ypacket;

https://kazus.run/forums/showpost.ph...4&postcount=31

Последний раз редактировалось nonamedov; 09.07.2011 в 12:55.
nonamedov вне форума  
Сказали "Спасибо" nonamedov
warel (28.06.2019)
Непрочитано 18.07.2011, 10:52  
Roidi
Частый гость
 
Регистрация: 07.11.2009
Сообщений: 11
Сказал спасибо: 5
Сказали Спасибо 11 раз(а) в 11 сообщении(ях)
Roidi на пути к лучшему
По умолчанию Re: 24C64 байты в виде пакета

Все заработало!!!
но как всегда есть но....
Почему-то при чтения пакета в функции вывести данные в терминал puts(eeprom_read(0)); выдает копию последнего байта((( не могу понять почему... когда записываю пакет с данными "Proverka 16 byte"
Нажмите на изображение для увеличения
Название: скриншот терминала.png
Просмотров: 58
Размер:	47.5 Кб
ID:	23951
Вот весь код:
Код:
/**************************************************  ***
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));
Вот файл с проектом, чтобы пакет появился на терминале, нажмите любую клавишу в терминале...
Вложения:
Тип файла: rar 24C64 байты в виде пакета.rar (119.2 Кб, 80 просмотров)
Roidi вне форума  
Сказали "Спасибо" Roidi
warel (28.06.2019)
Непрочитано 20.07.2011, 02:06  
nonamedov
Почётный гражданин KAZUS.RUN
 
Регистрация: 06.06.2008
Сообщений: 1,519
Сказал спасибо: 76
Сказали Спасибо 427 раз(а) в 365 сообщении(ях)
nonamedov на пути к лучшему
По умолчанию 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 вне форума  
Сказали "Спасибо" nonamedov
warel (28.06.2019)
Непрочитано 20.07.2011, 12:17  
Roidi
Частый гость
 
Регистрация: 07.11.2009
Сообщений: 11
Сказал спасибо: 5
Сказали Спасибо 11 раз(а) в 11 сообщении(ях)
Roidi на пути к лучшему
По умолчанию Re: 24C64 байты в виде пакета

не совсем разобрался, но понял. Я на самом деле не так сильен, начинающий! да и многое всего позабыл за учебное время)
Вроде все работает, просто увеличил размер буфера пакета
Код:
unsigned char packet[SIZE_PAKCKET+3];
Теперь я доволен)
Roidi вне форума  
Сказали "Спасибо" Roidi
warel (28.06.2019)
 
Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Проблема правильного приема пакета UART AVR Saadov Микроконтроллеры, АЦП, память и т.д 16 27.04.2011 20:11
Новая версия пакета CAM350 v10 доступна для пользователей Yuri_Potapoff Proteus, KiCAD и другие ECAD 14 21.07.2010 20:17
Доступна бесплатная версия пакета Mician µWave Wizard Yuri_Potapoff Proteus, KiCAD и другие ECAD 0 26.04.2010 15:29


Часовой пояс GMT +4, время: 00:22.


Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.