コード例 #1
0
ファイル: onewire.c プロジェクト: MORA99/Stokerbot
void OW_selectPort(unsigned char port)
{
	switch(port)
	{
		case 1:
		ow_set_bus(&PIND,&PORTD,&DDRD,PD4);
		break;
		case 2:
		ow_set_bus(&PIND,&PORTD,&DDRD,PD5);
		break;
		case 3:
		ow_set_bus(&PIND,&PORTD,&DDRD,PD6);
		break;
	}
}
コード例 #2
0
ファイル: slave_main.c プロジェクト: icke2063/I2C_IO_BOARD
void set1WirePin(struct IO_pin *vpin, uint8_t power_mode) {
    uint8_t port_num = 0;
    uint8_t pin_num = 0;
    uint8_t eeprom_virt_data_addr = 0;

#ifndef OW_ONE_BUS
    //set current pin to current used 1 wire bus
    ow_set_bus(vpin->PPIN, vpin->PPORT, vpin->PDDR, vpin->pin);
#endif


    for (uint8_t vpin_num = 0; vpin_num < COUNT_IO_PINS; vpin_num++) {
        port_num = vpin_num/8;
        pin_num = vpin_num%8;
        eeprom_virt_data_addr = VIRTUAL_DATA_START + (port_num * (VIRTUAL_PORT_PINCOUNT * VIRTUAL_DATA_LENGTH)) + (pin_num * VIRTUAL_DATA_LENGTH);


        if(&io_pins[port_num].pins[pin_num] == vpin) {
            I2C_MAIN_DEBUG("Found OW PIN[0x%x;0x%x]\r\n", port_num, pin_num);
            //reset data
            txbuffer[eeprom_virt_data_addr] = 0;
            txbuffer[eeprom_virt_data_addr + 1] = 0xFF;
            txbuffer[eeprom_virt_data_addr + 2] = 0;
            txbuffer[eeprom_virt_data_addr + 3] = 0;

            break;
        }
    }

    DS18X20_start_meas( power_mode, NULL );
}
コード例 #3
0
ファイル: slave_main.c プロジェクト: icke2063/I2C_IO_BOARD
void read1WirePin(struct IO_pin *vpin, uint8_t power_mode) {
    uint8_t port_num = 0;
    uint8_t pin_num = 0;
    uint8_t ram_virt_data_addr = 0;


    uint16_t result;
    uint8_t subzero, cel, cel_frac_bits;
    uint8_t *tempID = 0;



    for (uint8_t vpin_num = 0; vpin_num < COUNT_IO_PINS; vpin_num++) {
        port_num = vpin_num/8;
        pin_num = vpin_num%8;
        ram_virt_data_addr = VIRTUAL_DATA_START + (port_num * (VIRTUAL_PORT_PINCOUNT * VIRTUAL_DATA_LENGTH)) + (pin_num * VIRTUAL_DATA_LENGTH);


        if(&io_pins[port_num].pins[pin_num] == vpin) { //try to find virtual pin by given pointer
            I2C_MAIN_DEBUG("Found OW PIN[0x%x;0x%x]\r\n", port_num, pin_num);

            tempID = &rxbuffer[ram_virt_data_addr];	//get 1 wire rom code pointer


#ifndef OW_ONE_BUS
            //set current pin to current used 1 wire bus
            ow_set_bus(vpin->PPIN, vpin->PPORT, vpin->PDDR, vpin->pin);
#endif

            if ( ss%10 == 5 ) {
                I2C_MAIN_DEBUG("st OW\r\n");
                DS18X20_start_meas( power_mode, NULL );
            }



            if (ss % 10 == 8) {

                I2C_MAIN_DEBUG("rd OW\r\n");
                txbuffer[ram_virt_data_addr]++;	//raise seqnr

                if (DS18X20_read_meas(tempID, &subzero, &cel, &cel_frac_bits) == DS18X20_OK) {

                    result = DS18X20_temp_to_decicel(subzero, cel, cel_frac_bits);

                    // Minuswerte:
                    if (subzero)
                        result *= (-1);

                    I2C_MAIN_DEBUG("T:%i\r\n", result);
                    txbuffer[ram_virt_data_addr + 1] = 0;	//set data ok

                    txbuffer[ram_virt_data_addr + 2] = result >> 8;		//high byte
                    txbuffer[ram_virt_data_addr + 3] = result & 0xFF;	//low byte


                } else {
コード例 #4
0
ファイル: onewire.c プロジェクト: AntmanLFE/hetnet_avr-uip
void OW_selectPort(unsigned char port) 
{
	switch(port)
	{
// hack in to work
#ifdef PD4
		case 1:
			ow_set_bus(&PIND,&PORTD,&DDRD,PD4);
			break;
		case 2:
			ow_set_bus(&PIND,&PORTD,&DDRD,PD5);
			break;
		case 3:
			ow_set_bus(&PIND,&PORTD,&DDRD,PD6);
			break;
#else
		case 1:
			ow_set_bus(&PIND,&PORTD,&DDRD,PORTD4);
			break;
		case 2:
			ow_set_bus(&PIND,&PORTD,&DDRD,PORTD5);
			break;
		case 3:
			ow_set_bus(&PIND,&PORTD,&DDRD,PORTD6);
			break;

#endif
		//SBNG S3 L has 5busses
	}
}
コード例 #5
0
ファイル: hw.c プロジェクト: simonfojtu/room_thermostat
void hw_init()
{
	/* Status LED */
	DDRB |= (1<<PB1);

	/* Init onewire */
#ifndef OW_ONE_BUS
	ow_set_bus(&PINB,&PORTB,&DDRB,PB0);
#endif

	/* Init controller */
	ctrl_init();
}
コード例 #6
0
void init_temperature(void)
{
    nTempSensors = 0;

    uint8_t bus;
    for( bus = 0; bus < N_1W_BUS; bus++ )
    {
#ifndef OW_ONE_BUS
        ow_set_bus(&PINB,&PORTB,&DDRB,PB0+bus);
#endif
        //uint8_t sc =
        search_sensors(bus);
    }
}
コード例 #7
0
static void request_temperature_measurement(void)
{
    uint8_t bus;

    for( bus = 0; bus < N_1W_BUS; bus++ )
    {
#ifndef OW_ONE_BUS
        ow_set_bus(&PINB,&PORTB,&DDRB,PB0+bus);
#endif
        // if( DS18X20_start_meas( DS18X20_POWER_PARASITE, NULL ) != DS18X20_OK)
        if( DS18X20_start_meas( DS18X20_POWER_EXTERN, NULL ) != DS18X20_OK)
        {
            // Error starting temp mesaure.
            REPORT_ERROR(ERR_FLAG_1WIRE_START_FAULT);
            //ow_error_cnt++;
            //ow_bus_error_cnt[bus];
            count_1w_bus_error( bus );
            //led1_timed( 200 );
        }
    }
}
コード例 #8
0
void read_temperature_data(void)
{
    uint8_t i;

    for ( i = 0; i < nTempSensors; i++ )
    {
        uint16_t out;

#ifndef OW_ONE_BUS
        ow_set_bus(&PINB,&PORTB,&DDRB,PB0+gTempSensorBus[i]);
#endif

        if ( DS18X20_read_meas_word(&gTempSensorIDs[i][0], &out) != DS18X20_OK )
        {
            REPORT_ERROR(ERR_FLAG_1WIRE_READ_FAULT);
            //ow_error_cnt++;
            //ow_bus_error_cnt[i]++;
            count_1w_bus_error( i );
            continue;
        }
        //led2_timed( 15 );
        currTemperature[i] = out;
    }
}
コード例 #9
0
ファイル: main.c プロジェクト: Andy1978/Brautomat
int main( void )
{
    uint8_t nSensors, i;
    int16_t decicelsius;
    uint8_t error;

    uart_init((UART_BAUD_SELECT((BAUD),F_CPU)));

#ifndef OW_ONE_BUS
    ow_set_bus(&PINA,&PORTA,&DDRA,PA6);
#endif

    sei();

    uart_puts_P( NEWLINESTR "DS18X20 1-Wire-Reader Demo by Martin Thomas" NEWLINESTR );
    uart_puts_P(            "-------------------------------------------" );

    nSensors = search_sensors();
    uart_put_int( (int)nSensors );
    uart_puts_P( " DS18X20 Sensor(s) available:" NEWLINESTR );

#if DS18X20_VERBOSE
    for (i = 0; i < nSensors; i++ ) {
        uart_puts_P("# in Bus :");
        uart_put_int( (int)i + 1);
        uart_puts_P(" : ");
        DS18X20_show_id_uart( &gSensorIDs[i][0], OW_ROMCODE_SIZE );
        uart_puts_P( NEWLINESTR );
    }
#endif

    for ( i = 0; i < nSensors; i++ ) {
        uart_puts_P( "Sensor# " );
        uart_put_int( (int)i+1 );
        uart_puts_P( " is a " );
        if ( gSensorIDs[i][0] == DS18S20_FAMILY_CODE ) {
            uart_puts_P( "DS18S20/DS1820" );
        } else if ( gSensorIDs[i][0] == DS1822_FAMILY_CODE ) {
            uart_puts_P( "DS1822" );
        }
        else {
            uart_puts_P( "DS18B20" );
        }
        uart_puts_P( " which is " );
        if ( DS18X20_get_power_status( &gSensorIDs[i][0] ) == DS18X20_POWER_PARASITE ) {
            uart_puts_P( "parasite" );
        } else {
            uart_puts_P( "externally" );
        }
        uart_puts_P( " powered" NEWLINESTR );
    }

#if DS18X20_EEPROMSUPPORT
    if ( nSensors > 0 ) {
        eeprom_test();
    }
#endif

    if ( nSensors == 1 ) {
        uart_puts_P( NEWLINESTR "There is only one sensor "
                     "-> Demo of \"DS18X20_read_decicelsius_single\":" NEWLINESTR );
        i = gSensorIDs[0][0]; // family-code for conversion-routine
        DS18X20_start_meas( DS18X20_POWER_PARASITE, NULL );
        _delay_ms( DS18B20_TCONV_12BIT );
        DS18X20_read_decicelsius_single( i, &decicelsius );
        uart_put_temp( decicelsius );
        uart_puts_P( NEWLINESTR );
    }


    for(;;) {   // main loop

        error = 0;

        if ( nSensors == 0 ) {
            error++;
        }

        uart_puts_P( NEWLINESTR "Convert_T and Read Sensor by Sensor (reverse order)" NEWLINESTR );
        for ( i = nSensors; i > 0; i-- ) {
            if ( DS18X20_start_meas( DS18X20_POWER_PARASITE,
                                     &gSensorIDs[i-1][0] ) == DS18X20_OK ) {
                _delay_ms( DS18B20_TCONV_12BIT );
                uart_puts_P( "Sensor# " );
                uart_put_int( (int) i );
                uart_puts_P(" = ");
                if ( DS18X20_read_decicelsius( &gSensorIDs[i-1][0], &decicelsius)
                        == DS18X20_OK ) {
                    uart_put_temp( decicelsius );
                } else {
                    uart_puts_P( "CRC Error (lost connection?)" );
                    error++;
                }
                uart_puts_P( NEWLINESTR );
            }
            else {
                uart_puts_P( "Start meas. failed (short circuit?)" );
                error++;
            }
        }

        uart_puts_P( NEWLINESTR "Convert_T for all Sensors and Read Sensor by Sensor" NEWLINESTR );
        if ( DS18X20_start_meas( DS18X20_POWER_PARASITE, NULL )
                == DS18X20_OK) {
            _delay_ms( DS18B20_TCONV_12BIT );
            for ( i = 0; i < nSensors; i++ ) {
                uart_puts_P( "Sensor# " );
                uart_put_int( (int)i + 1 );
                uart_puts_P(" = ");
                if ( DS18X20_read_decicelsius( &gSensorIDs[i][0], &decicelsius )
                        == DS18X20_OK ) {
                    uart_put_temp( decicelsius );
                }
                else {
                    uart_puts_P( "CRC Error (lost connection?)" );
                    error++;
                }
                uart_puts_P( NEWLINESTR );
            }
#if DS18X20_MAX_RESOLUTION
            int32_t temp_eminus4;
            for ( i = 0; i < nSensors; i++ ) {
                uart_puts_P( "Sensor# " );
                uart_put_int( i+1 );
                uart_puts_P(" = ");
                if ( DS18X20_read_maxres( &gSensorIDs[i][0], &temp_eminus4 )
                        == DS18X20_OK ) {
                    uart_put_temp_maxres( temp_eminus4 );
                }
                else {
                    uart_puts_P( "CRC Error (lost connection?)" );


                    error++;
                }
                uart_puts_P( NEWLINESTR );
            }
#endif
        }
        else {
            uart_puts_P( "Start meas. failed (short circuit?)" );
            error++;
        }


#if DS18X20_VERBOSE
        // all devices:
        uart_puts_P( NEWLINESTR "Verbose output" NEWLINESTR );
        DS18X20_start_meas( DS18X20_POWER_PARASITE, NULL );
        _delay_ms( DS18B20_TCONV_12BIT );
        DS18X20_read_meas_all_verbose();
#endif

        if ( error ) {
            uart_puts_P( "*** problems - rescanning bus ..." );
            nSensors = search_sensors();
            uart_put_int( (int) nSensors );
            uart_puts_P( " DS18X20 Sensor(s) available" NEWLINESTR );
            error = 0;
        }

        _delay_ms(3000);
    }
}
コード例 #10
0
ファイル: main.c プロジェクト: peterzos/AVR_projects
int main( void )
{
	uint8_t i=0;
	int16_t decicelsius;
	uint8_t error;
	uint8_t delayCounter=0;

	hw_init();
	uart_init((UART_BAUD_SELECT((BAUD),F_CPU)));
	memset(&sensor_fw, 0, sizeof(_sensor_data));


	/* init 485 write */
	   DDRB  |= 0b0000001; //1 = output, 0 = input
	  //PORTB |=  0b00000001; //Enable pin 5 internal pullup
	   PORTB &=   0b11111110; //Enable pin 5 internal pullup read
	   //PORTB |=  0b00000001; //Enable pin 5 internal pullup 485 write


	   led_g_on();
	   _delay_ms(1000);
	   led_y_on();
	   _delay_ms(1000);
	   led_r_on();
	   _delay_ms(1000);
	   led_r_off();
	   _delay_ms(1000);
	   led_y_off();
	   _delay_ms(1000);
	   led_g_off();

#ifndef OW_ONE_BUS
	ow_set_bus(&PIND,&PORTD,&DDRD,PD6);
#endif

	led_g_on();
	search_bus();
	led_g_off();

	sei();

	sensor_fw.fw_state = FW_STATE_SENSOR_START_MEAS;

	for(;;)
	{   // main loop

		switch (sensor_fw.fw_state)
		{
		case FW_STATE_SENSOR_SEARCH:
			led_g_on();
			search_bus();
			led_g_off();
			uart_puts_P("FW_STATE_SENSOR_SEARCH? =0\n");
			sensor_fw.fw_state = FW_STATE_SENSOR_START_MEAS;
			break;
		case FW_STATE_SENSOR_START_MEAS:
			if ( sensor_fw.sensor_num == 0 )
			{
				sensor_fw.fw_state = FW_STATE_SENSOR_SEARCH;
				uart_puts_P("error sensor num =0\n");
				break;
			}
			if ( DS18X20_start_meas( DS18X20_POWER_PARASITE, NULL )	== DS18X20_OK)
			{
				sensor_fw.fw_state = FW_STATE_SENSOR_DELAY_750ms;
				//reset_timeout();
			}
			else
			{
				sensor_fw.fw_state = FW_STATE_SENSOR_SEARCH;
				uart_puts_P("error start mes faul =0\n");
			}
			break;

		case FW_STATE_SENSOR_DELAY_750ms:
			//if (TCNT1 > 5400)	//750 ms
			_delay_ms( DS18B20_TCONV_12BIT );
			{
				sensor_fw.fw_state = FW_STATE_SENSOR_READ_I;
				i = 0;
			}
			break;

		case FW_STATE_SENSOR_READ_I:
			if ( DS18X20_read_decicelsius(&sensor_fw.sensors[i].id[0], &decicelsius ) == DS18X20_OK )
			{
				sensor_fw.sensors[i].temp = decicelsius;

				uart_puts_P( "Sensor# " );
				uart_put_int( (int)i + 1 );
				uart_puts_P(" = ");
				uart_put_temp( decicelsius );
				uart_puts_P( NEWLINESTR );
			}
			else
			{
				//uart_puts_P( "CRC Error (lost connection?)" );
				sensor_fw.fw_state = FW_STATE_SENSOR_SEARCH;
				uart_puts_P("error lost connection? =0\n");
				break;
			}
			i++;
			if (i >= sensor_fw.sensor_num)
			{
				sensor_fw.fw_state = FW_STATE_SENSOR_DELAY_5s;
				delayCounter = 0;
				//reset_timeout();
			}
			//uart_puts_P( NEWLINESTR );
			break;

		case FW_STATE_SENSOR_DELAY_5s:
			//if (TCNT1 > (5 * TICKS_PER_SEC))	/*5s*/
			_delay_ms( 1000 );
			{
				if(delayCounter > 5)
					sensor_fw.fw_state = FW_STATE_SENSOR_START_MEAS;
				delayCounter++;
			}
			break;

		case FW_STATE_READ_COMM:
			{
				//uart_puts_P( "Communication cmd rx\n" );
				switch(sensor_fw.comm.rxbuff[2])
				{
				case 0x01:
					sensor_fw.comm.txbuff[0] = 0x7E;
					sensor_fw.comm.txbuff[1] = 0x01;	// dev_id
					sensor_fw.comm.txbuff[2] = 0x02;	// len
					sensor_fw.comm.txbuff[3] = 0x00;	// len
					sensor_fw.comm.txbuff[4] = 0xBB;	// data
					sensor_fw.comm.txbuff[5] = 0xBB;	// data

					sensor_fw.comm.txbuff[6] = 0x00;	// crc
					sensor_fw.comm.txbuff[7] = 0x00;	// crc


					uart_putData(sensor_fw.comm.txbuff,8);
					break;
				}

				sensor_fw.comm.rxlen = 0;
				sensor_fw.comm.valid_cmd = 0;
				sensor_fw.fw_state = FW_STATE_SENSOR_START_MEAS;
			}
			break;
		}

		if(sensor_fw.comm.valid_cmd)
		{
			sensor_fw.fw_state = FW_STATE_READ_COMM;
		}

		//_delay_ms(3000);
	}
}
コード例 #11
0
ファイル: main.c プロジェクト: turboaffe/watercooling
void handle_input(char* input)
{

    if (state == START)
    {
        if (strcmp("set fan\r", input) == 0)
        {
            print_usb("enter fan speed, 0...40 \n\r");

            /* advance state machine */
            state = SET_FAN;

        }
        else if (strcmp("set pump\r", input) == 0)
        {
            print_usb("enter pump speed, 0...200  \n\r");

            /* advance state machine */
            state = SET_PUMP;
        }
        else if (strcmp("set led\r", input) == 0)
        {
            print_usb("enter led brightness, 0...255  \n\r");

            /* advance state machine */
            state = SET_LED;
        }
        else if (strcmp("read temp\r", input) == 0)
        {
            print_usb("reading temp...  \n\r");

            /* advance state machine */
            state = READ_TEMP;
        }
        else
        {
            /* didnt understand string */
            print_usb("did not understand command \n\r");

            /* dont change state */
            state = START;
        }
    }
    else if (state == SET_LED)
    {
        static uint16_t pwm;
        char *garbage = NULL;
        pwm = strtol(input, &garbage, 0);
        OCR4A = pwm;

        print_usb("led set. \n\r");

        /* go back to start */
        state = START;
    }
    else if (state == SET_FAN)
    {
        static uint16_t pwm;
        char *garbage = NULL;
        pwm = strtol(input, &garbage, 0);
        OCR3A = pwm;

        print_usb("fan set. \n\r");

        /* go back to start */
        state = START;
    }
    else if (state == SET_PUMP)
    {
        static uint16_t pwm;
        char *garbage = NULL;
        pwm = strtol(input, &garbage, 0);
        OCR4B = pwm;

        print_usb("pump set. \n\r");

        /* go back to start */
        state = START;
    }
    else if (state == READ_TEMP)
    {
        uint8_t nSensors;

        char maxres_buffer[10];

        ow_set_bus(&PIND, &PORTD, &DDRD, PD4);

        ow_reset();

        /* search for temperature sensors */
        nSensors = search_sensors();

        /* classify sensors */
        classify_sensors(nSensors);

        /* measure temperature */
        measure_temp(nSensors, temp_eminus4);

        DS18X20_format_from_maxres(temp_eminus4[0], maxres_buffer, 10);

        print_usb("\n\r ");
        print_usb("temp max res 1: ");
        print_usb(maxres_buffer);
        print_usb("\n\r ");

        DS18X20_format_from_maxres(temp_eminus4[1], maxres_buffer, 10);

        print_usb("temp max res 2: ");
        print_usb(maxres_buffer);
        print_usb("\n\r ");

        /* go back to start */
        state = START;

    }
    else
    {
        CDC_Device_SendString(&USB_Interface, "went into unknown state!? \n\r");

        state = START;

    }

}