/* * MAIN */ int main(int argc, char** argv) { // RA1 as DO LATA = 0; ADCON1 = 0x06; TRISA1 = 0; LATA1 = 1; // I2C configuration i2c_setup(); unsigned char w; for(w=0;w<20;w++) I2C_Recv[w]=0; unsigned int temps = 25; unsigned char temp, length=0; while(1){ LATA1 = ~LATA1; Delay10KTCYx(temps); check_interruptions(); if (DataRdyI2C()==1) { temps += 25; temp = ReadI2C(); //********************* Data reception from master by slave ********************* do { while(DataRdyI2C()==0); // WAIT UNTILL THE DATA IS TRANSMITTED FROM master I2C_Recv[length++]=getcI2C(); // save byte received } while(length!=20); } } //******************** write sequence from slave ******************************* while(SSPSTATbits.S!=1); //wait untill STOP CONDITION //********************* Read the address sent by master from buffer ************** while(DataRdyI2C()==0); //WAIT UNTILL THE DATA IS TRANSMITTED FROM master temp = ReadI2C(); //********************* Slave transmission ************************************ if(SSPSTAT & 0x04) //check if master is ready for reception while(putsI2C(I2C_Send)); // send the data to master //-------------TERMINATE COMMUNICATION FROM MASTER SIDE--------------- CloseI2C(); //close I2C module while(1) { LATA1 = ~LATA1; Delay10KTCYx(100); }; //End of program return (EXIT_SUCCESS); }
void pcfLCDInit(BYTE addr) { #ifndef _WINDOWS WORD i; BYTE sync_mode=0; BYTE slew=0; // Set lcd reset pin as output // Set lcd reset pin low LCD_RESET_TRIS = 0; LCD_RESET = 0; DelayMs(500); // tW(RESL) LCD_RESET = 1; DelayMs(500); // tW(RESH) LCD_RESET = 0; DelayMs(1); // tW(RESL) LCD_RESET = 1; DelayMs(3); // tR(OP) //*************************************************** //* Lcd init commands * //*************************************************** for(i=0;i<20;i++) I2C_Recv[i]=0; addr=PCF8535_BUS_ADDRESS; //address of the device (slave) under communication CloseI2C(); //close i2c if was operating earlier //---INITIALISE THE I2C MODULE FOR MASTER MODE WITH 100KHz --- sync_mode = MASTER; slew = SLEW_OFF; OpenI2C(sync_mode,slew); SSPADD=0x0A; //400kHz Baud clock(9) @8MHz //check for bus idle condition in multi master communication IdleI2C(); //---START I2C--- //StartI2C(); LCDSendCommand(addr,(BYTE*)INIT_SEQUENCE,sizeof(INIT_SEQUENCE)); #else UNUSED(addr); // заглушка #endif }
char output_logic(void) { char error = 0; switch (present_state) { case STATE_Idle: PORTC = 0b00000111; // Reset all Flip-Flops at PORTB if (postscalerflag30s == 1) { postscalerflag30s =0; Trigger = 1; } break; case STATE_Setup_Pot: T3CON = 0; ADON = 0; CloseI2C(); InitializeTimer3(); //interrupt every second InitADC(); postscaler = 0; postscalerflag = 0; SendStringUSART("Analog Mode Acquiring"); PORTC = 0b00000101; // Reset all Flip-Flops at PORTB SelectChannelADC(0);//select AN0 break; case STATE_Pot: if (postscalerflag == 1) { Value_AN0=0; Value_AN0 = GetSampleADC(); sprintf(CharTX, "DATA ANALOG :Humedad TIERRA = %d",Value_AN0); SendStringUSART(CharTX); postscalerflag = 0; Trigger =1; } break; case STATE_Stop_Pot: break; case STATE_Setup_TEMP: SendStringUSART("I2C Mode Acquiring"); PORTC = 0b00000100; // Reset all Flip-Flops at PORTB SelectChannelADC(1);//select AN1 break; case STATE_TEMP: if (postscalerflag == 1) { Value_AN1=0; Value_AN1 = GetSampleADC(); ////Value_temp = (float) ((((Value_AN1 / 1023.0) * Vdd - Vo)) / sensibilidad); /// Sensor Placa XLP Value_temp = (float)(log(10000.0 * ((1024.0 / Value_AN1 - 1)))); Value_temp = (float)(1 / (0.001129148 + (0.000234125 + (0.0000000876741 * Value_temp * Value_temp )) * Value_temp )); Value_temp = (float)(Value_temp - 273.15); // Convert Kelvin to Celcius //Temp = (Temp * 9.0)/ 5.0 + 32.0; // Convert Celcius to Fahrenheit if(Value_pot < 50){ PORTBbits.RB5 =1; } else{ PORTBbits.RB5 =0; } sprintf(CharTX, "DATA ANALOG :Temperature = %.1f C", Value_temp); SendStringUSART(CharTX); postscalerflag = 0; Trigger = 1; } break; case STATE_Stop_TEMP: break; case STATE_Setup_ONEWIRE: PORTC = 0b00000111; // Reset all Flip-Flops at PORTB TRISBbits.TRISB4 = 0; PORTBbits.RB4 = 1; TMR2IE = 1; // Enable Timer2 interrupt T2CON = 0; // Prescaler 1:1, and Timer2 is off initially TMR2IF = 0; // Clear TMR INT Flag bit TMR2 = 0; T2CONbits.T2CKPS = 0b01; break; case STATE_ONEWIRE: GetDataSensorDHT22(); if (CheckSum == ((RH_Byte1 + RH_Byte2 + T_Byte1 + T_Byte2) & 0xFF)) { if (sign) { sprintf(CharTX, "DATA DHT22 :Temperature = -%.1f C", Value_tempdht22); SendStringUSART(CharTX); } else { sprintf(CharTX, "DATA DHT22 :Temperature = %.1f C", Value_tempdht22); SendStringUSART(CharTX); } sprintf(CharTX, "DATA DHT22 :Humidity = %.1f %%", Value_rhdht22); SendStringUSART(CharTX); } else { SendStringUSART("Checksum Error! Trying Again ... "); } Trigger = 1; break; case STATE_Stop_ONEWIRE: break; case STATE_Setup_I2C: Open_I2C1(); break; case STATE_I2C: if (postscalerflag == 1) { // I2C_dev = WriteDEVICE_I2C(AddressByteMCP, 0x07); // I2C_manu = WriteMANU_I2C(AddressByteMCP, 0x06); I2C_TemFormula = ReadByte_I2C(AddressByteMCP, 0x05); //temperature sprintf(CharTX2, "DATA I2C :Temperature = %.1f C", I2C_TemFormula); SendStringUSART(CharTX2); postscalerflag = 0; Trigger = 1; } break; case STATE_Stop_I2C: SendStringUSART("LDR mode ON"); break; case STATE_Setup_LDR: //InitializeTimer3(); //interrupt every second SelectChannelADC(9);//select AN9 break; case STATE_LDR: if (postscalerflag == 1) { Value_AN9 = 0; Value_AN9 = GetSampleADC(); sprintf(CharTX, "DATA LDR :Valor Analog = %d",Value_AN9); SendStringUSART(CharTX); postscalerflag = 0; Trigger = 1; } break; case STATE_Stop_LDR: SendStringUSART("Sleep 8s"); CloseI2C(); T2CON = 0; StopADC(); SendStringUSART("Idle mode ON"); break; default: error = 1; } return (error); }
void main(void) { // Configuracao das portas com LEDs TRISCbits.TRISC0=0; // LED Amarelo para simples sinalizacao TRISCbits.TRISC1=0; // LED Verde para simples sinalizacao TRISCbits.TRISC2=0; // LED Vermelho para simples sinalizacao // Configuracao do pino TX da porta serial EUSART / para RS232 TRISCbits.TRISC6=1; // TX da EUSART // O programa ira informar na porta serial o status // e logs de funcionamento da coleta de dados I2C // agora a CHAMADA para configuracao GLOBAL da PIC configuracao_PIC(); // Preparacao para configuracao do modulo MSSP I2C (com Errata aplicada) /* 17. Module: MSSP (ERRATA for PIC18F4550 and PIC18F2525, etc) * ================ * * It has been observed that following a Power-on Reset, I2C mode may not * initialize properly by just configuring the SCL and SDA pins as either * inputs or outputs. This has only been seen in a few unique system * environments. A test of a statistically significant sample of pre- * production systems, across the voltage and current range of the * application's power supply, should indicate if a system is * susceptible to this issue. * * Work around = Before configuring the module for I2C operation: * 1. Configure the SCL and SDA pins as outputs by clearing * their corresponding TRIS bits. * 2. Force SCL and SDA low by clearing the corresponding LAT bits. * 3. While keeping the LAT bits clear, configure SCL and SDA as * inputs by setting their TRIS bits. * * Once this is done, use the SSPCON1 and SSPCON2 registers to * configure the proper I2C mode as before. */ TRISCbits.TRISC3=0; // SCL do I2C colocado como saida por causa de bug* TRISCbits.TRISC4=0; // SDA do I2C colocado como saida por causa de bug* LATC3=0; // bug* pede que zere-se o LAT das portas SCL e SDA LATC4=0; // durante inicializacao do I2C para evitar flutuacoes // eletricas que ficariam nas portas antes de liga-las Delay10KTCYx(10); // simples pausa para troca de estado na SDA e SCL TRISCbits.TRISC3=1; // SCL do I2C, agora corretamente como saida TRISCbits.TRISC4=1; // SDA do I2C, agora corretamente como saida // here ends "errata workaround" // entao a CHAMADA para diversas configuracoes referentes ao I2C (MSSP) configuracao_I2C(); // e a inicializacao da porta serial EUSART configuracao_EUSART(); while(BusyUSART()); putrsUSART("\n\r_INIT SERIAL.\n\r"); /************************* * * INICIO DO PROGRAMA * *************************/ LED_AMAR=0; LED_VERM=1; LED_VERD=0; // Inicializacao do MSSP I2C CloseI2C(); // simplesmente fechando qualquer possibilidade de I2C anterior // comando nao necessario no boot da PIC //macro = #define CloseI2C() SSPCON1 &=0xDF while(BusyUSART()); putrsUSART("SSPAD="); putsUSART( itoa(NULL,SSPADD,10) ); putrsUSART(" (hex=0x"); putrsUSART( itoa(NULL,SSPADD,16) ); putrsUSART("); Abrindo MSSP I2C (Master,Slew_off)\n\r"); OpenI2C(MASTER,SLEW_OFF); // configuracao implicita da SSPCON1 e SSPSTAT while (1) { testaColisao(); getDS1307(); //testaColisao(); getTemperaturaHumidade(); pausa(10); } }