#include <p18f43k22.h>
#include <adc.h>
#include <delays.h>
#include <stdlib.h>
#include <timers.h>
#include <salvo.h>
#undef OSC
int result;
void slow_beep (void);
void medium_beep (void);
void fast_beep (void);
void isr (void);
_OSLabel (_slow_beep)
_OSLabel (_medium_beep)
_OSLabel (_fast_beep)
#pragma code high_vector = 0x08
void interrupt (void)
{
_asm goto isr _endasm
}
#pragma code
#pragma interrupt isr
void slow_beep (void)
{
while(result >= 250 && result < 600)
{
PORTBbits.RB5 = ~PORTBbits.RB5;
OS_Delay(65, _slow_beep); //0.65 seconds
}
}
void medium_beep (void)
{
while(result >= 600 && result < 850)
{
PORTBbits.RB5 = ~PORTBbits.RB5;
OS_Delay(45, _medium_beep); //0.45 seconds
}
}
void fast_beep (void)
{
while(result >= 850)
{
PORTBbits.RB5 = ~PORTBbits.RB5;
OS_Delay(25, _fast_beep); //0.25 seconds
}
}
void main (void)
{
TRISB = 0;
OSCreateTask(slow_beep, OSTCBP(1), 7);
OSCreateTask(medium_beep, OSTCBP(2), 7);
OSCreateTask(fast_beep, OSTCBP(3), 7);
OpenTimer0 (TIMER_INT_ON & T0_16BIT & T0_SOURCE_INT & T0_PS_1_1);
WriteTimer0(55536);
INTCONbits.GIE = 1;
OpenADC(ADC_FOSC_32 & ADC_RIGHT_JUST & ADC_2_TAD, ADC_REF_VDD_VSS, ADC_INT_OFF );
PORTB = 1; //initialisation 0.7 second beep
Delay10KTCYx(10);
PORTB = 0;
while(1)
{
SetChanADC(ADC_CH0);
ConvertADC();
while(BusyADC());
result = ReadADC();
OSSched();
OS_Delay(10,main) //delay 0.1 second
}
CloseADC();
}
void isr (void)
{
WriteTimer0(55536);
OSTimer(); //creating 0.01 second system tick
INTCONbits.TMR0IF = 0;
}