|
|
Elektronika.lt portalo forumas
Jūs esate neprisijungęs lankytojas. Norint dalyvauti diskusijose, būtina užsiregistruoti ir prisijungti prie forumo.
Prisijungę galėsite kurti naujas temas, atsakyti į kitų užduotus klausimus, balsuoti forumo apklausose.
Administracija pasilieka teisę pašalinti pasisakymus bei dalyvius,
kurie nesilaiko forumo taisyklių.
Pastebėjus nusižengimus, prašome pranešti.
Dabar yra 2024 11 28, 06:58. Visos datos yra GMT + 2 valandos.
|
|
|
|
Forumas » Mikrovaldikliai » eeprom 24c32
|
Jūs negalite rašyti naujų pranešimų į šį forumą Jūs negalite atsakinėti į pranešimus šiame forume Jūs negalite redaguoti savo pranešimų šiame forume Jūs negalite ištrinti savo pranešimų šiame forume Jūs negalite dalyvauti apklausose šiame forume
|
|
|
|
|
|
eeprom 24c32 |
Parašytas: 2019 01 03, 17:56 |
|
|
|
sveiki, susiduriau su problema, nuskaitant eeprom 24c32, naudoju stm32f103 mikrovaldikli.
Kodas: |
void eeprom_read_char(uint8_t address, uint16_t reg){
writeCommand(address, reg);
i2c_start();
i2c_address_direction(address << 1, I2C_Direction_Receiver);
test1 = i2c_receive_nack();
i2c_stop();
}
//arba sitas
void eeprom_read_int(uint8_t address, uint16_t reg){
writeCommand(address, reg);
i2c_start();
i2c_address_direction(address << 1, I2C_Direction_Receiver);
test2 = i2c_receive_ack();
test2 <<= 8;
test2 |= i2c_receive_nack();
i2c_stop();
}
|
sitie veikia gerai, nurodai, adresus ir nuskaito. pirmas nuskaito 8 bitus, su antru nuskaitau 2 po 8 bitus ir sujungiu, vel gerai yra.
bet problema buna kai noriu nuskaityti 32 bitus
Kodas: |
void eeprom_read_float(uint8_t address, uint16_t reg){
writeCommand(address, reg);
i2c_start();
i2c_address_direction(address << 1, I2C_Direction_Receiver);
test3 = i2c_receive_ack();
test3 <<= 8;
test3 |= i2c_receive_ack();
test3 <<= 8;
test3 |= i2c_receive_ack();
test3 <<= 8;
test3 |= i2c_receive_nack();
i2c_stop();
} |
bandau gauti irasyta float skaiciu, bet gaunu tik skaiciu kratini. ka as blogai darau? kaip isgauti float?
P.S. su arduino veikia puikiai. o su stm32 C kalba nesigauna[/code] |
|
_________________ Skype: dmb-220 |
|
|
|
|
|
eeprom 24c32 |
Parašytas: 2019 01 03, 19:06 |
|
|
|
Nesimato kur test3 aprasytas? |
|
|
|
|
|
eeprom 24c32 |
Parašytas: 2019 01 03, 19:16 |
|
|
|
Socrates rašo: |
Nesimato kur test3 aprasytas? |
Kodas: |
uint8_t test1;
uint16_t test2;
uint32_t test3;
|
taip aprasyti testuojant, parasant FLOAT tipa, negalimas postumio ir sujungimo operacijos << |
Kodas: |
eeprom_read_char(0x56, 38);
eeprom_read_int(0x56, 39);
eeprom_read_float(0x56, 0);
char re[5];
itoa(test1, re, 10);
ST7735_PutStr7x11(10, 100, re, COLOR565_WHITE, COLOR565_BLACK);
char ri[5];
itoa(test2, ri, 10);
ST7735_PutStr7x11(50, 100, ri, COLOR565_WHITE, COLOR565_BLACK);
char rf[5];
ftoa(test3, rf, 2);
ST7735_PutStr7x11(10, 70, rf, COLOR565_WHITE, COLOR565_BLACK); |
cia iosvedu i lcd, gal kazka konvertuodasmas blogai darau, be t su ftoa temperatura gerai konvertuoja i lcd isvedima suprantama israiska |
|
_________________ Skype: dmb-220 |
|
|
|
|
eeprom 24c32 |
Parašytas: 2019 01 03, 21:38 |
|
|
|
Esi tikras, kad i atminti irasyta gerai? Pabandyk irasyt 11 22 33 44. Arba gali po kiekvieno I2C nuskaitymo issivest po baita. |
|
|
|
|
|
eeprom 24c32 |
Parašytas: 2019 01 03, 22:58 |
|
|
|
Socrates rašo: |
Esi tikras, kad i atminti irasyta gerai? Pabandyk irasyt 11 22 33 44. Arba gali po kiekvieno I2C nuskaitymo issivest po baita. |
su arduino irasytos reiksmes, kurias kuo puikiausiai nuskaito arduino. o su STM32 nesusidraugauju.
float irasytas i 0 - 3 pozicijas, adresus.
0 - 0100 0010, 1 - 0010 1111, 2 - 1111 1111, 3 - 1101 1110
cia antras FLOAT skaicius, abieju reiksmes labai panasios
4 - 0100 0010, 5 - 0011 0011, 6 - 1111 1111, 7 - 1101 1010
ir kaip man is ju padaryti FLOAT, reiksme turetu buti apie 37.60 - 37.85 ar pan. |
|
_________________ Skype: dmb-220 |
|
|
|
|
|
eeprom 24c32 |
Parašytas: 2019 01 04, 10:12 |
|
|
|
Tingiu gilintis į problemą, bet reikėtų naudoti union type kintamąjį. Pateikiu realiai naudojamų paprogramių pavyzdžius.
Kodas: |
float
eeprom_read_float (uint16_t address)
{
uint8_t i = 0;
union float_bytes
{
float val;
uint8_t bytes[sizeof(float)];
} data;
for (i = 0; i < 4; i++)
{
while ((HAL_I2C_IsDeviceReady (&hi2c1, EE_I2C_ADDR, 5, 100) != HAL_OK))
;
HAL_I2C_Mem_Read (&hi2c1, EE_I2C_ADDR, address + i, 1,
(uint8_t*) &data.bytes[3-i], 1, 10000);
}
return data.val;
}
void
eeprom_write_float (uint16_t address, float data)
{
uint8_t data_buff[4];
uint8_t i = 0;
uint8_t *p = (uint8_t*) &data;
LL_GPIO_ResetOutputPin(EEPROM_WC_GPIO_Port, EEPROM_WC_Pin);
for (i = 0; i < 4; i++)
{
data_buff[3 - i] = p[i];
}
for (i = 0; i < 4; i++)
{
while ((HAL_I2C_IsDeviceReady (&hi2c1, EE_I2C_ADDR, 5, 100) != HAL_OK))
;
HAL_I2C_Mem_Write (&hi2c1, EE_I2C_ADDR, address + i, 1,
(uint8_t*) data_buff + i, 1, 10000);
}
LL_GPIO_SetOutputPin(EEPROM_WC_GPIO_Port, EEPROM_WC_Pin);
}
|
|
|
|
|
|
|
|
eeprom 24c32 |
Parašytas: 2019 01 04, 10:24 |
|
|
|
reikalingas typecastingas arba kaip gintas siulo
pvz kazkas tokio:
ftoa(*((float *)&test3), rf, 2); |
|
|
|
|
|
|
eeprom 24c32 |
Parašytas: 2019 01 04, 11:19 |
|
|
|
AlgisL rašo: |
reikalingas typecastingas arba kaip gintas siulo
pvz kazkas tokio:
ftoa(*((float *)&test3), rf, 2); |
laba AČIŪ, sita jusu eilute labai pagelbejo, puikiai nuskaito float reiksme, tiksliau ja isveda i lcd
dabar kaip taisiklingai irasyti?
Kodas: |
void eeprom_write(uint8_t address, uint16_t reg, uint32_t data){
writeCommand(address, reg);
i2c_start();
i2c_address_direction(address << 1, I2C_Direction_Transmitter);
i2c_transmit(data);
i2c_stop();
}
float temp = 45.11;
eeprom_write(0x56, 38, temp);
|
taip irasant neisiraso nei char nei int nei float tuo labiau. su char galvojau kad lengviau, nes 8 vbit i viena adresa imetu ir viskas. bet bandant irasyt klaidos nera, o nuskaitant buna tik senoji reiksme. pwz laika irasant per i2c i ds3231 paduodi skaiciu i i2c_transmit(); ir isiraso. o eeprom taip paprastai ne |
|
_________________ Skype: dmb-220 |
|
|
|
|
|
eeprom 24c32 |
Parašytas: 2019 01 04, 12:10 |
|
|
|
ziurek kaip tavo naudojamam libraryje aprasyta i2c_transmit();
normaliam pasaulyje i tokio tipo procedura keliautu rodykle i objekta ir jo dyis baitais, pvz:
i2c_transmit( (uint8_t*) data, sizeof( data) ); |
|
|
|
|
|
|
eeprom 24c32 |
Parašytas: 2019 01 04, 12:37 |
|
|
|
AlgisL rašo: |
ziurek kaip tavo naudojamam libraryje aprasyta i2c_transmit();
normaliam pasaulyje i tokio tipo procedura keliautu rodykle i objekta ir jo dyis baitais, pvz:
i2c_transmit( (uint8_t*) data, sizeof( data) ); |
Kodas: |
/**
******************************************************************************
* @brief Transmit one byte to I2C bus
* @param Data byte to transmit
* @retval None
******************************************************************************
*/
void i2c_transmit(uint8_t byte)
{
// Send data byte
I2C_SendData(I2Cx, byte);
// Wait for I2C EV8_2.
// It means that the data has been physically shifted out and
// output on the bus)
while (!I2C_CheckEvent(I2Cx, I2C_EVENT_MASTER_BYTE_TRANSMITTED));
} |
o cia STM32 library fukcija
Kodas: |
/**
* @brief Sends a data byte through the I2Cx peripheral.
* @param I2Cx: where x can be 1 or 2 to select the I2C peripheral.
* @param Data: Byte to be transmitted..
* @retval None
*/
void I2C_SendData(I2C_TypeDef* I2Cx, uint8_t Data)
{
/* Check the parameters */
assert_param(IS_I2C_ALL_PERIPH(I2Cx));
/* Write in the DR register the data to be sent */
I2Cx->DR = Data;
} |
|
|
_________________ Skype: dmb-220 |
|
|
|
|
|
eeprom 24c32 |
Parašytas: 2019 01 04, 12:53 |
|
|
|
Matau KEIL naudojate...
KTU laborai jums knisa prota?
taigis...
Kodas: |
void eeprom_write_ex(uint8_t address, uint16_t reg, uint8_t *data, size_t length){
writeCommand(address, reg);
i2c_start();
i2c_address_direction(address << 1, I2C_Direction_Transmitter);
while(length--) i2c_transmit(*data++);
i2c_stop();
}
float temp = 45.11;
eeprom_write_ex(0x56, 38, (uint8_t*)&temp, sizeof(temp));
|
P.S. gali buti nezymiu sintakses ir darbo logikos klaidu )))))
pvz, jei duomenu blokas kerta PUSLAPIO ribas, bet gal tai isspresta tvarkykleje... |
|
|
|
|
|
|
eeprom 24c32 |
Parašytas: 2019 01 04, 13:21 |
|
|
|
AlgisL rašo: |
Matau KEIL naudojate...
KTU laborai jums knisa prota?
taigis...
Kodas: |
void eeprom_write_ex(uint8_t address, uint16_t reg, uint8_t *data, size_t length){
writeCommand(address, reg);
i2c_start();
i2c_address_direction(address << 1, I2C_Direction_Transmitter);
while(length--) i2c_transmit(*data++);
i2c_stop();
}
float temp = 45.11;
eeprom_write_ex(0x56, 38, (uint8_t*)&temp, sizeof(temp));
|
P.S. gali buti nezymiu sintakses ir darbo logikos klaidu )))))
pvz, jei duomenu blokas kerta PUSLAPIO ribas, bet gal tai isspresta tvarkykleje... |
naudoju System Workbench for STM32
Savamokslis esu, noriu nuo arduino, pilnai pereiti prie STM32f103. Mokausi tik del saves. darausi viena projekteli, ir reik panaudoti eeprom issaugoti nustatymams. siaip ant stm32 naudoja flash vietoje eeprom. bet minusas kad perrasius progrma turi vel suvesti nustatymus |
|
_________________ Skype: dmb-220 |
|
|
|
|
|
eeprom 24c32 |
Parašytas: 2019 01 04, 13:27 |
|
|
|
Sita eeprom_write_ex() tau tiks visiems kintamuju ir ju strukturu dydziams.
panasiai gali ir nuskaityma organizuotis.
Arduino bibliotekose yra
eeprom_write_block((void *)mystr,(void *)ee_addr,strlen(mystr)+1); |
|
|
|
|
|
|
eeprom 24c32 |
Parašytas: 2019 01 04, 14:29 |
|
|
|
AlgisL rašo: |
Sita eeprom_write_ex() tau tiks visiems kintamuju ir ju strukturu dydziams.
panasiai gali ir nuskaityma organizuotis.
Arduino bibliotekose yra
eeprom_write_block((void *)mystr,(void *)ee_addr,strlen(mystr)+1); |
aciu uz sugaista laika, bet man realiai nenori veikti.
Kodas: |
float temp = 10.19;
eeprom_write_ex(0x56, 4, (uint8_t*)&temp, sizeof(temp)); |
float temp = 10.19; arba uint32_t temp = 10.19; jei bandai irasyt, pakinba MCU, jei pakeiciu i uint16_t temp = 10.19; tada kodas vykdomas, bet nieko neiraso. kazko su 32 bit nenori draugauti
bandant irasyti char ar short ar int, lyg ir bando rasyt, kodas eina, lcd rodo. bet nuskaitant reiksme nebuna pakeista.
kazkur kazka esu prisidirbes, reik mokytis kaip naudoti debug, nes kitaip nerasiu kur problema |
|
_________________ Skype: dmb-220 |
|
|
|
|
|
eeprom 24c32 |
Parašytas: 2019 01 04, 14:58 |
|
|
|
Taip "ant smugio" sunku tiksliai nustatyti, kadangi neaisku kaip ten pas tave WP koja ?
Jei ji "1", tai ir neraso tau nieko.
kas rasoma, jei i LCD isvesti length ir *((float*)&data) |
|
|
|
|
|
|
Google paieška forume |
|
|
Naujos temos forume |
|
|
FS25 Tractors
Farming Simulator 25 Mods,
FS25 Maps,
FS25 Trucks |
|
ETS2 Mods
ETS2 Trucks,
ETS2 Bus,
Euro Truck Simulator 2 Mods
|
|
FS22 Tractors
Farming Simulator 22 Mods,
FS22 Maps,
FS25 Mods |
|
VAT calculator
VAT number check,
What is VAT,
How much is VAT |
|
LEGO
Mänguköök,
mudelautod,
nukuvanker |
|
Thermal monocular
Thermal vision camera,
Night vision ar scope,
Night vision spotting scope |
|
FS25 Mods
FS25 Harvesters,
FS25 Tractors Mods,
FS25 Maps Mods |
|
Dantų protezavimas
All on 4 implantai,
Endodontija mikroskopu,
Dantų implantacija |
|
FS25 Mods
FS25 Maps,
FS25 Cheats,
FS25 Install Mods |
|
GTA 6 Weapons
GTA 6 Characters,
GTA 6 Map,
GTA 6 Vehicles |
|
FS25 Mods
Farming Simulator 25 Mods,
FS25 Maps |
|
|
|