I got this error using MikroC "Reentrancy not allowed function[Spi_Write] called in both main and interrupt threads". I used PIC16F873 and having the SPI communication at the moment.
Why do I get this problem? How will I solve this? I really have to call some functions inside the interrupt to perform some task.
before it and
void move_pot()
{
if(Pot==1)
Spi_Write(0xff);
else
Spi_Write(0x00);
SPI_CS_POT = 0;
PORTC.F0 = 1;
Spi_Write(0b01);
Spi_Write(0x82); //Set digital potentiometer to midpoint (5K)
SPI_CS_POT = 1;
}
void main()
{
init_pic();
init_timer0();
Spi_Init_Advanced(MASTER_OSC_DIV4,
DATA_SAMPLE_MIDDLE,
CLK_IDLE_LOW,
LOW_2_HIGH);
move_pot();
INTCON = 0b10011000;
do {
if(Pot==1)
Spi_Write(0xff);
else
Spi_Write(0x00);
} while(1);
}
if(Pot==1){
Spi_Write(0xff);
Pot=0;
}else if(Pot==2){
Spi_Write(0x00);
Pot=0;
}
void Interrupt()
{
if(INTCON.INTF)
{
SWITCH = W ;
PORTA.F1 = 1;
INTCON.INTF = 0;
}
else if(INTCON.RBIF)
{
if(PORTB.F5 == 0)
{
SWITCH = X;
INTCON.RBIF = 0;
}
else if(PORTB.F6 == 0)
{
SWITCH = Y;
INTCON.RBIF = 0;
}
else if(PORTB.F7 == 0)
{
SWITCH = X;
INTCON.RBIF = 0;
}
}
}
void main()
{
init_all();
do {
switch(SWITCH)
{
case X:
INTCON.GIE = 0;
//do something here
INTCON = 0b10011000;
break;
case Y:
INTCON.GIE = 0;
//do something here
INTCON = 0b10011000;
break;
case Z:
INTCON.GIE = 0;
//do something here
INTCON = 0b10011000;
break;
case W:
INTCON.GIE = 0;
PORTA.F0 = 1;
INTCON = 0b10011000;
break;
}
} while(1);
#define VOLUME_UP 1
#define VOLUME_DOWN 2
#define DIAL 3
#define DTMF_RECIEVED 4
unsigned short SWITCH = 0;
void Interrupt()
{
if(INTCON.INTF)
{
SWITCH = W ;
PORTA.F1 = 1;
INTCON.INTF = 0;
}
else if(INTCON.RBIF)
{
if(PORTB.F5 == 0)
{
SWITCH = X;
INTCON.RBIF = 0;
}
else if(PORTB.F6 == 0)
{
SWITCH = Y;
INTCON.RBIF = 0;
}
else if(PORTB.F7 == 0)
{
SWITCH = X;
INTCON.RBIF = 0;
}
}
}
void main()
{
init_all();
do {
switch(SWITCH)
{
case X:
INTCON.GIE = 0;
//do something here
INTCON = 0b10011000;
break;
case Y:
INTCON.GIE = 0;
//do something here
INTCON = 0b10011000;
break;
case Z:
INTCON.GIE = 0;
//do something here
INTCON = 0b10011000;
break;
case W:
INTCON.GIE = 0;
PORTA.F0 = 1;
INTCON = 0b10011000;
break;
}
} while(1);
#define X 1
#define Y 2
#define Z 3
#define W 4
unsigned short SWITCH = 0;
void Interrupt()
{
if(INTCON.INTF)
{
SWITCH = W ;
PORTA.F1 = 1;
INTCON.INTF = 0;
}
else if(INTCON.RBIF)
{
if(PORTB.F5 == 0)
{
SWITCH = X;
INTCON.RBIF = 0;
}
else if(PORTB.F6 == 0)
{
SWITCH = Y;
INTCON.RBIF = 0;
}
else if(PORTB.F7 == 0)
{
SWITCH = X;
INTCON.RBIF = 0;
}
}
}
void main()
{
init_all();
do {
switch(SWITCH)
{
case X:
INTCON.GIE = 0;
//do something here
INTCON = 0b10011000;
break;
case Y:
INTCON.GIE = 0;
//do something here
INTCON = 0b10011000;
break;
case Z:
INTCON.GIE = 0;
//do something here
INTCON = 0b10011000;
break;
case W:
INTCON.GIE = 0;
PORTA.F0 = 1;
INTCON = 0b10011000;
break;
}
} while(1);
if(INTCON.INTF)
{
SWITCH = W ;
PORTA.F1 = 1;
INTCON.INTF = 0;
[COLOR="Red"]INTCON.RBIE = 0; //turn off port b interrupts
INTCON.RBIF = 0; //and clear it[/COLOR]
}
else if(INTCON.RBIF)
{
if(PORTB.F5 == 0)
#define X 1
#define Y 2
#define Z 4 //now powers of 2
#define W 8 //I.E bit values
unsigned short SWITCH = 0;
unsigned char Previous;
void Interrupt()
unsigned char Edges,Pins;
{
if(INTCON.INTF)
{
SWITCH |= W;
PORTA.F1 = 1;
INTCON.INTF = 0;
}
if(INTCON.RBIF)
{
Pins=PORTB; //read the inputs
Pins=~Pins; //invert so active low
Edges=Pins^Previous; //find bits that have changed
Edges&=Pins; //and are now high
Previous=Pins; //keep copy for next time
INTCON.RBIF = 0;
if(Edges.5 == 0)
{
SWITCH |= X; //set X bit
}
if(Edges.6 == 0)
{
SWITCH |= Y;
}
if(Edges.7 == 0)
{
SWITCH |= X;
}
}
}
void main()
{
init_all();
do {
if(SWITCH & X){ //if X bit set then
//X code
SWITCH&=255-X; ///reset X bit
}
if(SWITCH & Y){
//Y code
SWITCH&=255-Y;
}
if(SWITCH & Z){
//Z code
SWITCH&=255-Z;
}
if(SWITCH & W){
//W code
PORTA.F0 = 1;
SWITCH&=255-W;
}
} while(1);
We use cookies and similar technologies for the following purposes:
Do you accept cookies and these technologies?
We use cookies and similar technologies for the following purposes:
Do you accept cookies and these technologies?