示例#1
0
/*
 * 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);
}
示例#2
0
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);
}
示例#4
0
文件: main.c 项目: coneggo/microchip
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);
    }
}