#include "main.h"#include "string.h"#define SA 0x00 // Slave Address (0 for single slave / 0x5A<<1 default)#define EEPROM_Access 0x20 // EEPROM access command#define EEPROM_Addr 0x0E // I2CAddr address in the eeprom#define RAM_Access 0x00 // RAM access command#define RAM_Tobj1 0x07 // To1 address in the ram#define RAM_Tamb 0x06 // Ta address in the ram#define MAXHEAT 60 // Number of cycles for heatingBYTE gethex1() {char digit;digit = getc();putc(digit);if(digit<='9')return(digit-'0');elsereturn((toupper(digit)-'A')+10);}BYTE gethex() {unsigned int8 lo,hi;hi = gethex1();lo = gethex1();if(lo==0xdd)return(hi);elsereturn( hi*16+lo );}int16 sonar_ping (int8 addr){int16 distance;int8 pom;i2c_start(); // So Sonar Pingi2c_write(addr);i2c_write(0x0);i2c_write(0x51); // 50 mereni v palcich, 51 mereni v cm, 52 v usi2c_stop();delay_ms(70);i2c_start(); // Read Reflectioni2c_write(addr);i2c_write(0x2);i2c_stop();i2c_start();i2c_write(addr+1);pom=i2c_read(1);distance=MAKE16(pom,i2c_read(0));i2c_stop();return distance;}unsigned char PEC_calculation(unsigned char pec[]) // CRC calculation{unsigned char crc[6];unsigned char BitPosition=47;unsigned char shift;unsigned char i;unsigned char j;unsigned char temp;do{crc[5]=0; /* Load CRC value 0x000000000107 */crc[4]=0;crc[3]=0;crc[2]=0;crc[1]=0x01;crc[0]=0x07;BitPosition=47; /* Set maximum bit position at 47 */shift=0;//Find first 1 in the transmited messagei=5; /* Set highest index */j=0;while((pec[i]&(0x80>>j))==0 && i>0){BitPosition--;if(j<7){j++;}else{j=0x00;i--;}}/*End of while */shift=BitPosition-8; /*Get shift value for crc value*///Shift crc valuewhile(shift){for(i=5; i<0xFF; i--){if((crc[i-1]&0x80) && (i>0)){temp=1;}else{temp=0;}crc[i]<<=1;crc[i]+=temp;}/*End of for*/shift--;}/*End of while*///Exclusive OR between pec and crcfor(i=0; i<=5; i++){pec[i] ^=crc[i];}/*End of for*/} while(BitPosition>8);/*End of do-while*/return pec[0];}/*End of PEC_calculation*/int16 ReadTemp(int8 addr, int8 select) // Read sensor RAM{unsigned char arr[6]; // Buffer for the sent bytesint8 crc; // Readed CRCint16 temp; // Readed temperaturei2c_stop();i2c_start();i2c_write(addr);i2c_write(RAM_Access|select); // Select the teperature sensor in devicei2c_start();i2c_write(addr);arr[2]=i2c_read(1); // loarr[1]=i2c_read(1); // hitemp=MAKE16(arr[1],arr[2]);crc=i2c_read(0); //crci2c_stop();arr[5]=addr;arr[4]=RAM_Access|select;arr[3]=addr;arr[0]=0;if (crc != PEC_calculation(arr)) temp=0; // Calculate and check CRCreturn temp;}int16 ReadEeprom(int8 addr, int8 select){unsigned char arr[6]; // Buffer for the sent bytesint8 crc; // Readed CRCint16 temp; // Readed temperaturei2c_stop();i2c_start();i2c_write(addr);i2c_write(EEPROM_Access|select); // Select the teperature sensor in devicei2c_start();i2c_write(addr);arr[2]=i2c_read(1); // loarr[1]=i2c_read(1); // hitemp=MAKE16(arr[1],arr[2]);crc=i2c_read(0); //crci2c_stop();arr[5]=addr;arr[4]=EEPROM_Access|select;arr[3]=addr;arr[0]=0;if (crc != PEC_calculation(arr)) temp=0; // Calculate and check CRCreturn temp;}void WriteEeprom(int8 addr, int8 select, int16 value){unsigned char arr[6]; // Buffer for the sent bytesbyte crc,hi,lo;hi=MAKE8(value,1);lo=MAKE8(value,0);arr[0]=0;arr[1]=hi;arr[2]=lo;arr[3]=EEPROM_Access|select;arr[4]=addr;arr[5]=0;crc=PEC_calculation(arr);i2c_stop();i2c_start();i2c_write(addr);i2c_write(EEPROM_Access|select);i2c_write(lo);i2c_write(hi);i2c_write(crc);i2c_stop();printf("CRC: %X \n\r",crc);}void setadresstemp(){int newaddr=0;printf("Zadej adresu (Hex):");newaddr=gethex();putc('\n');putc('\r');WriteEeprom(SA,EEPROM_Addr,0);delay_ms(8);WriteEeprom(SA,EEPROM_Addr,newaddr);delay_ms(8);}void main(){char c;unsigned int16 temp, tempa;signed int16 ta, to;byte addr, addr_new;setup_adc_ports(NO_ANALOGS);setup_adc(ADC_OFF);// setup_psp(PSP_DISABLED);setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);setup_timer_1(T1_DISABLED);setup_timer_2(T2_DISABLED, 0, 1);setup_oscillator(OSC_4MHZ|OSC_INTRC);delay_ms(100);printf("\n\r SETCIDLA - Martin Poviser 2008 \n\r");while(true){printf("k - zapsani adresy do teplotniho cidla\n\r");printf("o - precteni adresy teplotniho cidla\n\r");printf("r - precteni teploty teplotniho cidla\n\r");printf("t - precteni teploty teplotniho cidla z adresy 0\n\r");printf("s - precteni vzdalenosti ze sonaru\n\r");printf("c - zmena adresy sonaru\n\r");printf("?");c=getc();putc('\n');putc('\r');switch(c){case 'k':setadresstemp();break;case 'r':printf("Zadej adresu (Hex):");addr=gethex()<<1;putc('\n');putc('\r');tempa=ReadTemp(addr, RAM_Tamb); // Read temperatures from sensortemp=ReadTemp(addr, RAM_Tobj1);to=(signed int16)(temp*2-27315);ta=(signed int16)(tempa*2-27315);printf("-- %.2g %.2g \n\r",(float)ta/100,(float)to/100);break;case 't':while(!kbhit()){tempa=ReadTemp(0, RAM_Tamb); // Read temperatures from sensortemp=ReadTemp(0, RAM_Tobj1);to=(signed int16)(temp*2-27315);ta=(signed int16)(tempa*2-27315);printf("-- %.2g %.2g %.2g\n\r",(float)ta/100,(float)to/100, (float)(ta-to)/100);delay_ms(1100);};getc();break;case 'o':printf("Adresa: %X \n\r",ReadEeprom(SA,EEPROM_Addr));break;case 's':printf("Zadej adresu (Hex):");addr=gethex();putc('\n');putc('\r');printf("Distance [cm]: %Lu \n\r", sonar_ping(addr));break;case 'c':printf("Zadej starou adresu (Hex):");addr=gethex();putc('\n');putc('\r');printf("Zadej novou adresu (Hex):");addr_new=gethex();putc('\n');putc('\r');i2c_start();i2c_write(addr);i2c_write(0x0);i2c_write(0xA0); // Change address sequencei2c_stop();i2c_start();i2c_write(addr);i2c_write(0x0);i2c_write(0xAA); // Change address sequencei2c_stop();i2c_start();i2c_write(addr);i2c_write(0x0);i2c_write(0xA5); // Change address sequencei2c_stop();i2c_start();i2c_write(addr);i2c_write(0x0);i2c_write(addr_new); // New addressi2c_stop();break;}}}