Ejemplo n.º 1
0
/** poti_init wird fuer alle konfigurierten Potis einmal aufgerufen. */
void poti_init(device_data_poti *p, eds_block_p it)
{
    setADMUX(p->config.port);
    ADCSRA = (1<<ADPS1) | (1<<ADPS2); //set ADC prescaler to 3,686MHz / 64 =  57,6kHz
    p->lastPotiValue = getADCvalue();
	p->potiTelegramCountdown = 0; //sende ein erstes Potitelegramm
}
Ejemplo n.º 2
0
/** Der poti_timer_handler liest den ADC-Wert des
 *  konfigurierten Potis und sendet diesen auf den CAN-Bus. */
inline void poti_timer_handler(device_data_poti *p, uint8_t zyklus)
{		
	if (zyklus != 10) return; // 10tel-Sekunden-Zyklus verwendet

	int16_t currentADCvalue;
	
	setADMUX(p->config.port);
	currentADCvalue = getADCvalue();	
		
	if (p->potiTelegramCountdown)
	{
		/* Abfrage, ob sich der ADC-Wert signifikant aenderte,
		 * gegenueber dem Wert im letzten Potitelegramm (Filterung): */
		if ( ( currentADCvalue > (p->lastPotiValue + POTI_VALUE_TOLERANCE) ) ||
			 ( currentADCvalue < (p->lastPotiValue - POTI_VALUE_TOLERANCE) ) )
		{
			//sign. Potiwertaenderung gegenueber dem currentADCvalue
			p->potiTelegramCountdown--;
		}
		else
		{
			//Potiwert wieder der gleiche Wert (oder zumindest in etwa)
			p->potiTelegramCountdown = POTI_TELEGRAM_COUNTDOWN_INIT;
		}
	}
	else //p->potiTelegramCountdown == 0
	{
		//Das Potitelegramm senden:
		p->lastPotiValue = currentADCvalue; //Angleich
		p->potiTelegramCountdown = POTI_TELEGRAM_COUNTDOWN_INIT;
		
		//sende das Potitelegramm: 
		canix_frame message;
	
		message.src = canix_selfaddr();
		message.dst = HCAN_MULTICAST_CONTROL;
		message.proto = HCAN_PROTO_SFP;
		message.data[0] = HCAN_SRV_HES;
		
		message.data[1] = HCAN_HES_POTI_POS_CHANGED;
		message.data[2] = p->config.gruppe;
		message.data[3] = (uint8_t)((currentADCvalue & 0xFF00) >> 8); //high value
		message.data[4] = (uint8_t)currentADCvalue; //low value
		message.size = 5;
		canix_frame_send_with_prio(&message, HCAN_PRIO_LOW);
	}
}
Ejemplo n.º 3
0
/** Der helligkeitssensor_timer_handler wird alle 1 s aufgerufen: Er liest den ADC-Wert des
 *  konfigurierten helligkeitssensors und sendet diesen auf den CAN-Bus. */
inline void helligkeitssensor_timer_handler(device_data_helligkeitssensor *p, uint8_t zyklus)
{		
	if (zyklus != 1) return; // 1s-Zyklus verwendet

	uint16_t currentADCaverage;
	
	if (p->secsUntilNextSend)
	{
		p->secsUntilNextSend--;

		// nur die letzten n Werte vorm Senden sind wichtig:
		if(p->secsUntilNextSend <= SIZE_OF_AVG)
		{
			setADMUX(p->config.port);
			addToFloatAvg(&(p->filterBrightness), getADCvalue_inverted());
		}
	}
	else
	{
		currentADCaverage = getOutputValue(&(p->filterBrightness));

		// sende das Helligkeitssensortelegramm:
		canix_frame message;
		message.src = canix_selfaddr();
		message.dst = HCAN_MULTICAST_CONTROL;
		message.proto = HCAN_PROTO_SFP;
		message.data[0] = HCAN_SRV_HES;

		message.data[1] = HCAN_HES_HELLIGKEITS_INFO; //z.B. fuer rolladenAutomat-Device
		message.data[2] = p->config.gruppe;
		message.data[3] = (uint8_t)((currentADCaverage & 0xFF00) >> 8); //high value
		message.data[4] = (uint8_t)currentADCaverage; //low value
		message.size = 5;
		canix_frame_send_with_prio(&message, HCAN_PRIO_LOW);

		p->secsUntilNextSend = (uint16_t) 60 * p->config.sendCycleMins;
	}
}