Bonjour a tous,
Voila j'ais realiser un programme pour pic16f628 sous MPLAB avec le compilateur HI-TECH. Ce programme permet de piloté 8 leds. Il sagit d'un chenillard dont les commandes sont choisi grâce a des caractères envoyé par le bus I2C. tous fonctionne correctement sauf que quand j'envois les commandes par le bus le pic met environ 2sec pour réagir. Ce code n'est pas du tous optimisé et j'aurais besoin d'aide. Merci
#include<pic.h>
__CONFIG(0x3f10);
char rec;
char canal1=103;
char canal2=101;
int def=0;
bit inv=0;
bit v=0;
int val=0;
int inc=0;
bit bloquer;
bit ouverture;
int canal;
static void interrupt inter()
{
if(RCIF==1)
{
CREN=0;
rec=RCREG;
CREN=1;
}
if(OERR==1)
{
CREN=0;
CREN=1;
}
if(INTF==1)
{
v=1;
def=val;
INTF=0;
}
if(bloquer==0)
{
if(ouverture==1)
{if(canal==2)
{canal2=(rec-100); bloquer==1; canal=3;}
if(canal==1)
{canal1=(rec-100); canal=2;}
}
if(rec=='a'&&bloquer==0&&ouver ture==0)
{ouverture=1; bloquer=0;}
if(rec!='a'&&ouverture==0)
{ouverture=0; bloquer=1;}}
if(rec=='z')
{ouverture=0; bloquer=0; canal=1;}
}
void tempo(int delai)
{
int t;
int t1;
for(t=0;t<59;t++)
{for(t1=0;t1<delai;t1++){}}
}
void chen()
{
PORTA=0x00;PORTB=0x00;
switch(def)
{
case 0:{RA0=1;break;}
case 1:{RA1=1;break;}
case 2:{RA2=1;break;}
case 3:{RA3=1;break;}
case 4:{RB4=1;break;}
case 5:{RB5=1;break;}
case 6:{RA6=1;break;}
default:{RA7=1;}
}
v=0;
}
void chenfond()
{
int i;
int j;
for(i=0;i<80;i++)
{
for(j=0;j<80;j++)
{if(j>i){
switch(def)
{
case 0:{RA0=1;break;}
case 1:{RA1=1;break;}
case 2:{RA2=1;break;}
case 3:{RA3=1;break;}
case 4:{RB4=1;break;}
case 5:{RB5=1;break;}
case 6:{RA6=1;break;}
default:{RA7=1;}
}
v=0;
}
if(j<=i){PORTA=0x00;PORTB=0x00 ;}}
}
}
void defil()
{
switch(def)
{
case 0:{RA0=1;RA7=0;break;}
case 1:{RA0=0;RA1=1;break;}
case 2:{RA1=0;RA2=1;break;}
case 3:{RA2=0;RA3=1;break;}
case 4:{RA3=0;RB4=1;break;}
case 5:{RB4=0;RB5=1;break;}
case 6:{RB5=0;RA6=1;break;}
default:{RA7=1;RA6=0;}
}
tempo(40);
def++;
if (def>7){def=0;}
}
void defilinv()
{
switch(def)
{
case 0:{RA0=1;RA7=0;RA1=0;break;}
case 1:{RA0=0;RA1=1;RA2=0;break;}
case 2:{RA1=0;RA2=1;RA3=0;break;}
case 3:{RA2=0;RA3=1;RB4=0;break;}
case 4:{RA3=0;RB4=1;RB5=0;break;}
case 5:{RB4=0;RB5=1;RA6=0;break;}
case 6:{RB5=0;RA6=1;RA7=0;break;}
default:{RA7=1;RA6=0;RA0=0;}
}
tempo(20);
if (inv==0){def++;}
if (inv==1){def--;}
if (def>7){inv=1;}
if (def<=0){inv=0;}
}
void fondu()
{
int i;
int j;
for(i=0;i<150;i++)
{
for(j=0;j<150;j++)
{if(j<=i){PORTA=0x00;PORTB=0x0 0;}
if(j>i){PORTA=0xFF;PORTB=0xFF; }}
}
}
void Serial_Init(void)
{
RCIE=1;
RCSTA=0b10010000;
TXSTA=0b00100110;
SPBRG=25;
}
void Serial_Putchar(unsigned char cD)
{
while(!TXIF);
TXREG=cD;
while(!TRMT);
}
void main()
{
CMCON=7;
TRISB=0xCf;
TRISA=0x30;
GIE=1;INTE=1; RCIE=1;
Serial_Init();
while(1)
{
switch(canal1)
{
case 0:{fondu(); break;}
case 1:{defil();break;}
case 2:{defilinv();break;}
case 3:{
while(v==0)
{
int b;
for(b=0;b<8;b++)
{val=b;}
}
chen();
break;
}
case 4:{
while(v==0)
{
int b;
for(b=0;b<8;b++)
{val=b;}
}
chenfond();
break;
}
case 5:{PORTA=0xFF;PORTB=0xFF;break ;}
default:{PORTA=0x00;PORTB=0x00 ;}
}
}
}
-----