pic18f43k22 salvo RTOS

Status
Not open for further replies.

bhan1992

Member level 1
Joined
Feb 25, 2012
Messages
34
Helped
0
Reputation
0
Reaction score
0
Trophy points
1,286
Activity points
1,511
im trying to blink an led. the rate which it blink depends on the adc value. i have tested that the adc is working fine. but when i load this piece of code, the led just wont light up at all.
is there any other way of blinking the led depending on the adc value besides this rtos?
Code:
#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;
}
 

Hi there,

is there any other way of blinking the led depending on the adc value besides this rtos?
using interrupt routine..
 

Are you connecting LED in RB5, and I think you have to change the while condition in every task.....

Code C - [expand]
1
2
3
4
5
6
7
8
9
10
11
void slow_beep (void)
{
    while(1)
    {
    if( result >= 250 && result < 600 )
      {
        PORTBbits.RB5 = ~PORTBbits.RB5;
        OS_Delay(65, _slow_beep);   //0.65 seconds
      }
    }
}


And also i don think blinking LED was three different tasks....
 

Status
Not open for further replies.

Similar threads

Cookies are required to use this site. You must accept them to continue using the site. Learn more…