⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main.c

📁 采集rgb光源的程序,并通过usb传输到电脑端
💻 C
字号:
/**** A P P L I C A T I O N   N O T E   ************************************
*
* Title			: MultiLED RGB-Calibrator (RDM responder)
* Version		: v0.5
* Last updated	: 26.01.09
* Target		: Transceiver Rev.3.01
* Clock			: 8MHz
*
* written by hendrik hoelscher, www.hoelscher-hi.de
***************************************************************************
 
 This program is distributed in the hope that it will be useful, 
 but WITHOUT ANY WARRANTY; without even the implied warranty of 
 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 

;***************************************************************************/

#include <avr/interrupt.h>
#include <avr/wdt.h>
#include "lib_rdm_in.h"

#define T_WAIT		(1500)
#define T_DELTA		(100)
#define T_MEASURE	(2000)

	
		 uint8_t  DmxBuf[5];
volatile uint8_t  SensCnt= 6;
volatile uint16_t Pulse;



static void init_system(void)
{
wdt_reset();
wdt_enable(WDTO_500MS);							//enable watchdog (Timeout= 0.5s)
wdt_reset();

DDRA   = 0xFF;
PORTA  = 0;
DDRD   = 0b11110110;							//"spare" = low outputs (color selection), transmitting
PORTD  = 0b10001110;
DDRE  |= (1<<PE0);								//green LED is output
PORTE &= ~(1<<PE0);								//green LED is on

TCCR1A = 0;
TCCR1B = (1<<CS12);								//set T1 @clk/256 freq

MCUCR  = (1<<ISC10);							//irq on logical change
GICR  |= (1<<INT1);								//enable INT1 for zc
GIFR   = (1<<INTF1);							//clear INT1 flag

init_RDM();
Flags= 0;
DmxBuf[0]= 10;
}



static void start_measure(void)
{
if (SensCnt == 6)
	{
	SensCnt= 0;
	PORTE |= (1<<PE0);								//green LED is off
	PORTA ^= (1<<PA0);	
	PORTD &= ~(1<<PD4);								//select red
	PORTD &= ~(1<<PD5);

	Sensor[0]= 0xFFFF;								//clear buffer
	Sensor[1]= 0xFFFF;
	Sensor[2]= 0xFFFF;

	TCNT1  = (0xFFFF -T_WAIT);						//load delay
	TIFR   = (1<<TOV1);								//clear flag
	TIMSK |= (1<<TOIE1);							//enable IRQ
	}
}



int main(void)
{
cli();
init_system();
sei();
for(;;)
	{
	if (Flags &(1<<EVAL_DMX))					//universe complete?
		{
		Flags &= ~(1<<EVAL_DMX);
		if ((DmxField[0] != DmxBuf[0])||(DmxField[1] != DmxBuf[1])||(DmxField[2] != DmxBuf[2]))
			{
			DmxBuf[0]= DmxField[0];
			DmxBuf[1]= DmxField[1];
			DmxBuf[2]= DmxField[2];
			start_measure();
			}
		}
	check_rdm();								//check for new RDM packets
	wdt_reset();
	}
}







// ****** ISR ********

ISR (INT1_vect)									//count sensor pulses
{
Pulse++;
}



ISR (TIMER1_OVF_vect)
{
if (SensCnt == 0)
	{
	PORTD &= ~(1<<PD4);							//select red
	PORTD &= ~(1<<PD5);
	TCNT1  = (0xFFFF -T_MEASURE);				//load delay
	SensCnt= 1;
	}
else if (SensCnt == 1)
	{
	Sensor[0]= Pulse;							//save red
	PORTD |= (1<<PD4);
	PORTD |= (1<<PD5);							//select green
	TCNT1  = (0xFFFF -T_DELTA);					//load delay
	SensCnt= 2;
	}
else if (SensCnt == 2)
	{
	TCNT1  = (0xFFFF -T_MEASURE);				//load delay
	SensCnt= 3;
	}
else if (SensCnt == 3)
	{
	Sensor[1]= Pulse;							//save green
	PORTD &= ~(1<<PD4);							//select blue
	PORTD |= (1<<PD5);
	TCNT1  = (0xFFFF -T_DELTA);					//load delay
	SensCnt= 4;
	}
else if (SensCnt == 4)
	{
	TCNT1  = (0xFFFF -T_MEASURE);				//load delay
	SensCnt= 5;
	}
else
	{
	Sensor[2]= Pulse;							//save blue
	TIMSK &= ~(1<<TOIE1);						//disable capture
	PORTE &= ~(1<<PE0);							//green LED is on									
	SensCnt= 6;
	}
Pulse= 0;
PORTA ^= (1<<PA1);
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -