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

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

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

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

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

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


 
Опции темы
Непрочитано 03.01.2018, 20:18  
miwutka
Почётный гражданин KAZUS.RU
 
Регистрация: 05.07.2009
Адрес: Запорожье
Сообщений: 1,531
Сказал спасибо: 309
Сказали Спасибо 53 раз(а) в 48 сообщении(ях)
miwutka на пути к лучшему
По умолчанию Указатели и EEPROM 24c16 + stm32

Здравствуйте. Помогите разобраться с указателями.
нужно переменную f1 записать в еепром 24с16. То как я применил казатели выглядит ужасно но работает. Подскажите как правильнее разложить флоат на 8 бит, записать в еепром, потом считать с еепром и снова восстановить флоат? Плиз....
мои функции
eeprom_pagewrite(uint16_t address, uint8_t *buf,uint8_t nbytes)
eeprom_pageread(uint16_t address,uint8_t* buf,uint8_t nbytes)


PHP код:
uint8_t temp1_eeprom[16],
       
temp2_eeprom[16],
       
temp3_eeprom[16],
       
temp4_eeprom[8];
 
float test;//сюда пишем восстановленное число из епром

float f1 1.27;
   
char *p,*pee ;
   
= (char*)&f1// указатель на флоат который надо сохранить в память
   
pee = (char*)&test//указатель на восстановленный из еепром флоат

//тут пишем побайтно в массив temp2_eeprom
        
temp2_eeprom[0] = p[0];
    
temp2_eeprom[1] = p[1];
    
temp2_eeprom[2] = p[2];
    
temp2_eeprom[3] = p[3];

// тут имитируем считывание с еепрома в массив temp1_eeprom
   
temp1_eeprom[0] = temp2_eeprom[0];
   
temp1_eeprom[1] = temp2_eeprom[1];
   
temp1_eeprom[2] = temp2_eeprom[2];
   
temp1_eeprom[3] = temp2_eeprom[3];

//тут восстанавливаем число флоат после считывания из еепром
   
pee[0] = temp1_eeprom[0];
   
pee[1] = temp1_eeprom[1];
   
pee[2] = temp1_eeprom[2];
   
pee[3] = temp1_eeprom[3];

//после этого выводим на дисплей и test = 1.27 
Реклама:

Последний раз редактировалось miwutka; 03.01.2018 в 21:18.
miwutka вне форума  
Непрочитано 03.01.2018, 21:17  
miwutka
Почётный гражданин KAZUS.RU
 
Регистрация: 05.07.2009
Адрес: Запорожье
Сообщений: 1,531
Сказал спасибо: 309
Сказали Спасибо 53 раз(а) в 48 сообщении(ях)
miwutka на пути к лучшему
По умолчанию Re: Указатели и EEPROM 24c16 + stm32

если вот так прописать то в переменная test = 0. Массив temp1_eeprom заполнен правильно...
PHP код:
uint8_t temp1_eeprom[16], 
       
temp2_eeprom[16], 
       
temp3_eeprom[16], 
       
temp4_eeprom[8]; 
 
float test;//сюда пишем восстановленное число из епром 

float f1 1.27
   
char *p,*pee 
   
= (char*)&f1// указатель на флоат который надо сохранить в память 
   
pee = (char*)&test//указатель на восстановленный из еепром флоат 

//тут пишем побайтно в массив temp2_eeprom 
//        temp2_eeprom[0] = p[0]; 
//    temp2_eeprom[1] = p[1]; 
//    temp2_eeprom[2] = p[2]; 
//    temp2_eeprom[3] = p[3]; 

eeprom_pagewrite(0p,4);Delay_ms(10);
eeprom_pageread(0temp2_eeprom,5);// вместо 5 стояло 4 и test было равно 0

      
pee[0] = temp2_eeprom[0];
      
pee[1] = temp2_eeprom[1];
      
pee[2] = temp2_eeprom[2];
      
pee[3] = temp2_eeprom[3];
//после этого  test  = 1.27 

Последний раз редактировалось miwutka; 03.01.2018 в 22:04.
miwutka вне форума  
Непрочитано 03.01.2018, 23:54  
AR_Favorit
Почётный гражданин KAZUS.RU
 
Регистрация: 13.03.2010
Сообщений: 2,901
Сказал спасибо: 499
Сказали Спасибо 3,061 раз(а) в 1,425 сообщении(ях)
AR_Favorit на пути к лучшему
По умолчанию Re: Указатели и EEPROM 24c16 + stm32

eeprom_pagewrite(0, (uint8_t*)(&f1), sizeof(f1));

eeprom_pageread(0, (uint8_t*)(&test), sizeof(test));

Если не работает, разбираться с тем, что наворочено в eeprom_pagewrite() и eeprom_pageread().
AR_Favorit вне форума  
Сказали "Спасибо" AR_Favorit
miwutka (04.01.2018)
Непрочитано 04.01.2018, 00:21  
miwutka
Почётный гражданин KAZUS.RU
 
Регистрация: 05.07.2009
Адрес: Запорожье
Сообщений: 1,531
Сказал спасибо: 309
Сказали Спасибо 53 раз(а) в 48 сообщении(ях)
miwutka на пути к лучшему
По умолчанию Re: Указатели и EEPROM 24c16 + stm32

AR_Favorit, да так красивее но ... запись как вы написали работает. Чтение не работает. Буду разбираться завтра... stm32f071
Если кто увидит раньше меня что не так подскажите плиз...
с указателями не дружу пока... чую что надо в последней строке чтото изменить... buf[index-1] = I2C1-›RXDR ;
PHP код:
void eeprom_pagewrite(uint16_t addressuint8_t *buf,uint8_t nbytes)
{
    
uint8_t index=0;
    
I2C1-›CR2 =  I2C_CR2_AUTOEND | ((2+nbytes)‹‹16) | (EEPROM_OWN_ADDRESS‹‹1); 
        
            
/* Check Tx empty */
      //while (!(I2C1-›ISR & I2C_ISR_TXE) );
      
while ((!(I2C1-›ISR I2C_ISR_TXE) ) && (Timeout == 0) )
      {
         
I2C_Timout++;
         if (
I2C_Timout == ssd1306_I2C_TIMEOUT) {I2C_Timout 0;Timeout 1; }
      };
      
Timeout 0;
      
I2C_Timout 0;
    
     
I2C1-›TXDR =(uint8_t) (address››8); /* Byte to send */
     
I2C1-›CR2 |= I2C_CR2_START/* Go */
        
        
while (!(I2C1-›ISR I2C_ISR_TXIS) );
        
I2C1-›TXDR = (uint8_t)(address &0x00FF); /* Byte to send */
    
for(index=0;index‹=nbytes-1;index++)
     {
        while (!(
I2C1-›ISR I2C_ISR_TXIS) );
        
        
I2C1-›TXDR buf[index] ; /* Byte to send */

     
}
}

void eeprom_pageread(uint16_t address,uint8_tbuf,uint8_t nbytes)
{
    
    
uint8_t index=0;
    
I2C1-›CR2 =   (2‹‹16) | (EEPROM_OWN_ADDRESS‹‹1); 
     while (!(
I2C1-›ISR I2C_ISR_TXE) );
     
I2C1-›TXDR = (uint8_t) (address››8); /* Byte to send */
     
I2C1-›CR2 |= I2C_CR2_START/* Go */
        
while (!(I2C1-›ISR I2C_ISR_TXIS) );
        
I2C1-›TXDR = (uint8_t)(address &0x00FF); /* Byte to send */
     
while (!(I2C1-›ISR I2C_ISR_TC) ){};
     
I2C1-›CR2 =  //I2C_CR2_AUTOEND |
                     
((nbytes)‹‹16) | 
                    (
EEPROM_OWN_ADDRESS‹‹1) |
                     
I2C_CR2_RD_WRN |
                     
I2C_CR2_NACK
     
I2C1-›CR2 |= I2C_CR2_START/* Go */
        
for(index=0;index‹=nbytes-1;index++)
     { 
     while (!(
I2C1-›ISR I2C_ISR_RXNE) ){};
     
buf[index-1]  = I2C1-›RXDR ;
    
     }


Последний раз редактировалось miwutka; 04.01.2018 в 00:27.
miwutka вне форума  
Непрочитано 04.01.2018, 00:49  
AR_Favorit
Почётный гражданин KAZUS.RU
 
Регистрация: 13.03.2010
Сообщений: 2,901
Сказал спасибо: 499
Сказали Спасибо 3,061 раз(а) в 1,425 сообщении(ях)
AR_Favorit на пути к лучшему
По умолчанию Re: Указатели и EEPROM 24c16 + stm32

Сообщение от miwutka Посмотреть сообщение
чую что надо в последней строке чтото изменить... buf[index-1] = I2C1-›RXDR ;
Правильно чуете. Первая итерация: uint8_t index = 0, buf[index-1] указывает на buf[255]

Убрать "-1", и будет больше похоже на правду.

ЗЫ и если уж о красоте - то выражение "index ‹ nbytes" тождественно "index‹=nbytes-1", но смотрится приятнее и помогает от ошибочно переданного нулевого nbytes.

Последний раз редактировалось AR_Favorit; 04.01.2018 в 01:02.
AR_Favorit вне форума  
Сказали "Спасибо" AR_Favorit
miwutka (04.01.2018)
Непрочитано 04.01.2018, 03:00  
miwutka
Почётный гражданин KAZUS.RU
 
Регистрация: 05.07.2009
Адрес: Запорожье
Сообщений: 1,531
Сказал спасибо: 309
Сказали Спасибо 53 раз(а) в 48 сообщении(ях)
miwutka на пути к лучшему
По умолчанию Re: Указатели и EEPROM 24c16 + stm32

Всё заработало. Осталась одна проблемка маленькая...
Чтобы считать 4 байта из еепромки надо писать eeprom_pageread(0, temp2_eeprom,5);
Надо исправить какую-то ошибку чтобы писать eeprom_pageread(0, temp2_eeprom,4);
Если я в строке buf[index-1] = I2C1-›RXDR ; убираю -1 то считывает на 5 байт, но первый байт в массиве равен нулю, а начиная со второго уже есть считанные 4 байта
То есть при 5-ке :
a[0] = 0;
a[1] = 10;
a[2] = 20;
a[3] = 30;
a[4] = 40;

Возможно ошибка в функции записи в епромку. Разбираюсь...

Вот сделал такие изменения в чтении с еромки
((nbytes+1)‹‹16) |
for(index=0;index‹nbytes+1;index++)
buf[index-1] = I2C1-›RXDR ;
Теперь как надо работает...

С указателями немного разобрался. Теперь надо научиться указатели для структуры данных использовать и для функций. Пошел учиться дальше )) Спасибо огромное за оперативную помощь!

Последний раз редактировалось miwutka; 04.01.2018 в 03:23.
miwutka вне форума  
Непрочитано 04.01.2018, 03:25  
AR_Favorit
Почётный гражданин KAZUS.RU
 
Регистрация: 13.03.2010
Сообщений: 2,901
Сказал спасибо: 499
Сказали Спасибо 3,061 раз(а) в 1,425 сообщении(ях)
AR_Favorit на пути к лучшему
По умолчанию Re: Указатели и EEPROM 24c16 + stm32

Сообщение от miwutka Посмотреть сообщение
убираю -1 то считывает на 5 байт, но первый байт в массиве равен нулю
А если не убираете, то этот первый считанный байт попадает куда-то в RAM и, возможно, что-то там портит. Так что убирать надо, и надо разбираться: этот байт, случаем, не записан на самом деле по нулевому адресу вместо первого байта того, что вы хотели записать?

Поменяйте стартовый адрес записи адрес в еепромке с "0" на, например, "3", и посмотрите еще раз, что пишется и что читается (с убранным "-1", разумеется).
Если первым байтом из считанных пяти по-прежнему будет "0", то ошибка в процедуре чтения. Если еще что-нибудь - значит, ошибка в процедуре записи.
AR_Favorit вне форума  
Непрочитано 04.01.2018, 03:32  
AR_Favorit
Почётный гражданин KAZUS.RU
 
Регистрация: 13.03.2010
Сообщений: 2,901
Сказал спасибо: 499
Сказали Спасибо 3,061 раз(а) в 1,425 сообщении(ях)
AR_Favorit на пути к лучшему
По умолчанию Re: Указатели и EEPROM 24c16 + stm32



тут что-то не так





Последний раз редактировалось AR_Favorit; 04.01.2018 в 03:55.
AR_Favorit вне форума  
Непрочитано 04.01.2018, 16:38  
miwutka
Почётный гражданин KAZUS.RU
 
Регистрация: 05.07.2009
Адрес: Запорожье
Сообщений: 1,531
Сказал спасибо: 309
Сказали Спасибо 53 раз(а) в 48 сообщении(ях)
miwutka на пути к лучшему
По умолчанию Re: Указатели и EEPROM 24c16 + stm32

Закралась какаято серьезная ошибка. Если писать не в нулевой адрес то микруха зависает..... Чтение с любого адреса читает только с первого. Буду разбираться с функциями..... вот фигня....
Чтение и запись по нулевому адресу всё четко работает. И флоат и инт и 8 бит всё четко считывает...
miwutka вне форума  
Непрочитано 04.01.2018, 17:45  
Easyrider83
Гуру портала
 
Аватар для Easyrider83
 
Регистрация: 27.10.2008
Адрес: ЕС
Сообщений: 10,835
Сказал спасибо: 918
Сказали Спасибо 4,308 раз(а) в 2,573 сообщении(ях)
Easyrider83 на пути к лучшему
По умолчанию Re: Указатели и EEPROM 24c16 + stm32

Может быть ты упираешься в размер страницы? Не забывай, что указатель переходит на следующий байт только в пределах одной страницы. И потом надо ждать, пока информация запишется.
Easyrider83 вне форума  
 

Закладки
Опции темы

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

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

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

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Изучаем STM32 Cortex M3 EugVor ARM 6166 19.02.2024 18:22
Программирование программатором STERH 007 PIC микроконтроллеров ispitatel1 Песочница (вопросы новичков) 4 17.04.2017 17:18
CVAVR порча переменных Aselicon AVR 5 06.04.2017 22:18
Протеус и система зажигания после симуляции не сохраняет настройки cfif11 Proteus 23 04.02.2012 01:26
STM32 eeprom emulation serb-radio Микроконтроллеры, АЦП, память и т.д 0 26.10.2011 13:42


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


Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot