📄 main.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 + -