📄 asuro 020.c
字号:
//---these-inits-are-not-really-neccessary---//
//reset all prescalers
vResetAllTimersPrescalers();
//init timer0 counter
TCNT0=0x00;
//init timer1 counter
TCNT1=0x00;
//init timer2 counter
TCNT2=0x00;
//define next play mode
gucCurPlyMod=PLAY_MODE_SYNTHESIZER2;
//enable timer0, timer1 and timer2
SFRX(TIMSK,TOIE2_H|TOIE1_H|TOIE0_H);
//exit case
break;
case PLAY_MODE_SYNTHESIZER2:
//exit case
break;
//playing mode selected
case PLAY_MODE_KEYBOARD_PLAYING_INIT:
//disable all interrupts except switches interrupt
vDisableAllInterruptsExceptSwitchesInterrupt();
//switch left engine off
SFRX(PORTD,REV_LFT_H|FWD_LFT_H);
//switch right engine off
SFRX(PORTB,REV_RGT_H|FWD_RGT_H);
//init engines for music playing
vInitEnginesForMusicPlayingWithoutStart();
//init usart
vInitUsartRx2400B8N1UsingRxInterrupt();
//enable usart receive interrupt
SFRX(UCSRB,RXCIE_H);
//define next playing mode
gucCurPlyMod=PLAY_MODE_KEYBOARD_PLAYING;
//prepair timer2 interrupt to execute it's functions immediately on first entry
gucTm2IntCnt=NUMOF_TIMER2_KEYBOARD_INTERRUPTS-1;
//enable music playing by enabling overflow interrupts for
SFRX(TIMSK,TOIE2_H|TOIE1_H|TOIE0_H);
//exit case
break;
//playing mode selected
case PLAY_MODE_KEYBOARD_PLAYING:
//exit case
break;
//playing mode selected
case PLAY_MODE_ALL_OFF_INIT:
//disable all interrupts except switches interrupt
vDisableAllInterruptsExceptSwitchesInterrupt();
//switch left engine off
SFRX(PORTD,REV_LFT_H|FWD_LFT_H);
//switch right engine off
SFRX(PORTB,REV_RGT_H|FWD_RGT_H);
//switch all leds off
vAllLedsOff();
//set timer0 to range 3 (low range)
//SFRX(TCCR0 ,CS00_H);
//set timer1 to range 3 (low range)
//SFRX(TCCR1B,CS10_H);
//define next playing mode
gucCurPlyMod=PLAY_MODE_ALL_OFF;
//exit case
break;
//playing mode selected
case PLAY_MODE_ALL_OFF:
//exit case
break;
}//switch
}//while
//exit function
return 0;
}
//================================================================================
// DISABLE ALL INTERRUPTS EXCEPT SWITCHES INTERUPT
//================================================================================
void vDisableAllInterruptsExceptSwitchesInterrupt(void){
//disable overflow interrupts for timer/counter0,1,2
SFRX(TIMSK,TOIE2_L|TOIE1_L|TOIE0_L);
//disable usart receive interrupt
SFRX(UCSRB,RXCIE_L);
//disable ad-converter ready interrupt
SFRX(ADCSRA,ADIE_L);
//disable uart receive (else still rx data in buffer when ir-data is received)
SFRX(UCSRB,RXEN_L);
}
//================================================================================
// INIT ENGINES FOR MUSIC PLAYING WITHOUT START
//================================================================================
void vInitEnginesForMusicPlayingWithoutStart(void){
//clear timer/counter0 overflow interrupt counter
gucTm0IntCnt=0;
//clear timer/counter1 overflow interrupt counter
gucTm1IntCnt=0;
//clear timer/counter2 overflow interrupt counter
gucTm2IntCnt=0;
//init timer/counter0, used for generating tones by left engine
//vInitTimerCounter0();
//init timer/counter1, used for generating tones by right engine
//vInitTimerCounter1();
//init timer/counter2, used for tone duration and tone sequence control
//vInitTimerCounter2();
//switch left engine off
SFRX(PORTD,REV_LFT_H|FWD_LFT_H);
//switch right engine off
SFRX(PORTB,REV_RGT_H|FWD_RGT_H);
//set left engine speed-control on (full)
SFRX ( PORTB , SPD_LFT_H ) ;
//set right engine speed-control on (full)
SFRX ( PORTB , SPD_RGT_H ) ;
}
//================================================================================
// INIT MUSIC PLAYING
//================================================================================
void vInitMusicPlaying(void){
//init engines for music playing without starting
vInitEnginesForMusicPlayingWithoutStart();
//clear song current-tone index
gucSngTonIdx=0;
//prepair timer2 interrupt to execute it's functions immediately on first entry
gucTm2IntCnt=NUMOF_TIMER2_INTERRUPTS-1;
//clear any eventually pending timer/counter0,1,2 interrupt
SFRX(TIFR,TOV2_H|TOV1_H|TOV0_H);
//start music playing by enabling overflow interrupts for
// - timer/counter0 (left engine, tone1)
// - timer/counter1 (right engine, tone2)
// - timer/counter2 tone duration and tone sequence control
SFRX(TIMSK,TOIE2_H|TOIE1_H|TOIE0_H);
}
//################################################################################
// interrupt handler, timer/counter0 overflow
// enable bit: register TIMSK bit TOIE0
// #define SIG_OVERFLOW0 _VECTOR(9)
// pdf table 18, vector number decimal 10
// tone playing control is directly controlled either by interrupt enable or by gucTonIdxn variable!
//################################################################################
SIGNAL(SIG_OVERFLOW0){
//reload counter0 with predefined reload value
TCNT0=gucTm0CurRldVal;
//if left engine drives forward
if(SFRS(PORTD,REV_LFT_H)){
//make left engine drive reverse
SFRX(PORTD,REV_LFT_L|FWD_LFT_H);
}
//if left engine drives reverse
else{
//make left engine drive forward
SFRX(PORTD,REV_LFT_H|FWD_LFT_L);
}
}
//################################################################################
// interrupt handler, timer/counter1 overflow
// enable bit: register TIMSK bit TOIE1
// #define SIG_OVERFLOW1 _VECTOR(8)
// pdf table 18, vector number decimal 09
// tone playing control is directly controlled either by interrupt enable or by gucTonIdxn variable!
//################################################################################
SIGNAL(SIG_OVERFLOW1){
//reload counter1 with predefined reload value
TCNT1=gucTm1CurRldVal;
//if right engine drives forward
if(SFRS(PORTB,REV_RGT_H)){
//make right engine drive reverse
SFRX(PORTB,REV_RGT_L|FWD_RGT_H);
}
//if right engine drives reverse
else{
//make right engine drive forward
SFRX(PORTB,REV_RGT_H|FWD_RGT_L);
}
}
//================================================================================
// STOP TONE0
//================================================================================
void vStopTone0(void){
//immediately stop timer0 by disabling timer0 interrupt
SFRX(TIMSK,TOIE0_L);
//switch left engine off (because engine is always set/left to forward or reverse by interrupt handler)
SFRX(PORTD,REV_LFT_H|FWD_LFT_H);
}
//================================================================================
// START TONE0
//================================================================================
void vStartTone0(void){
//get tone-code for left engine from tone-codes list
gucTm0CurRldVal=gucMusTonLst[gucTonIdx1];
//start playing tone by left engine (by enabling timer0 interrupt)
SFRX(TIMSK,TOIE0_H);
}
//================================================================================
// STOP TONE1
//================================================================================
void vStopTone1(void){
//immediately stop timer1 by disabling timer1 interrupt
SFRX(TIMSK,TOIE1_L);
//switch right engine off (because engine is always set/left to forward or reverse by interrupt handler)
SFRX(PORTB,REV_RGT_H|FWD_RGT_H);
}
//================================================================================
// START TONE1
//================================================================================
void vStartTone1(void){
//get tone-code for right engine from tone-codes list
gucTm1CurRldVal=gucMusTonLst[gucTonIdx2];
//start playing tone by right engine (by enabling timer1 interrupt)
SFRX(TIMSK,TOIE1_H);
}
//################################################################################
// interrupt handler, timer/counter2 overflow
// enable bit: register TIMSK bit TOIE2
// #define SIG_OVERFLOW2 _VECTOR(4)
// pdf table 18, vector number decimal 05
//################################################################################
SIGNAL (SIG_OVERFLOW2){
//count interrupts tone-duration counter)
gucTm2IntCnt++;
//analyse playmode
switch(gucCurPlyMod){
//playing mode selected
case PLAY_MODE_SONG_PLAYING:
//if tone-play duration reached max (specific interrupt limit (tone-play duration) reached
if(gucTm2IntCnt==NUMOF_TIMER2_INTERRUPTS){
//clear tone-duration counter
gucTm2IntCnt=0;
//toggle all leds at random
vToggleAllLedsAtRandom();
//get next song-tone-index for left engine
gucTonIdx1=gucSg1[gucSngTonIdx];
//get next song-tone-index for right engine
gucTonIdx2=gucSg2[gucSngTonIdx];
//prepair for selecting next tone
gucSngTonIdx++;
//if no more tones need to be played
if(gucTonIdx1==255){
//define next play mode
gucNewPlyMod=PLAY_MODE_ALL_OFF_INIT;
//exit function
return;
}
//if more tones need to be played
else{
//if a silent tone must be played by the left engine
if(gucTonIdx1==99){
//stop (left engine) tone0
vStopTone0();
}//if
//if an audible tone must be played by the left engine
else{
//start (left engine) tone0
vStartTone0();
}//else
//if a silent tone must be played by the right engine
if(gucTonIdx2==99){
//stop (right engine) tone1
vStopTone1();
}//if
//if an audible tone must be played by the right engine
else{
//start (right engine) tone1
vStartTone1();
}
}//else
}//if
//end case
break;
//playing mode selected
case PLAY_MODE_SYNTHESIZER1:
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -