Witam, Otó¿ pisze program na ATmega32 i mam problem z zapisem do eepromu (AT24C08-SMD), odczyt jest ³adny. I mam tak: Struktura która trzyma 3 kody: <code>
typedef struct { uint8_t length_on; uint8_t code_on[8]; uint8_t length_off; uint8_t code_off[8]; uint8_t length_m2; uint8_t code_m2[8]; uint8_t f_key; uint8_t time; } EE_OUTPUT_CODE; // Globalna deklaracja - "main.c" EE_OUTPUT_CODE g_out_code; </code>
Struktura ma 29bajtów (w pamiêci eeprom zaaokr±glam do 32 bajtów - ³atwiej siê liczy :)) ) ,a takich rekordów jest 16 i s± one trzymane na 2 stronach (512bajtów).
I wszystko jest ³±dnie do momentu zapisu, niby zapis jest ok gdy¿ dane mi siê nie zmieniaj± w rekordzie przed i po zapisie ale do eepromu trafiaj± bzdury.. I tak wygl±da "log" : <code>
SelectedOut=00 tmp=08 ic_ee_adr=A8 Write OUT Code - przed zapisem: DEBUG OUTPUT CODE:
-------------- out_code: len_on=03 code_on=[0]07[1]00[2]01[3]FF[4]FF[5]FF[6]FF[7]FF len_off=03 code_off=[0]07[1]00[2]02[3]FF[4]FF[5]FF[6]FF[7]FF len_m2=03 code_m2=[0]07[1]00[2]03[3]FF[4]FF[5]FF[6]FF[7]FF f_key=01 time=0F
************************************ SelectedOut=00 tmp=08 ic_ee_adr=A8 Write OUT Code - po zapisie: DEBUG OUTPUT CODE:
-------------- out_code: len_on=03 code_on=[0]07[1]00[2]01[3]FF[4]FF[5]FF[6]FF[7]FF len_off=03 code_off=[0]07[1]00[2]02[3]FF[4]FF[5]FF[6]FF[7]FF len_m2=03 code_m2=[0]07[1]00[2]03[3]FF[4]FF[5]FF[6]FF[7]FF f_key=01 time=0F
************************************ </code>
I po tym odczyt rekordu z pamiêci:
<code>
SelectedOut=00 Code Out Id=00
Read Output Settings: DEBUG OUTPUT CODE:
-------------- out_code: len_on=FF code_on=[0]FF[1]03[2]07[3]00[4]03[5]FF[6]FF[7]FF len_off=FF code_off=[0]FF[1]01[2]0F[3]FF[4]FF[5]FF[6]FF[7]FF len_m2=FF code_m2=[0]FF[1]FF[2]FF[3]FF[4]FF[5]FF[6]FF[7]FF f_key=FF time=FF
************************************ </code>
Procedura odczytu jest dobra gdy¿ mam ju¿ napisan± funkcjê sprawdzaj±c± odczytany kod i porównuj±c± z wporwadzonym z klawiatury.
Kod procedury zapisu do eepromu: <code>
void Write_EE_OUT_Code(uint8_t out) { uint8_t addr, tmp, tmp2, page_offset;
if (out > 7) { // strona 2 addr = (out-8) * 32; page_offset = 2; } else { // out < 8 addr = out * 32; page_offset = 0; } /* typedef struct { uint8_t length_on; uint8_t code_on[8]; uint8_t length_off; uint8_t code_off[8]; uint8_t length_m2; uint8_t code_m2[8]; uint8_t f_key; uint8_t time; } EE_OUTPUT_CODE; */ #if _DEBUG_MSG == 1 // je¶li program jest z opcj± debugowania to wypluj dane: usart_SendStrP((prog_char*)PSTR("SelectedOut=")); SendHexCharByte(out); usart_SendStrP((prog_char*)PSTR(" tmp=")); SendHexCharByte(tmp); usart_SendStrP((prog_char*)PSTR(" ic_ee_adr=")); SendHexCharByte(IC_EEPROM_ADDR+page_offset); usart_SendStrP((prog_char*)PSTR("\n\r")); DialogDebugOutCode(&g_out_code,(prog_char*)PSTR("Write EE OUT Code - przed zapisem:\n\r")); // DialogDebugOutCode(&g_out_code,(prog_char*)PSTR("...")); - ta funkcja rozk³ada strukturê i wypluwa ja w "ludzkim jêzyku" przez rs'a #endif BUZ_ON; i2c_start(); i2c_send(IC_EEPROM_ADDR+page_offset); // 1,2 strona - kody 32bajtowe i2c_send(addr); // adres pocz±tkowy // CODE_ON i2c_send((uint8_t)(g_out_code.length_on)); // d³ugo¶æ code_on for (tmp2=0;tmp2<8;tmp2++) { i2c_send((uint8_t)(g_out_code.code_on[tmp2])); // 8 cyfr CODE_ON } // CODE_OFF i2c_send(g_out_code.length_off); // d³ugo¶æ code_off for (tmp2=0;tmp2<8;tmp2++) { i2c_send(g_out_code.code_off[tmp2]); // 8 cyfr CODE_OFF } // CODE_M2 i2c_send(g_out_code.length_m2); // d³ugo¶æ code_m2 for (tmp2=0;tmp2<8;tmp2++) { i2c_send(g_out_code.code_m2[tmp2]); // 8 cyfr CODE_M2 } // F_Key i2c_send(g_out_code.f_key); // czas _M2 i2c_send(g_out_code.time); // czas dzia³ania code_M2 i2c_stop();
#if _DEBUG_MSG == 1 usart_SendStrP((prog_char*)PSTR("SelectedOut=")); SendHexCharByte(out); usart_SendStrP((prog_char*)PSTR(" tmp=")); SendHexCharByte(tmp); usart_SendStrP((prog_char*)PSTR(" ic_ee_adr=")); SendHexCharByte(IC_EEPROM_ADDR+page_offset); usart_SendStrP((prog_char*)PSTR("\n\r")); DialogDebugOutCode(&g_out_code,(prog_char*)PSTR("Write EE OUT Code - po zapisie:\n\r")); #endif
BUZ_OFF; } </code>