рдПрдХ AVR рдорд╛рдЗрдХреНрд░реЛрдХрдВрдЯреНрд░реЛрд▓рд░ рдФрд░ рдПрдХ TWI рдмрд╕ рдХреЗ рдЙрджрд╛рд╣рд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдУрдПрд╕ рдХреЗ рдмрд╛рд╣рд░ рдореНрдпреВрдЯреЗрдХреНрд╕ рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди

рдПрдХ рдмрд╛рд░ рдореИрдВрдиреЗ рдЦреБрдж рдХреЗ рд▓рд┐рдП рдПрдХ рдореМрд╕рдо рд╕реНрдЯреЗрд╢рди рдмрдирд╛рдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ред рд╕реЗрдВрд╕рд░ рд╡рд╣рд╛рдВ рдЕрд▓рдЧ рд╣реИрдВ, рдЬрд┐рдирдореЗрдВ I2C рдмрд╕ рд╢рд╛рдорд┐рд▓ рд╣реИред рдФрд░ рдХрд┐рддрдирд╛ рдЕрдЪреНрдЫрд╛, рдЖрдорддреМрд░ рдкрд░ рдкрд╣рд▓реА рдмрд╛рд░ рдореЗрдВ, рдЙрдореНрдореАрдж рдХреЗ рдЭрдВрдбреЗ рдкрд░ рд╕рдм рдХреБрдЫ рдХрд┐рдпрд╛ред рд▓реЗрдХрд┐рди рдЕрд╕рд▓реА рдЬреЗрдбреА рдХрд╛ рд░рд╛рд╕реНрддрд╛ рдЕрд▓рдЧ рд╣реИ, рдФрд░ рд░реБрдХрд╛рд╡рдЯ рдХреЗ рд▓рд┐рдП рд╕рдм рдХреБрдЫ рд▓рдЯрдХрд╛ рджреЗрдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рдпрд╣реАрдВ рд╕реЗ рдмрд╡рд╛рд╕реАрд░ рдХреА рд╢реБрд░реБрдЖрдд рд╣реБрдИред рдореБрдЭреЗ рдЬреЛ рд╕рдорд╕реНрдпрд╛ рдЖрдИ рд╡рд╣ рд▓рдЧрд╛рддрд╛рд░ рдХрдИ рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░ рд░рд╣реА рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЗрд╕рдХреЗ рд╕рд╛рде рдЖрдЧреЗ рдХреЗ рдХрд╛рдо рдХреЗ рд▓рд┐рдП BMP085 рджрдмрд╛рд╡ рд╕реЗрдВрд╕рд░ рдХреЛ рдЗрд╕рдХреЗ EEPROM рд╕реЗ 11 рдЕрдВрд╢рд╛рдВрдХрди рд╕реНрдерд┐рд░рд╛рдВрдХ рдЦреАрдВрдЪрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:


рдореИрдВ рдирд┐рд░реНрдгрдп рдкрд░ рдХреИрд╕реЗ рдЖрдпрд╛ рдФрд░ рд╡рд┐рдЪрд╛рд░реЛрдВ рдХрд╛ рдХреНрд░рдо рдиреАрдЪреЗ рдЙрд▓реНрд▓рд┐рдЦрд┐рдд рд╣реИред

рдЗрдВрддрдЬрд╛рд░ рдХреЗ рдЭрдВрдбреЗ

рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░реЗрдВ get_AC1, get_AC2, ..., get_MD ред рдЙрдирдореЗрдВ рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ I2C рдмрд╕ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ EEPROM рд╕реЗрдВрд╕рд░ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рдирд┐рд░рдВрддрд░ рдкреНрд░рд╛рдкреНрдд рдХрд░рддрд╛ рд╣реИред рдбреЗрдЯрд╛рд╢реАрдЯ рд╕реЗ рдкрд╛рд░реНрд╕рд▓ рдкреНрд░рд╛рд░реВрдк:


рдФрд░ get_AC1 рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд▓рд┐рдП рдирдореВрдирд╛ рдХреЛрдб:

get_AC1
int get_AC1(void) { union { unsigned int Word; unsigned char Byte[2]; } AC1; //  AC1 // ---------------------------------------- TWCR = (1<<TWEN)| //  TWI  (0<<TWIE)|(1<<TWINT)| //   (0<<TWEA)|(1<<TWSTA)|(0<<TWSTO)| //  START  (0<<TWWC); while (!(TWCR & (1<<TWINT))) //    TWINT ; // ---------------------------------------- TWDR = 0xEE; //  SLA+W TWCR = (1<<TWEN)| //  TWI  (0<<TWIE)|(1<<TWINT)| //   (0<<TWEA)|(0<<TWSTA)|(0<<TWSTO)| //  SLA+W (0<<TWWC); while (!(TWCR & (1<<TWINT))) //    TWINT ; // ---------------------------------------- TWDR = 0xAA; //  0xAA TWCR = (1<<TWEN)| //  TWI  (0<<TWIE)|(1<<TWINT)| //   (0<<TWEA)|(0<<TWSTA)|(0<<TWSTO)| //  0xAA (0<<TWWC); while (!(TWCR & (1<<TWINT))) //    TWINT ; // ---------------------------------------- TWCR = (1<<TWEN)| //  TWI  (0<<TWIE)|(1<<TWINT)| //   (0<<TWEA)|(1<<TWSTA)|(0<<TWSTO)| //  REPEATED START  (0<<TWWC); while (!(TWCR & (1<<TWINT))) //    TWINT ; // ---------------------------------------- TWDR = 0xEF; //  SLA+R TWCR = (1<<TWEN)| //  TWI  (0<<TWIE)|(1<<TWINT)| //   (0<<TWEA)|(0<<TWSTA)|(0<<TWSTO)| //  SLA+R (0<<TWWC); while (!(TWCR & (1<<TWINT))) //    TWINT ; // ---------------------------------------- TWCR = (1<<TWEN)| //  TWI  (0<<TWIE)|(1<<TWINT)| //   (1<<TWEA)|(0<<TWSTA)|(0<<TWSTO)| //       ACK (0<<TWWC); while (!(TWCR & (1<<TWINT))) //    TWINT ; // ---------------------------------------- AC1.Byte[1] = TWDR; //  MSB TWCR = (1<<TWEN)| //  TWI  (0<<TWIE)|(1<<TWINT)| //   (0<<TWEA)|(0<<TWSTA)|(0<<TWSTO)| //       NACK (0<<TWWC); while (!(TWCR & (1<<TWINT))) //    TWINT ; // ---------------------------------------- AC1.Byte[0] = TWDR; //  LSB TWCR = (1<<TWEN)| //  TWI  (0<<TWIE)|(1<<TWINT)| //   (0<<TWEA)|(0<<TWSTA)|(1<<TWSTO)| //  STOP  (0<<TWWC); // ---------------------------------------- return AC1.Word; } 

рдФрд░ рдпрд╣рд╛рдБ рдЙрд╕рдХреА рддрд░рдВрдЧ рд╣реИ:


рдПрд╕реА 1 рдХреЗ рд▓рд┐рдП рд╕рдВрдШ рдХрд╛ рдЙрдкрдпреЛрдЧ рдмрд╛рдЗрдЯ рдХреНрд░рдо рдореЗрдВ рдЕрдВрддрд░ рдХреЗ рдХрд╛рд░рдг рд╣реИред TWI рдХреЗ рд▓рд┐рдП рдпрд╣ рдмрдбрд╝рд╛-рдПрдВрдбрд┐рдпрди рд╣реИ, AVR рдХреЗ рд▓рд┐рдП рдпрд╣ рдереЛрдбрд╝рд╛-рдПрдВрдбрд┐рдпрди рд╣реИред Get_AC2 рдлрд╝рдВрдХреНрд╢рди рдХреЗрд╡рд▓ SLA + W рдХрдорд╛рдВрдб рдХреЗ рдмрд╛рдж 0xAA рдХреЗ рдмрдЬрд╛рдп рдмрд╛рдЗрдЯ 0xAC (рдбреЗрдЯрд╛рд╢реАрдЯ рдкрд░ рджреЗрдЦреЗрдВ) рднреЗрдЬрдиреЗ рдореЗрдВ рднрд┐рдиреНрди рд╣реЛрддрд╛ рд╣реИред рдЕрдиреНрдп рд╕рднреА рдорд╛рдорд▓реЛрдВ рдореЗрдВ, рдХрд╛рд░реНрдп рдмрд┐рд▓реНрдХреБрд▓ рд╕рдорд╛рди рд╣реИрдВред рдЗрд╕рд▓рд┐рдП, рд╣рдо рдПрдХ get_Data рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЬреЛ рдбреЗрдЯрд╛рд╕реЗрдЯ рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рд░реВрдк рдореЗрдВ рдПрдХ рд╣реА рд░рдЬрд┐рд╕реНрдЯрд░ рдкрддреЗ рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░реЗрдЧрд╛:

get_Data
 int get_Data(unsigned char Register_adress) { union { unsigned int Word; unsigned char Byte[2]; } Data; //  Data // ---------------------------------------- TWCR = (1<<TWEN)| //  TWI  (0<<TWIE)|(1<<TWINT)| //   (0<<TWEA)|(1<<TWSTA)|(0<<TWSTO)| //  START  (0<<TWWC); while (!(TWCR & (1<<TWINT))) //    TWINT ; // ---------------------------------------- TWDR = 0xEE; //  SLA+W TWCR = (1<<TWEN)| //  TWI  (0<<TWIE)|(1<<TWINT)| //   (0<<TWEA)|(0<<TWSTA)|(0<<TWSTO)| //  SLA+W (0<<TWWC); while (!(TWCR & (1<<TWINT))) //    TWINT ; // ---------------------------------------- TWDR = Register_adress; //  Register_adress TWCR = (1<<TWEN)| //  TWI  (0<<TWIE)|(1<<TWINT)| //   (0<<TWEA)|(0<<TWSTA)|(0<<TWSTO)| //  Register_adress (0<<TWWC); while (!(TWCR & (1<<TWINT))) //    TWINT ; // ---------------------------------------- TWCR = (1<<TWEN)| //  TWI  (0<<TWIE)|(1<<TWINT)| //   (0<<TWEA)|(1<<TWSTA)|(0<<TWSTO)| //  REPEATED START  (0<<TWWC); while (!(TWCR & (1<<TWINT))) //    TWINT ; // ---------------------------------------- TWDR = 0xEF; //  SLA+R TWCR = (1<<TWEN)| //  TWI  (0<<TWIE)|(1<<TWINT)| //   (0<<TWEA)|(0<<TWSTA)|(0<<TWSTO)| //  SLA+R (0<<TWWC); while (!(TWCR & (1<<TWINT))) //    TWINT ; // ---------------------------------------- TWCR = (1<<TWEN)| //  TWI  (0<<TWIE)|(1<<TWINT)| //   (1<<TWEA)|(0<<TWSTA)|(0<<TWSTO)| //       ACK (0<<TWWC); while (!(TWCR & (1<<TWINT))) //    TWINT ; // ---------------------------------------- Data.Byte[1] = TWDR; //  MSB TWCR = (1<<TWEN)| //  TWI  (0<<TWIE)|(1<<TWINT)| //   (0<<TWEA)|(0<<TWSTA)|(0<<TWSTO)| //       NACK (0<<TWWC); while (!(TWCR & (1<<TWINT))) //    TWINT ; // ---------------------------------------- Data.Byte[0] = TWDR; //  LSB TWCR = (1<<TWEN)| //  TWI  (0<<TWIE)|(1<<TWINT)| //   (0<<TWEA)|(0<<TWSTA)|(1<<TWSTO)| //  STOP  (0<<TWWC); // ---------------------------------------- return Data.Word; } 

рдФрд░ рдлрд┐рд░ рдмрд╕:

 struct { short AC1; short AC2; short AC3; unsigned short AC4; unsigned short AC5; unsigned short AC6; short B1; short B2; short MB; short MC; short MD; } BMP085_EEPROM; ... static void get_EEPROM(void) { BMP085_EEPROM.AC1 = get_Data(0xAA); BMP085_EEPROM.AC2 = get_Data(0xAC); BMP085_EEPROM.AC3 = get_Data(0xAE); BMP085_EEPROM.AC4 = get_Data(0xB0); BMP085_EEPROM.AC5 = get_Data(0xB2); BMP085_EEPROM.AC6 = get_Data(0xB4); BMP085_EEPROM.B1 = get_Data(0xB6); BMP085_EEPROM.B2 = get_Data(0xB8); BMP085_EEPROM.MB = get_Data(0xBA); BMP085_EEPROM.MC = get_Data(0xBC); BMP085_EEPROM.MD = get_Data(0xBE); } 

рдпрд╣рд╛рдБ рдкрд░рд┐рдгрд╛рдо рд╣реИ:


рдмрд╛рдзрд╛ рдбрд╛рд▓рдиреЗ рдХрд╛ рдХрд╛рдо


рдкреНрд░рд╕реНрддрд╛рд╡рдирд╛


рдЬреИрд╕рд╛ рдХрд┐ рдКрдкрд░ рджрд┐рдП рдЧрдП рдЖрдВрдХрдбрд╝реЗ рд╕реЗ рджреЗрдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдПрдХ рдСрдкрд░реЗрд╢рди рдХреА рдЕрд╡рдзрд┐ 100 kHz рдХреА рдмрд╕ рдЯреНрд░рд╛рдВрд╕рдлрд░ рдЖрд╡реГрддреНрддрд┐ рдХреЗ рд▓рд┐рдП 488 ╬╝s рд╣реИ , рдЬреЛ 8 рдореЗрдЧрд╛рд╣рд░реНрдЯреНрдЬ рдХреА рдЖрд╡реГрддреНрддрд┐ рдкрд░ 3094 рдкреНрд░реЛрд╕реЗрд╕рд░ рдЪрдХреНрд░ рд╣реИ ред рдЦреИрд░ рдпрд╣ рдХреЛрдИ рддрд░реАрдХрд╛ рдирд╣реАрдВ рд╣реИ рджреЛрд╕реНрддреЛрдВред рдмреЗрд╢рдХ, рдЖрдк рдЖрд╡реГрддреНрддрд┐ рдмрдврд╝рд╛ рд╕рдХрддреЗ рд╣реИрдВ рдпрджрд┐ рд▓рдХреНрд╖реНрдп рдбрд┐рд╡рд╛рдЗрд╕ рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, 400 рдХрд┐рд▓реЛрд╣рд░реНрдЯреНрдЬрд╝ рдХреЗ рд▓рд┐рдП, рдЕрд╡рдзрд┐ 128 ╬╝s рдпрд╛ 1024 рдЪрдХреНрд░ рд╣реИ


рдЭрдВрдбреЗ рдХреЗ рдЙрдардиреЗ рдХрд╛ рдЗрдВрддрдЬрд╛рд░ рдПрдХ рдСрдкрд░реЗрд╢рди рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдмреЗрдХрд╛рд░ рд╣реИред рд╣рдЬрд╛рд░реЛрдВ рдШрдбрд╝реА рдЪрдХреНрд░реЛрдВ рдХреЗ рд▓рд┐рдП, рдкреНрд░реЛрд╕реЗрд╕рд░ рдмрд╣реБрдд рдЙрдкрдпреЛрдЧреА рдХрд╛рдо рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдлрд╝реНрд▓реЛрдЯрд┐рдВрдЧ рдкреЙрдЗрдВрдЯ рд╕рдВрдЦреНрдпрд╛рдУрдВ рдХреЛ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░рдиреЗ рдХрд╛ рд╕рдВрдЪрд╛рд▓рди рдХрд░реЗрдВред рдЗрд╕рд▓рд┐рдП, рдЗрд╕ рд╕реНрдерд┐рддрд┐ рд╕реЗ рдмрд╛рд╣рд░ рдирд┐рдХрд▓рдиреЗ рдХрд╛ рдПрдХрдорд╛рддреНрд░ рдкрд░реНрдпрд╛рдкреНрдд рддрд░реАрдХрд╛ рдПрдХ рдмрд╛рдзрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣реИред

рдмрд╛рдзрд╛ рдбрд╛рд▓рдиреЗ рдХрд╛ рдХрд╛рдо

рд╕рдВрд░рдЪрдирд╛ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░реЗрдВ:
 struct { unsigned char SLA; // Slave address unsigned char *pW; // ? unsigned char nW; // ? unsigned char *pR; // ? unsigned char nR; // ? } TWI; 

рдФрд░ рдЕрдм рд╣рдорд╛рд░рд╛ get_AC1 рдлрд╝рдВрдХреНрд╢рди:
 unsigned char Register_address; ... void get_AC1(void) { Register_address = 0xAA; //  Register address TWI.SLA = 0x77; // Slave address  BMP085 TWI.pW = &Register_address; //       TWI.nW = 1; //   ? TWI.pR = &BMP085_EEPROM.AC1; //   ? TWI.nR = 2; //   ? TWCR = (1<<TWEN)| //  TWI  (1<<TWIE)|(1<<TWINT)| //  !   (0<<TWEA)|(1<<TWSTA)|(0<<TWSTO)| //  START  (0<<TWWC); } 

рдмрд╛рдзрд╛ рд╣реИрдВрдбрд▓рд░ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреБрдЫ рд╢рдмреНрджред рдпрджрд┐ nW = n , nR = 0 , рдлреНрд░реЗрдо рдкреНрд░рд╛рд░реВрдк рд╣реИ:

рдпрджрд┐ nW = 0 , nR = m :

рдФрд░ рдЕрдЧрд░ nW = n , nR = m :

рд╡реИрд╕реЗ, рдмрд╛рдзрд╛ рд╣реИрдВрдбрд▓рд░ рдХреБрдЫ рднреА рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рд░рд╛рдЬреНрдп рдорд╢реАрди рддрд░реНрдХ рдХреЛ рд╡рд┐рднрд┐рдиреНрди рддрд░реАрдХреЛрдВ рд╕реЗ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдореЗрд░рд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдиреАрдЪреЗ рджрд┐рдЦрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ:
рдмрд╛рдзрд╛ рдбрд╛рд▓рдиреЗрд╡рд╛рд▓рд╛
 ISR(TWI_vect) { /* ----------------------------------------------------------------------------------- Jump table which is stored in flash ------------------------------------------------------------------------------------*/ static const void * const twi_list[] PROGMEM = {&&TWI_00, &&TWI_08, &&TWI_10, &&TWI_18, &&TWI_20, &&TWI_28, &&TWI_30, &&TWI_38, &&TWI_40, &&TWI_48, &&TWI_50, &&TWI_58, &&TWI_60, &&TWI_68, &&TWI_70, &&TWI_78, &&TWI_80, &&TWI_88, &&TWI_90, &&TWI_98, &&TWI_A0, &&TWI_A8, &&TWI_B0, &&TWI_B8, &&TWI_C0, &&TWI_C8, &&TWI_F8}; /* ----------------------------------------------------------------------------------- Jump to label, address of which is in twi_list[TWSR>>3] ------------------------------------------------------------------------------------*/ goto *(pgm_read_word(&(twi_list[TWSR>>3]))); /* ----------------------------------------------------------------------------------- Bus error handler ------------------------------------------------------------------------------------*/ TWI_00: // STOP condition will be generated goto STOP; /* ----------------------------------------------------------------------------------- A START condition has been transmitted A repeated START condition has been transmitted nW = nR = 0: STOP condition will be generated nW > 0, nR - don't care: SLA+W will be send nW = 0, nR > 0: SLA+R will be send ------------------------------------------------------------------------------------*/ TWI_08: TWI_10: if (TWI.nW != 0) // SLA+W will be send TWDR = (TWI.SLA)<<1; else if (TWI.nR != 0) // SLA+R will be send TWDR = (TWI.SLA)<<1 | 1<<0; else // STOP condition will be generated goto STOP; TWCR = (1<<TWEN)| //  TWI  (1<<TWIE)|(1<<TWINT)| //  !   (0<<TWEA)|(0<<TWSTA)|(0<<TWSTO)| //  SLA+R/W (0<<TWWC); return; /* ----------------------------------------------------------------------------------- SLA+W has been transmitted; ACK has been received Data byte has been transmitted; ACK has been received nW > 0, nR - don't care: Data byte will be transmitted and ACK or NOT ACK will be received nW = 0, nR > 0: Repeated START will be transmitted nW = nR = 0: STOP condition will be generated ------------------------------------------------------------------------------------*/ TWI_18: TWI_28: if (TWI.nW != 0) { // Data byte will be transmitted and ACK or NOT ACK will be received TWDR = *TWI.pW++; TWCR = (1<<TWEN)| //  TWI  (1<<TWIE)|(1<<TWINT)| //  !   (0<<TWEA)|(0<<TWSTA)|(0<<TWSTO)| //   (0<<TWWC); TWI.nW--; } else if (TWI.nR != 0) // Repeated START will be transmitted TWCR = (1<<TWEN)| //  TWI  (1<<TWIE)|(1<<TWINT)| //  !   (0<<TWEA)|(1<<TWSTA)|(0<<TWSTO)| //  START  (0<<TWWC); else // STOP condition will be generated goto STOP; return; /* ----------------------------------------------------------------------------------- SLA+W has been transmitted; NOT ACK has been received ------------------------------------------------------------------------------------*/ TWI_20: // STOP condition will be generated goto STOP; /* ----------------------------------------------------------------------------------- Data byte has been transmitted; NOT ACK has been received ------------------------------------------------------------------------------------*/ TWI_30: // STOP condition will be generated goto STOP; /* ----------------------------------------------------------------------------------- Arbitration lost in SLA+W or data bytes Arbitration lost in SLA+R or NOT ACK bit ------------------------------------------------------------------------------------*/ TWI_38: // STOP condition will be generated goto STOP; /* ----------------------------------------------------------------------------------- SLA+R has been transmitted; ACK has been received nR = 1: Data byte will be received and NOT ACK will be returned nR > 1: Data byte will be received and ACK will be returned ------------------------------------------------------------------------------------*/ TWI_40: if (TWI.nR == 1) // Data byte will be received and NOT ACK will be returned TWCR = (1<<TWEN)| //  TWI  (1<<TWIE)|(1<<TWINT)| //  !   (0<<TWEA)|(0<<TWSTA)|(0<<TWSTO)| //    + NACK (0<<TWWC); else // Data byte will be received and ACK will be returned TWCR = (1<<TWEN)| //  TWI  (1<<TWIE)|(1<<TWINT)| //  !   (1<<TWEA)|(0<<TWSTA)|(0<<TWSTO)| //    + ACK (0<<TWWC); return; /* ----------------------------------------------------------------------------------- SLA+R has been transmitted; NOT ACK has been received ------------------------------------------------------------------------------------*/ TWI_48: // STOP condition will be generated goto STOP; /* ----------------------------------------------------------------------------------- Data byte has been received; ACK has been returned nR = 2: Data byte will be received and NOT ACK will be returned nR > 2: Data byte will be received and ACK will be returned ------------------------------------------------------------------------------------*/ TWI_50: // Read data *TWI.pR++ = TWDR; if (TWI.nR-- == 2) // Data byte will be received and NOT ACK will be returned TWCR = (1<<TWEN)| //  TWI  (1<<TWIE)|(1<<TWINT)| //  !   (0<<TWEA)|(0<<TWSTA)|(0<<TWSTO)| //    + NACK (0<<TWWC); else // Data byte will be received and ACK will be returned TWCR = (1<<TWEN)| //  TWI  (1<<TWIE)|(1<<TWINT)| //  !   (1<<TWEA)|(0<<TWSTA)|(0<<TWSTO)| //    + ACK (0<<TWWC); return; /* ----------------------------------------------------------------------------------- Data byte has been received; NOT ACK has been returned Repeated START will be transmitted STOP condition will be transmitted and TWSTO Flag will be reset STOP condition followed by a START condition will be transmitted and TWSTO Flag will be reset ------------------------------------------------------------------------------------*/ TWI_58: // Read data *TWI.pR = TWDR; TWI_60: TWI_68: TWI_70: TWI_78: TWI_80: TWI_88: TWI_90: TWI_98: TWI_A0: TWI_A8: TWI_B0: TWI_B8: TWI_C0: TWI_C8: TWI_F8: // STOP condition will be transmitted and TWSTO Flag will be reset STOP: TWCR = (1<<TWEN)| //  TWI  (1<<TWIE)|(1<<TWINT)| //  !   (0<<TWEA)|(0<<TWSTA)|(1<<TWSTO)| //    + NACK (0<<TWWC); } 

рдЦреИрд░, рдХрд╛рдо рдХрд╛ рдкрд░рд┐рдгрд╛рдо:


рдЬреИрд╕рд╛ рдХрд┐ рд╣рдо рджреЗрдЦрддреЗ рд╣реИрдВ, рд░рдирдЯрд╛рдЗрдо 488 ╬╝s рд╕реЗ рдмрдврд╝рдХрд░ 538 ╬╝s рд╣реЛ рдЧрдпрд╛ ред рдпрд╣ рд╣реИрдВрдбрд▓рд░ рд╕реЗ рд╕рдВрдХреНрд░рдордг рдФрд░ рд▓реМрдЯрдиреЗ рдХреЗ рд╕рд╛рде-рд╕рд╛рде рд▓реБрдХрдЕрдк рдЯреЗрдмрд▓ рдкрд░ рдЬрдВрдк рдПрдбреНрд░реЗрд╕ рдХреА рдЧрдгрдирд╛ рдХреЗ рдХрд╛рд░рдг рд╣реИред рд▓реЗрдХрд┐рди рд╕рдмрд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдмрд╛рдд рдпрд╣ рд╣реИ рдХрд┐ рд╕рдВрдкреВрд░реНрдг рдЯреНрд░рд╛рдВрд╕рдорд┐рд╢рди рд╣рд╛рд░реНрдбрд╡реЗрдпрд░ рд╣реИред рдЗрд╕рд▓рд┐рдП, рдЫреЛрдЯреЗ рдлрд╝рдВрдХреНрд╢рди get_AC1 рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдЬреЛ рдХреЗрд╡рд▓ 3.5 ╬╝s рдпрд╛ 28 рдШрдбрд╝реА рдЪрдХреНрд░ рддрдХ рд░рд╣рддрд╛ рд╣реИ , рд╣рдо рд╕реБрд░рдХреНрд╖рд┐рдд рд░реВрдк рд╕реЗ рдЕрдиреНрдп рдХрд╛рдо рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рдкреНрд░рддреАрдХреНрд╖рд╛ рдЪрдХреНрд░ рдореЗрдВ рдлрдВрд╕ рдирд╣реАрдВ рд╕рдХрддреЗ рд╣реИрдВред


рдЖрдЗрдП рджреЗрдЦреЗрдВ рдХрд┐ рдХреНрдпрд╛ рд╣реЛрддрд╛ рд╣реИ рдпрджрд┐ рдЖрдк get_AC1 , get_AC2 , ..., get_MD рдлрд╝рдВрдХреНрд╢рдВрд╕ рдХреЛ рдХреЙрд▓ рдХрд░рддреЗ рд╣реИрдВ:


рдХреЗрд╡рд▓ рдПрдХ рд╣реА рдирд┐рд╖реНрдкрд╛рджрд┐рдд рд╣реЛрдЧрд╛, get_MD , рдФрд░ рд╕рднреА рдХреНрдпреЛрдВрдХрд┐:


рдЕрдВрддрд┐рдо рдХрд╛рд░реНрдп SLA + W рдкреВрд░рд╛ рд╣реЛрдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рд╕рдВрд░рдЪрдирд╛ рдореЗрдВ рдбреЗрдЯрд╛ рд▓реЛрдб рдХрд░рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП Register_address рдЗрд╕рдХреЗ рдЕрдиреБрд░реВрдк рд╣реИ рдФрд░ 0-0BE рдХреЗ рдмрд░рд╛рдмрд░ рд╣реИред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдпрд╣ рд╕рдВрднрд╡рддрдГ рд╕рдмрд╕реЗ рд╣рд╛рдирд┐рд░рд╣рд┐рдд рдкрд░рд┐рджреГрд╢реНрдп рд╣реИред рдЖрдЦрд┐рд░рдХрд╛рд░, рдпрджрд┐ рд╕реНрдерд╛рдирд╛рдВрддрд░рдг Register_address рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдереЛрдбрд╝рд╛ рддреЗрдЬрд╝ рдерд╛, рддреЛ рдпрд╣ get_AC5 рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдЕрдиреБрд░реВрдк рд╣реЛрдЧрд╛ , рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдФрд░ рд╣рдордиреЗ рдЗрд╕реЗ BMP085_EEPROM.MD рдореЗрдВ рдмрд┐рд▓реНрдХреБрд▓ рд▓рд┐рдЦрд╛ рд╣реЛрдЧрд╛ред рдпрд╣реА рд╣реИ, рд╣рдо AC1 рдХреА рдЕрдкреЗрдХреНрд╖рд╛ рдХрд░рддреЗ рд╣реИрдВ, рд╣рдо AC5 рдХреЛ MD рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рддреЗ рд╣реИрдВред рдФрд░ рдЕрдЧрд░ get_AC5 рдХреЗ рдмрдЬрд╛рдп рдЕрдкрдиреЗ SLA рдХреЗ рд╕рд╛рде рдПрдХ рдФрд░ рдПрдХ рд╣реЛрдЧрд╛, рддреЛ рд╣рдо рдПрдХ рдХрд╛ рдЖрдзрд╛ рдкрддрд╛ рднреЗрдЬ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рджреВрд╕рд░реЗ рдХрд╛ рджреВрд╕рд░рд╛ рдФрд░ NACK рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рдлрд┐рд░ рд╡реНрдпрд╡рдзрд╛рди рд╣реИрдВрдбрд▓рд░ рд╕реЗ рддрд░реНрдХ рдпрд╛ рддреЛ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреЛ рд▓реВрдк рдХрд░реЗрдВрдЧреЗ рдпрд╛ STOP рдлреЗрдВрдХ рджреЗрдВрдЧреЗред рдЗрд╕ рд╕реНрдерд┐рддрд┐ рд╕реЗ рдмрд╛рд╣рд░ рдЖрдиреЗ рдХрд╛ рдПрдХ рд╕реНрдкрд╖реНрдЯ рддрд░реАрдХрд╛ рд╣реИред рдЕрдЧрд▓рд╛ рдлрд╝рдВрдХреНрд╢рди рддрдм рддрдХ рди рдЪрд▓рд╛рдПрдВ рдЬрдм рддрдХ рдХрд┐ рдкрд┐рдЫрд▓рд╛ рд╕рдорд╛рдкреНрдд рди рд╣реЛ рдЬрд╛рдПред рдпрд╣реА рд╣реИ, get_AC1 рдЪрд▓рд╛рдХрд░ рд╣рдо рдзреНрд╡рдЬ рдХреЛ 1 рдкрд░ рд╕реЗрдЯ рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рд╣реИрдВрдбрд▓рд░, STOP рдкреВрд░рд╛ рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж, рдЗрд╕реЗ рд░реАрд╕реЗрдЯ рдХрд░ рджреЗрдЧрд╛ред рдФрд░ get_AC2 рддрдм рддрдХ рд╢реБрд░реВ рдирд╣реАрдВ рд╣реЛрдЧрд╛ рдЬрдм рддрдХ рдХрд┐ рдпрд╣ рдЭрдВрдбрд╛ рд╕рд╛рдл рдирд╣реАрдВ рд╣реЛ рдЬрд╛рддрд╛ред рд╣рд╛рдВ, рдпрд╣ рдПрдХ рддрд░реАрдХрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд░реБрдХрд╛рд╡рдЯ рдХреЗ рд╕рднреА рдЖрдХрд░реНрд╖рдг рдЦреЛ рдЬрд╛рддреЗ рд╣реИрдВ, рдЬреЛ рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ 0% рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдмреЗрд╣рддрд░ рдЭрдВрдбрд╛ рдорд╢реАрдиред рд▓реЗрдХрд┐рди рдПрдХ рдФрд░ рд╕реБрдВрджрд░ рдЙрдкрд╛рдп рд╣реИред

рдореНрдпреВрдЯреЗрдХреНрд╕ рдПрдирд╛рд▓реЙрдЧ

Get_AC1 , ..., get_MD рдлрд╝рдВрдХреНрд╢рдВрд╕ рд╕реАрдзреЗ рдбреЗрдЯрд╛ рд╕рдВрдЪрд╛рд░рд┐рдд рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВред рд╡реЗ рдПрдХ рдЕрдиреНрдп рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓ рдХрд░рддреЗ рд╣реИрдВ рдЬреЛ рдЙрдиреНрд╣реЗрдВ рдХрддрд╛рд░ рдореЗрдВ рд░рдЦрддрд╛ рд╣реИ рдФрд░ рдпрджрд┐ рдХрддрд╛рд░ рдЦрд╛рд▓реА рдирд╣реАрдВ рд╣реИ, рддреЛ рд╡рд╣ рд╕реНрдерд╛рдирд╛рдВрддрд░рдг рдХреА рд╢реБрд░реБрдЖрдд рдХреЛ рдкреНрд░рд╛рд░рдВрдн рдХрд░рддрд╛ рд╣реИред рд╣рдо рд╕рдВрд░рдЪрдирд╛рдУрдВ рдХреА рдПрдХ рд╕рд░рдгреА рдмрдирд╛рдХрд░ рдЕрдкрдиреА рд╕рдВрд░рдЪрдирд╛ рдХреЛ рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦрддреЗ рд╣реИрдВ:
 #define size 8 ... typedef struct { unsigned char SLA; // Slave address unsigned char *pW; // ? unsigned char nW; // ? unsigned char *pR; // ? unsigned char nR; // ? } twi; twi TWI[size]; 


рдЖрдЗрдП рджреЗрдЦреЗрдВ рдХрд┐ рдЕрдм get_AC1 рдлрд╝рдВрдХреНрд╢рди рдХреИрд╕реЗ рджрд┐рдЦреЗрдЧрд╛:
 unsigned char buf[size]; ... void get_AC1(void) { volatile twi *pl; //     twi buf[0] = 0xAA; //  Register address pl->SLA = 0x77; // Slave address  BMP085 pl->pW = buf; //       pl->nW = 1; //   ? pl->pR = buf; //   ? pl->nR = 2; //   ? Scheduler(pl); //    } 

рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рд░реВрдк рд╕реЗ рднреА, рдХреЗрд╡рд▓ рд╕реНрдЯрд╛рд░реНрдЯ рд╕реНрдЯреЗрдЯ рдХреЛ рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝ рдХрд░рдиреЗ рдХреЗ рдмрдЬрд╛рдп, рд╣рдо рд╢реЗрдбреНрдпреВрд▓рд░ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓ рдХрд░рддреЗ рд╣реИрдВ, рдЗрд╕реЗ рдкреЙрдЗрдВрдЯрд░ рдХреЛ рдПрдХ рджреЛ рдкреНрд░рдХрд╛рд░ рдХреА рд╕рдВрд░рдЪрдирд╛ рдореЗрдВ рдкрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВ , рдЬрд┐рд╕рдореЗрдВ TWI рдлрд╝реНрд░реЗрдо рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╕рднреА рдбреЗрдЯрд╛ рд╣реЛрддреЗ рд╣реИрдВред рдЕрдиреБрд╕реВрдЪрдХ рдХреЗ рдмреБрдирд┐рдпрд╛рджреА рдХрд╛рд░реНрдпреЛрдВ рдФрд░ рд╣реИрдВрдбрд▓рд░ рдореЗрдВ рдХреБрдЫ рдмрджрд▓рд╛рд╡реЛрдВ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ:

рдпрд╣ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрдиреЗ рдпреЛрдЧреНрдп рдирд╣реАрдВ рд╣реИ рдХрд┐ рдКрдкрд░ рдХреНрдпрд╛ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рд╣реИред рдПрдХ рдЫреЛрдЯреА рдкреНрд░рд╕реНрддреБрддрд┐ рджреЗрдЦрдирд╛ рдмреЗрд╣рддрд░ рд╣реИ рдЬреЛ рдКрдкрд░ рджрд┐рдП рдЧрдП рдХреБрдЫ рдмрд┐рдВрджреБрдУрдВ рдХреЛ рд╕реНрдкрд╖реНрдЯ рдХрд░реЗрдЧрд╛:


рд╢реЗрдбреНрдпреВрд▓рд░ рд╢реЗрдбреНрдпреВрд▓рд░ рдлрд╝рдВрдХреНрд╢рди :
 void Scheduler(twi *pl) { if (tail-head !=1 && head-tail != size-1) //    ,  { twi *pg = &TWI[head]; //      pg->SLA = pl->SLA; //  SLA pg->pW = pl->pW; //  *pW pg->nW = pl->nW; //  nW pg->pR = pl->pR; //  *pR pg->nR = pl->nR; //  nR head = (head+1)&(size-1); //       -  if (!flag.twi_run) //   TWI    (  0) { flag.twi_run = 1; //    1 TWCR = (1<<TWEN)| //  TWI  (1<<TWIE)|(1<<TWINT)| (0<<TWEA)|(1<<TWSTA)|(0<<TWSTO)| (0<<TWWC); } } } 

рдЦреИрд░, рд╣реИрдВрдбрд▓рд░ рд╣реА:
рдмрд╛рдзрд┐рдд рд╣реИрдВрдбрд▓рд░ рдХреЛ рдлрд┐рд░ рд╕реЗ рдбрд┐рдЬрд╝рд╛рдЗрди рдХрд┐рдпрд╛ рдЧрдпрд╛
 ISR(TWI_vect) { twi *p = &TWI[tail]; /* ----------------------------------------------------------------------------------- Jump table which is stored in flash ------------------------------------------------------------------------------------*/ static const void * const twi_list[] PROGMEM = {&&TWI_00, &&TWI_08, &&TWI_10, &&TWI_18, &&TWI_20, &&TWI_28, &&TWI_30, &&TWI_38, &&TWI_40, &&TWI_48, &&TWI_50, &&TWI_58, &&TWI_60, &&TWI_68, &&TWI_70, &&TWI_78, &&TWI_80, &&TWI_88, &&TWI_90, &&TWI_98, &&TWI_A0, &&TWI_A8, &&TWI_B0, &&TWI_B8, &&TWI_C0, &&TWI_C8, &&TWI_F8}; /* ----------------------------------------------------------------------------------- Jump to label, address of which is in twi_list[TWSR>>3] ------------------------------------------------------------------------------------*/ goto *(pgm_read_word(&(twi_list[TWSR>>3]))); /* ----------------------------------------------------------------------------------- Bus error handler ------------------------------------------------------------------------------------*/ TWI_00: // STOP condition will be generated goto STOP; /* ----------------------------------------------------------------------------------- A START condition has been transmitted A repeated START condition has been transmitted nW = nR = 0: STOP condition will be generated nW > 0, nR - don't care: SLA+W will be send nW = 0, nR > 0: SLA+R will be send ------------------------------------------------------------------------------------*/ TWI_08: TWI_10: if (p->nW != 0) // SLA+W will be send TWDR = p->SLA<<1; else if (p->nR != 0) // SLA+R will be send TWDR = p->SLA<<1 | 1<<0; else // STOP condition will be generated goto STOP; TWCR = (1<<TWEN)| //  TWI  (1<<TWIE)|(1<<TWINT)| //  !   (0<<TWEA)|(0<<TWSTA)|(0<<TWSTO)| //  SLA+R/W (0<<TWWC); return; /* ----------------------------------------------------------------------------------- SLA+W has been transmitted; ACK has been received Data byte has been transmitted; ACK has been received nW > 0, nR - don't care: Data byte will be transmitted and ACK or NOT ACK will be received nW = 0, nR > 0: Repeated START will be transmitted nW = nR = 0: STOP condition will be generated ------------------------------------------------------------------------------------*/ TWI_18: TWI_28: if (p->nW != 0) { // Data byte will be transmitted and ACK or NOT ACK will be received TWDR = *p->pW; p->pW++; TWCR = (1<<TWEN)| //  TWI  (1<<TWIE)|(1<<TWINT)| //  !   (0<<TWEA)|(0<<TWSTA)|(0<<TWSTO)| //   (0<<TWWC); p->nW--; } else if (p->nR != 0) // Repeated START will be transmitted TWCR = (1<<TWEN)| //  TWI  (1<<TWIE)|(1<<TWINT)| //  !   (0<<TWEA)|(1<<TWSTA)|(0<<TWSTO)| //  START  (0<<TWWC); else // STOP condition will be generated goto STOP; return; /* ----------------------------------------------------------------------------------- SLA+W has been transmitted; NOT ACK has been received ------------------------------------------------------------------------------------*/ TWI_20: // STOP condition will be generated goto STOP; /* ----------------------------------------------------------------------------------- Data byte has been transmitted; NOT ACK has been received ------------------------------------------------------------------------------------*/ TWI_30: // STOP condition will be generated goto STOP; /* ----------------------------------------------------------------------------------- Arbitration lost in SLA+W or data bytes Arbitration lost in SLA+R or NOT ACK bit ------------------------------------------------------------------------------------*/ TWI_38: // STOP condition will be generated goto STOP; /* ----------------------------------------------------------------------------------- SLA+R has been transmitted; ACK has been received nR = 1: Data byte will be received and NOT ACK will be returned nR > 1: Data byte will be received and ACK will be returned ------------------------------------------------------------------------------------*/ TWI_40: if (p->nR == 1) // Data byte will be received and NOT ACK will be returned TWCR = (1<<TWEN)| //  TWI  (1<<TWIE)|(1<<TWINT)| //  !   (0<<TWEA)|(0<<TWSTA)|(0<<TWSTO)| //    + NACK (0<<TWWC); else // Data byte will be received and ACK will be returned TWCR = (1<<TWEN)| //  TWI  (1<<TWIE)|(1<<TWINT)| //  !   (1<<TWEA)|(0<<TWSTA)|(0<<TWSTO)| //    + ACK (0<<TWWC); return; /* ----------------------------------------------------------------------------------- SLA+R has been transmitted; NOT ACK has been received ------------------------------------------------------------------------------------*/ TWI_48: // STOP condition will be generated goto STOP; /* ----------------------------------------------------------------------------------- Data byte has been received; ACK has been returned nR = 2: Data byte will be received and NOT ACK will be returned nR > 2: Data byte will be received and ACK will be returned ------------------------------------------------------------------------------------*/ TWI_50: // Read data *p->pR = TWDR; p->pR++; if (p->nR-- == 2) // Data byte will be received and NOT ACK will be returned TWCR = (1<<TWEN)| //  TWI  (1<<TWIE)|(1<<TWINT)| //  !   (0<<TWEA)|(0<<TWSTA)|(0<<TWSTO)| //    + NACK (0<<TWWC); else // Data byte will be received and ACK will be returned TWCR = (1<<TWEN)| //  TWI  (1<<TWIE)|(1<<TWINT)| //  !   (1<<TWEA)|(0<<TWSTA)|(0<<TWSTO)| //    + ACK (0<<TWWC); return; /* ----------------------------------------------------------------------------------- Data byte has been received; NOT ACK has been returned Repeated START will be transmitted STOP condition will be transmitted and TWSTO Flag will be reset STOP condition followed by a START condition will be transmitted and TWSTO Flag will be reset ------------------------------------------------------------------------------------*/ TWI_58: // Read data *p->pR = TWDR; TWI_60: TWI_68: TWI_70: TWI_78: TWI_80: TWI_88: TWI_90: TWI_98: TWI_A0: TWI_A8: TWI_B0: TWI_B8: TWI_C0: TWI_C8: TWI_F8: // STOP condition will be transmitted and TWSTO Flag will be reset STOP: tail = (tail+1)&(size-1); //  tail  1,    ,   if (head != tail) //  head  tail  ,  TWCR = (1<<TWEN)| //  TWI  (1<<TWIE)|(1<<TWINT)| //  !   (0<<TWEA)|(1<<TWSTA)|(1<<TWSTO)| // - (0<<TWWC); else //  { TWCR = (1<<TWEN)| //  TWI  (1<<TWIE)|(1<<TWINT)| //  !   (0<<TWEA)|(0<<TWSTA)|(1<<TWSTO)| //  (0<<TWWC); flag.twi_run = 0; //   } } 

рдЦреИрд░, get_AC1 рдХрд╛ рдкрд░рд┐рдгрд╛рдо:


рдЕрдВрддрднрд╛рд╖рдг

рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдЕрдЧрд░, get_AC1 рдХреЗ рд╕рд╛рде рд╕рд╛рджреГрд╢реНрдп рджреНрд╡рд╛рд░рд╛, get_AC2 рдмрдирд╛рддреЗ рд╣реИрдВ рдФрд░ рдПрдХ рдкрдВрдХреНрддрд┐ рдореЗрдВ 2 рдлрд╝рдВрдХреНрд╢рди рдЪрд▓рд╛рддреЗ рд╣реИрдВ, рддреЛ рдХреЗрд╡рд▓ рдЕрдВрддрд┐рдо рдПрдХ рдХреЛ рджреЛ рдмрд╛рд░ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдпрд╣ рдЗрд╕ рддрдереНрдп рдХреЗ рдХрд╛рд░рдг рд╣реИ рдХрд┐ рд╣рдо рд▓рдЧрд╛рддрд╛рд░ buf рдореЗрдВ рд╕рдВрдЪрд░рдг рдХреЗ рд▓рд┐рдП рдбреЗрдЯрд╛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рддреЗ рд╣реИрдВ [0]ред рдЗрд╕рд╕реЗ рдмрдЪрдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдбреЗрдЯрд╛ рдХреЛ buf [1] рдореЗрдВ рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рд╕рдм рдХреБрдЫ рд╡реИрд╕рд╛ рд╣реА рдХрд╛рдо рдХрд░реЗрдЧрд╛ рдЬреИрд╕рд╛ рдХрд┐ рдЗрд╕реЗ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред рд▓реЗрдХрд┐рди рдРрд╕рд╛ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдбреЗрдЯрд╛ рдХрд╣рд╛рдВ рд╕реЗ рдФрд░ рдХрд┐рддрдирд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рд╣реИ, рдЗрд╕рдХреЗ рд▓рд┐рдП рдПрдХ рдкреЙрдЗрдВрдЯрд░ рдХреЛ рдЯреНрд░рд╛рдВрд╕рдлрд░ рдХрд░рдирд╛ рд╕рд╣реА рд╣реИ рдФрд░ рдХреБрдЫ рдерд░реНрдб-рдкрд╛рд░реНрдЯреА рдлрдВрдХреНрд╢рди рдЗрд╕реЗ TWI рдХреЗ рд▓рд┐рдП рдмрдлрд░ рдореЗрдВ рдбрд╛рд▓ рджреЗрдЧрд╛ рдФрд░ рд╣реИрдВрдбрд▓рд░ рдореЗрдВ рдЬрд╣рд╛рдВ рд╕реЗ рдбреЗрдЯрд╛ рдорд┐рд▓реЗрдЧрд╛, рд╡рд╣рд╛рдВ рд╕реЗ рдПрдХ рдкреЙрдЗрдВрдЯрд░ рд▓реМрдЯрд╛рдПрдЧрд╛ред рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдХреЛрдб:

рдХреЛрдб
 unsigned char bufTx[size]; unsigned char pos = 0; ... void get_AC1(void) { volatile twi *pl; //     twi volatile uint8_t buf[] = {0xAA}; //  Register address  buf pl->SLA = 0x77; // Slave address  BMP085 pl->pW = buf; //       pl->nW = 1; //   ? pl->pR = buf; //   ? pl->nR = 2; //   ? Scheduler(pl); //    } // ============================================ void get_AC2(void) { volatile twi *pl; //     twi volatile uint8_t buf[] = {0xAC}; //  Register address  buf pl->SLA = 0x77; // Slave address  BMP085 pl->pW = buf; //       pl->nW = 1; //   ? pl->pR = buf; //   ? pl->nR = 2; //   ? Scheduler(pl); //    } // ============================================ void Scheduler(volatile twi *pl) { if (tail-head !=1 && head-tail != size-1) //    ,  { twi *pg = &TWI[head]; //      pg->SLA = pl->SLA; //  SLA pg->pW = pushToBuf(pl->pW,pl->nW); //  ,    //  buf  bufTX    pg->nW = pl->nW; //  nW pg->pR = pl->pR; //  *pR pg->nR = pl->nR; //  nR head = (head+1)&(size-1); //       -  if (!flag.twi_run) //   TWI    (  0) { flag.twi_run = 1; //    1 TWCR = (1<<TWEN)| //  TWI  (1<<TWIE)|(1<<TWINT)| (0<<TWEA)|(1<<TWSTA)|(0<<TWSTO)| (0<<TWWC); } } } // ============================================ unsigned char *pushToBuf(unsigned char *buf, unsigned char n) { unsigned char *p = &bufTx[pos]; //      do { bufTx[pos++] = *buf++; //   buf  bufTx pos &= size-1; //   -  } while (--n); //  n  return p; //   p } 

рддрд╕реНрд╡реАрд░ рдХреЛ рджреЗрдЦреЛ:


рдХреГрдкрдпрд╛, рд╕рд╛рджреГрд╢реНрдп рджреНрд╡рд╛рд░рд╛, рдПрдХ рд╣реА рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдкреНрд░рд╛рдкреНрдд рдмрдлрд░ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рдЖрдк рдЙрд╕реЗ рдмрддрд╛рдПрдВ, рдФрд░ рд╡рд╣ рдЖрдкрдХреЛ рдХрд╣рд╛рдВ рднреЗрдЬрддреА рд╣реИред рдЖрдк TWI рдХреА рд╕рдВрд░рдЪрдирд╛ рдХреЛ рднреА рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдореЗрдореЛрд░реА рдХреЛ рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреЙрдЗрдВрдЯрд░реНрд╕ рдХреЛ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ, рдмрд▓реНрдХрд┐ рдЕрдиреБрдХреНрд░рдорд┐рдд рдХрд░рддреЗ рд╣реИрдВред
рдпрджрд┐ рдХрд┐рд╕реА рдХреЗ рдкрд╛рд╕ рдпрд╣ рд╕рд╡рд╛рд▓ рд╣реИ рдХрд┐ рдХреЛрдб рдХреЛ рд░реАрд╕реЗрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХреНрдпреЛрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ:
 head = (head+1)&(size-1); tail = (tail+1)&(size-1); pos &= size-1; 

рдореИрдВ рдЗрд╕реЗ рддреЗрдЬ рдФрд░ рдХрдо рдХреЛрдб рдХрд╣реВрдВрдЧрд╛ред рдХреЗрд╡рд▓ рд╢рд░реНрдд рдпрд╣ рд╣реИ рдХрд┐ рдорд╛рди 2 n рд╣реИ ред
рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдореЗрдВ рд╕реЗ, рдпрд╣ TWI рдХреЗ рд▓рд┐рдП рдЕрдзрд┐рдХрддрдо рдЖрдХрд╛рд░ рдХреЗ рдЖрдХрд╛рд░ рдХреЛ рднреА рдзреНрдпрд╛рди рджреЗрдиреЗ рдпреЛрдЧреНрдп рд╣реИ ред рдпрджрд┐ рдпрд╣ рд▓рдЧрд╛рддрд╛рд░ рдЕрдиреБрд░реЛрдзреЛрдВ рдХреА рдЕрдзрд┐рдХрддрдо рд╕рдВрднрд╡ рд╕рдВрдЦреНрдпрд╛ рд╕реЗ рдХрдо рд╣реИ, рддреЛ рд╣рдо рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдЙрдирдореЗрдВ рд╕реЗ рдХреБрдЫ рдХреЛ рдЦреЛ рджреЗрдВрдЧреЗред рдЗрд╕рд▓рд┐рдП, рдЗрд╕ рдкрд░ рдЬреЛрд░ рджреЗрдирд╛ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИред рд╣рдореЗрд╢рд╛ рд╕рдорд╡рд░реНрддреА рдЕрдиреБрд░реЛрдзреЛрдВ рдХреА рдЕрдзрд┐рдХрддрдо рд╕рдВрдЦреНрдпрд╛ рд╕реЗ рдХрдо рд╕реЗ рдХрдо 1 рдЕрдзрд┐рдХ рдХреЗ рдЖрдХрд╛рд░ рдХреЗ рдореВрд▓реНрдп рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ ред
рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдкреВрд░рд╛ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдкреНрд░рд╛рдкреНрдд рдбреЗрдЯрд╛ рдХреЗ рд▓рд┐рдП рд╣реИрдВрдбрд▓рд░ рдЬреЛрдбрд╝рдирд╛ рд╕рдВрднрд╡ рд╣реЛрдЧрд╛ред рд╣рдорд╛рд░реЗ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрд╣ рдкреНрд░рд╛рдкреНрдд рдПрд╕реА 1 рдФрд░ рдПрд╕реА 2 рдХрд╛ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рд╣реИ, рдЬрд┐рд╕реЗ рд╣рдо рдмрд┐рдЧ-рдПрдВрдбрд┐рдпрди рдореЗрдВ рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕реЗ рд▓рд┐рдЯрд┐рд▓-рдПрдВрдбрд┐рдпрди рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рдФрд░ рдлрд┐рд░ рдЙрдкрдпреБрдХреНрдд рд╕реНрдерд╛рди рдкрд░ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, TWI рд╕рдВрд░рдЪрдирд╛ рдореЗрдВ, рдлрд╝рдВрдХреНрд╢рди рд╣реИрдВрдбрд▓рд░ рдХреЗ рд▓рд┐рдП рдПрдХ рдкреЙрдЗрдВрдЯрд░ рдХреЛ рд╕реНрдЯреЛрд░ рдХрд░рдирд╛ рдФрд░ рдпрд╣ рдкрддрд╛ рд▓рдЧрд╛рдирд╛ рд╕рдВрднрд╡ рд╣реЛрдЧрд╛ рдХрд┐ рд╡рд░реНрдХрдЖрдЙрдЯ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж рдЗрд╕реЗ рдХреИрд╕реЗ рдХреЙрд▓ рдХрд┐рдпрд╛ рдЬрд╛рдПред
рдкреНрд░рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЙрд▓реНрд▓реЗрдЦ рдХреЗ рд▓рд╛рдпрдХ рдХреБрдЫ рд╢рдмреНрджред рдореЗрд░реА рдпреЛрдЬрдирд╛ рдХреЗ рд╕рдВрдмрдВрдз рдореЗрдВ, рдЯреАрдбрдмреНрд▓реВрдЖрдИ рдмрд╕ рдореЗрдВ 2 рд╕реЗрдВрд╕рд░, рджрдмрд╛рд╡, 1 рдЯрд╛рдЗрдо рдЪрд┐рдк рдФрд░ 1 рдореЗрдореЛрд░реА рдЪрд┐рдк рд╣реИрдВред рдФрд░ рдЙрди рддрдХ рдкрд╣реБрдВрдЪ рдХреЛ рдкрд░рдорд╛рдгреБ рдХреЗ рд░реВрдк рдореЗрдВ рдорд╛рдирд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдПрдХ рджрдмрд╛рд╡ рд╕реЗрдВрд╕рд░ рдХреЗ рд▓рд┐рдП:


рдпрджрд┐ рд╣рдо рдЕрд╕рдореНрдкреАрдбрд┐рдд рджрдмрд╛рд╡ рдХреЗ рд▓рд┐рдП рд╕рдВрдЪрд░рдг рдЦреЛ рджреЗрддреЗ рд╣реИрдВ, рддреЛ рд╣рдореЗрдВ рдЕрд╕рдореНрдкреАрдбрд┐рдд рддрд╛рдкрдорд╛рди рдХреЗ рдкреНрд░рд╛рдкреНрдд рдореВрд▓реНрдп рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ рдФрд░ рд╣рдореЗрдВ рдлрд┐рд░ рд╕реЗ рд╢реБрд░реВ рдХрд░рдирд╛ рд╣реЛрдЧрд╛, рдХреНрдпреЛрдВрдХрд┐ рд╣рдореЗрдВ рдЕрдорд╛рдиреНрдп рдбреЗрдЯрд╛ рдорд┐рд▓ рд╕рдХрддрд╛ рд╣реИред
рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, TWI рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╕рдВрдЪрд╛рд░рд┐рдд рд╣реЛрдиреЗ рдкрд░ рд╡рд┐рдлрд▓рддрд╛ рдХрд╛ рдХреЛрдИ рдорд╛рдорд▓рд╛ рдирд╣реАрдВ рд╣реИред рдЪреВрдВрдХрд┐ рд╣рдо рдореВрд▓ TWI [i] рдХреЛ рд╣реИрдВрдбрд▓рд░ рдореЗрдВ рдмрджрд▓ рд░рд╣реЗ рд╣реИрдВ, рд╣рдо рдлрд┐рд░ рд╕реЗ рд╕реНрдерд╛рдирд╛рдВрддрд░рдг рд╢реБрд░реВ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдк рдЯрд╛рдЗрдк рдЯрд╡реА рдХреА рд╡реИрд╢реНрд╡рд┐рдХ рд╕рдВрд░рдЪрдирд╛ рдХреА рдШреЛрд╖рдгрд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рдкреНрд░рддреНрдпреЗрдХ рд╢реБрд░реБрдЖрдд рд╕реЗ рдкрд╣рд▓реЗ, TWI [рдЯреЗрд▓] рд╕реЗ рдбреЗрдЯрд╛ рдХреЙрдкреА рдХрд░реЗрдВ, рдФрд░ рдкреНрд░реЛрд╕реЗрд╕рд░ рдХреЛ рдХреЙрдкреА рдХреЛ рдЦрд░рд╛рдм рдХрд░рдиреЗ рджреЗрдВред рд╡рд┐рдлрд▓рддрд╛ рдХреА рд╕реНрдерд┐рддрд┐ рдореЗрдВ, рд╣рдо рдбреЗрдЯрд╛ рдХреЛ рдореВрд▓ рд╕реЗ рдкреБрдирд░реНрд╕реНрдерд╛рдкрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рдирд┐рд╖реНрдХрд░реНрд╖


рдХрдИ рд▓реЛрдЧ рдкреВрдЫреЗрдВрдЧреЗ: тАЬрдХреНрдпреЛрдВ? рджрд░рдЕрд╕рд▓, рд╕рдВрд░рдЪрдирд╛ рдХреЗ 16 рддрддреНрд╡реЛрдВ рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ 16 * (1 + 2 + 1 + 2 + 1) = SRAM рдХреЗ 112 рдмрд╛рдЗрдЯреНрд╕ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ! рдЖрд░рдЯреАрдУрдПрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреНрдпреЛрдВ рдирд╣реАрдВ? рдЙрдиреНрд╣реЗрдВ рдХрд╣рддреЗ рд╣реИрдВ рдХрд┐ 1 рддрддреНрд╡ рдХреЗ рд╕рд╛рде рдПрдХ рд╕рдВрд░рдЪрдирд╛ рд╣реЛрдЧреА, рдФрд░ рдЕрдЧрд░ рдпрд╣ рдЗрд╕рдореЗрдВ рдлрд┐рдЯ рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ, рддреЛ рд╣рдо n рдПрдордПрд╕ рдХреЗ рд▓рд┐рдП рдХрддрд╛рд░ рд▓рдЧрд╛рддреЗ рд╣реИрдВред тАЭрдореЗрд░рд╛ рдорд╛рдирдирд╛ тАЛтАЛрд╣реИ рдХрд┐ рдЗрд╕ рддрд░рд╣ рдХрд╛ рд╕рдорд╛рдзрд╛рди рдСрдкрд░реЗрдЯрд┐рдВрдЧ рд╕рд┐рд╕реНрдЯрдо рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдЙрдкрдпреЛрдЧреА рд╣реИред рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪреЗрдВ рдХрд┐ рдЗрд╕ рд╣рд╕реНрддрд╛рдВрддрд░рдг рдореЗрдВ рдХрд┐рддрдирд╛ рд╕рдордп рд▓рдЧреЗрдЧрд╛? рдпрджрд┐ рд╣рдо рдХрддрд╛рд░ рд▓рдЧрд╛рддреЗ рд╣реИрдВ, рддреЛ рдкреНрд░рддреНрдпреЗрдХ рдЕрдЧрд▓рд╛ рдЯреНрд░рд╛рдВрд╕рдорд┐рд╢рди n ms рдореЗрдВ рд╣реЛрдЧрд╛, рдФрд░ рдкреВрд░рд╛ n * m ms рдореЗрдВ рд╕рдорд╛рдкреНрдд рд╣реЛ рдЬрд╛рдПрдЧрд╛ред рд╣рд╛рдВ, рдФрд░ рдХреНрдпреЛрдВ рдЕрдирд╛рд╡рд╢реНрдпрдХ рдПрдо рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХреЗ рд╕рд╛рде рдХрддрд╛рд░ рдХреЛ рднрд░реЗрдВ, рдХреНрдпреЛрдВрдХрд┐ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдПрдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдХрд╛рд░реНрдп рдХреЛ рдпрд╛рдж рдХрд░рдиреЗ рдХрд╛ рдореМрдХрд╛ рд╣реИред рдФрд░ OS рдХрд░реНрдиреЗрд▓ рдЕрдирд▓реЛрдб рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдХрддрд╛рд░ рдореЗрдВ m * (m + 1) / 2 рдХрд╛рд░реНрдп рдирд╣реАрдВ рдбрд╛рд▓ рд░рд╣рд╛ рд╣реИред

Source: https://habr.com/ru/post/In193456/


All Articles