När jag trycker på en knapp ändras det mellan olika färger och till sist startas en while loop som dimmar mellan olika färger. Allt funkar bra ända tills att jag startar while loopen, sen slutar interrupt funktionen att funka.
Säkert ett lätt fel att fixa, är rätt ny med programmering.

edit*
Så där e hela koden och jag använder en PIC16F777
Kod: Markera allt
#include <htc.h>
#define XTAL_FREQ 8MHZ
#include "delay.c"
__CONFIG(0x382A);
__CONFIG(0x3EBC);
int i = 0, j = 0, status0 = 0, status1 = 0,status2 = 0,status3 = 0;
#define red CCPR2L
#define green CCPR1L
#define blue CCPR3L
#define indikering RA0
void init_setup(void)
{
ADCON1 = 0x0F;
TRISA = 0x00;
TRISD = 0x00;
TRISB = 0x1F; //RB1 till RB4 knappar
TRISC = 0x00 ;
//Spesifikationer för PWM
CCP1CON = 0x0C; //set CCP1 as PWM
CCP2CON = 0x0C; //set CCP2 as PWM
CCP3CON = 0x0C; //set CCP3 as PWM
PR2 = 0xFF;
T2CON = 0xF8; //set prescaler to 16, postscaler to 1
red = 0x00; // nollställ PWM vid uppstart
green = 0x00; // nollställ PWM vid uppstart
blue = 0x00; // nollställ PWM vid uppstart
TMR2ON = 1; //Starta timer2
//Interrupt
GIE = 1;
RBIE = 0;
INTEDG = 0; // 0 = Interrupt on falling edge of RB0/INT pin
INT0IE = 1; // RB0/INT External Interrupt Enable bit
INT0IF = 0; // RB0/INT External Interrupt Flag bit
//indekerings lampa
indikering = 0;
}
void Delay(void)
{
DelayMs(200);
}
void puase (int antal)
{
for(j = 0; j<antal; j++)
DelayMs(5);
}
void sequence(int infade, int instop, int inred, int ingreen, int inblue)
{
//while(red != inred && green != ingreen && blue != inblue) ???
while(status3 !=1)
{
if(red - inred < 0 )
red++;
if(red - inred > 0 )
red--;
if(red - inred == 0 )
status0 = 1;
if(green - ingreen < 0)
green++;
if(green - ingreen > 0 )
green--;
if(green - ingreen == 0 )
status1 = 1;
if(blue - inblue < 0 )
blue++;
if(blue - inblue > 0 )
blue--;
if(blue - inblue == 0 )
status2 = 1;
if(status0 == 1 && status1 == 1 && status2 == 1)
{
status0 = 0;
status1 = 0;
status2 = 0;
status3 = 1;
}
puase(infade); // fade x 50 ms puase
}
status3 = 0;
indikering = 1;
puase(instop); // fade x 50 ms puase
indikering = 0;
}
void farger(void) //knapp 2
{
Delay();
INT0IF = 0; //reset interrupt flag
if( i == 0)
{
red = 255;
green = 0;
blue = 0;
i++;
}
else if( i == 1)
{
red = 0;
green = 255;
blue = 0;
i++;
}
else if( i == 2){
red = 0;
green = 0;
blue = 255;
i++;
}
else if( i == 3){
red = 0;
green = 0;
blue = 0;
i = 0;
while(INT0IF==0) // loopar till ny interrupt kommer
{
sequence(2,0,255,0,0);
sequence(2,0,255,255,0);
sequence(2,0,0,255,0);
sequence(2,0,0,255,255);
sequence(2,0,0,0,255);
sequence(2,0,255,0,255);
}
}
}
interrupt isr()
{
if(RB2 == 0) //knapp 2
farger();
}
void main()
{
init_setup();
while(1)
{
}
}