|
|
View previous topic :: View next topic |
Author |
Message |
neo19
Joined: 14 Aug 2012 Posts: 30 Location: France
|
PIC18F4550 and INT_EXT2(RB2) |
Posted: Mon May 19, 2014 6:06 am |
|
|
Hello,
I'm working on PIC18F4550 with PCW Ver 4.134
I would like to use RB2 as an external interrupt wich I detect the edge Low to high or high to low.
My software is doing some voltage and current measurements, generates fault and warning and commands
This code is working well without interrupt but the timing is not good. Normal!
If I use the interrupt INT_EXT2, it's very strange because if I power my board with RB2=0, it's OK.
But If I power my board with RB2=1, it's like BIAS_ON() was executed an half: Only one command is ON on the 6 commands. After if RB2 goes LOW and after high, it's OK.
Does someone have an idea to explain that and to help me?
Thanks,
Fabrice
main:
Code: |
#include <P405-R04.h>
#include <usb_cdc.h>
#include <string.h>
float M_I[7]; // 6 mesures de courant 0 à 4 IMOS1 à 5; 5: ASGA
float M_V[8]; // 0 à 4 : VccMOS; 5:VccASGA; 6:+10V; 7:temp
int16 REF_I[7]; // 6 consignes de courant 0 à 4 IMOS1 à 5; 5: ASGA
int16 L_I[7]; // 6 niveaux de defauts de courant 0 à 4 IMOS1 à 5; 5: ASGA
int16 O_I[7]; // 6 Offset de courant 0 à 4 IMOS1 à 5; 5: ASGA
int16 LV_MOS=0,LV_ASGA=0; // level alim MOS, Alim ASGA
int16 LV_TEMP=0; // level alim MOS, Alim ASGA
byte EnTrans_Shunt=0; // ASGA seul b0=shunt 0=0.1R 1=0.05R, b1=M1, b2=M2, b3=M3, b4=M4, b5=1, b6=M5, b7=ASGA 1=ENABLE
byte STATUS1=0b00100000; // valeur 32 par defaut : caractere ASCII de 32 à 255. On evite les caracteres speciaux
byte STATUS2=0b00100000;
byte STATUS3=0b00100000;
byte nb_trans_actif=0;
byte sec=0;
short val_sec=0;
#define INTS_PER_MIN 76 // (20000000/(4*256*256))
byte int_count; // Number of interrupts left before a second has elapsed
short clignote=0;
#define size_COM 25
char buffer_COM[size_COM];
#define size_adr 5
byte adr[size_adr];
#define size_ID 25
byte ID[size_ID];
byte pointeur_COM=0;
#include "subfunc.c"
#int_rtcc // This function is called every time
void clock_isr()
{ // the RTCC (timer0) overflows (255->0).
set_rtcc(65279);
if(--int_count<=(INTS_PER_MIN/2))
clignote=1;
else
clignote=0;
if(int_count==0)
int_count=INTS_PER_MIN;
}
/*
#INT_EXT2
void ext2_isr()
{
disable_interrupts(INT_EXT2);
if(input(TRIG))
{
bias_ON();
bit_set(status3,0); // STATUS TRIG =1
ext_int_edge(2,H_TO_L);
}
else
{
All_bias_OFF(); // Force toutes les regulations à 0
bit_clear(status3,0); // STATUS TRIG =0
ext_int_edge(2,L_TO_H);
}
enable_interrupts(INT_EXT2);
clear_interrupt(INT_EXT2);
}*/
void main()
{
setup_adc_ports(AN0_TO_AN6|VSS_VREF); //VREF=4.096V. Attention à la mesure de AN0 à A11.
setup_adc(ADC_CLOCK_INTERNAL);
setup_psp(PSP_DISABLED);
setup_wdt(WDT_OFF);
setup_timer_0(RTCC_INTERNAL);
setup_timer_1(T1_DISABLED);
setup_timer_2(T2_DISABLED,0,1);
setup_timer_3(T3_DISABLED|T3_DIV_BY_1);
setup_comparator(NC_NC_NC_NC);
setup_vref(FALSE);
usb_init();
init_LED(); // Test LED ON puis OFF 100ms
All_bias_OFF(); // Force toutes les regulations à 0A
init_var(); // Recuperation données EEPROM
init_BUFF(); // init buffer RS232/USB
init_CNA();
int_count=INTS_PER_MIN; // Timers pour clignotement
set_rtcc(65279);
setup_counters( RTCC_INTERNAL, RTCC_DIV_256);
enable_interrupts(INT_RTCC);
/* clear_interrupt(INT_EXT2);
if(input(TRIG))
{
bias_ON();
bit_set(status3,0); // STATUS TRIG =1
ext_int_edge(2,H_TO_L);// etat initial si TRIG=1 -> detecte un front descendant
}
else
{
All_bias_OFF(); // Force toutes les regulations à 0
bit_clear(status3,0); // STATUS TRIG =0
ext_int_edge(2,L_TO_H);// etat initial si TRIG=1 -> detecte un front montant
}
enable_interrupts(INT_EXT2);*/
enable_interrupts(global);
while(true)
{
EnTrans_Shunt=0b10111110;
if(input(TRIG))
{
bias_ON();
bit_set(status3,0); // STATUS TRIG =1
}
else
{
All_bias_OFF(); // Force toutes les regulations à 0
bit_clear(status3,0); // STATUS TRIG =0
}
lecture_U(); // + gestion defauts alims
lecture_I();
LEDS();
usb();
gestion_COM();
}
}
|
P405-R05.h:
Code: |
#include <18F4550.h>
#device adc=10
#device ICD = TRUE
#fuses HSPLL, NOWDT, NOPROTECT, NOLVP, NODEBUG, USBDIV, PLL5, CPUDIV1, VREGEN
#use delay (clock=100M)
#use i2c(Master,Fast,sda=PIN_B0,scl=PIN_B1)
#define DELAY 1000
#define TRIG PIN_B2
#define PULSE PIN_C1
#define MOS1 PIN_A4
#define MOS2 PIN_E2
#define MOS3 PIN_C0
#define MOS4 PIN_D7
#define MOS5 PIN_B3
#define ASGA PIN_B5
#define L_MOS1 PIN_D0
#define L_MOS2 PIN_D1
#define L_MOS3 PIN_D2
#define L_MOS4 PIN_D3
#define L_MOS5 PIN_D4
#define L_ASGA PIN_D5
#define LEDR PIN_D6
#define LEDV_ON output_high
#define LEDV_OFF output_low
#define LEDR_ON output_low
#define LEDR_OFF output_high
#define CMDE_OFF output_high
#define CMDE_ON output_low |
subfun.c
Code: |
//////////////////////////////////////////////////////////////////////////////////
void init_LED()
{
LEDV_ON(L_MOS1);
LEDV_ON(L_MOS2);
LEDV_ON(L_MOS3);
LEDV_ON(L_MOS4);
LEDV_ON(L_MOS5);
LEDV_ON(L_ASGA);
LEDR_ON(LEDR);
delay_ms(100);
LEDV_OFF(L_MOS1);
LEDV_OFF(L_MOS2);
LEDV_OFF(L_MOS3);
LEDV_OFF(L_MOS4);
LEDV_OFF(L_MOS5);
LEDV_OFF(L_ASGA);
LEDR_OFF(LEDR);
}
void init_var()
{
byte i;
strcpy (ID,"P405-R05,V1.0,0000001");
for (i=0;i<4;i++)
ADR[i]=read_EEPROM(i);
for (i=0;i<=6;i++)
M_I[i]=0; // IMOSX=0A
for (i=0;i<=7;i++)
M_V[i]=0; // VMOSX=0A
EnTrans_Shunt=read_EEPROM(5);
LV_MOS=read_EEPROM(11)+read_EEPROM(12)*256;
LV_ASGA=read_EEPROM(13)+read_EEPROM(14)*256;
LV_TEMP=read_EEPROM(15)+read_EEPROM(16)*256;
for (i=0;i<=5;i++)
{
REF_I[i]=read_EEPROM(5*i+20)+read_EEPROM(5*i+21)*256;
O_I[i]=read_EEPROM(5*i+22)+read_EEPROM(5*i+23)*256;
L_I[i]=read_EEPROM(2*i+50)+read_EEPROM(2*i+51)*256;
if(REF_I[i]>4095) REF_I[i]=0;
if(O_I[i]>4095) O_I[i]=0;
if(L_I[i]>4095) L_I[i]=0;
}
}
void init_CNA()
{
byte i;
for (i=0;i<=6;i++)
Write_CNA(i+1,REF_I[i]); // IMOS1 = 4.8A
}
void bias_ON() // Bias ON si Enable
{
if (bit_test(EnTrans_Shunt,1)) CMDE_ON(MOS1);
if (bit_test(EnTrans_Shunt,2)) CMDE_ON(MOS2);
if (bit_test(EnTrans_Shunt,3)) CMDE_ON(MOS3);
if (bit_test(EnTrans_Shunt,4)) CMDE_ON(MOS4);
if (bit_test(EnTrans_Shunt,6)) CMDE_ON(MOS5);
if (bit_test(EnTrans_Shunt,7)) CMDE_ON(ASGA);
}
void All_bias_OFF()
{
CMDE_OFF(MOS1);
CMDE_OFF(MOS2);
CMDE_OFF(MOS3);
CMDE_OFF(MOS4);
CMDE_OFF(MOS5);
CMDE_OFF(ASGA);
}
void LED_clignote(byte Trans)
{
switch (trans)
{
case 0: if (clignote) LEDV_ON(L_MOS1); // clignotage LEDV MOS1
else LEDV_OFF(L_MOS1);
break;
case 1: if (clignote) LEDV_ON(L_MOS2); // clignotage LEDV MOS2
else LEDV_OFF(L_MOS2);
break;
case 2: if (clignote) LEDV_ON(L_MOS3); // clignotage LEDV MOS3
else LEDV_OFF(L_MOS3);
break;
case 3: if (clignote) LEDV_ON(L_MOS4); // clignotage LEDV MOS4
else LEDV_OFF(L_MOS4);
break;
case 4: if (clignote) LEDV_ON(L_MOS5); // clignotage LEDV MOS5
else LEDV_OFF(L_MOS5);
break;
case 5: if (clignote) LEDV_ON(L_ASGA); // clignotage LEDV ASGA
else LEDV_OFF(L_ASGA);
break;
case 6: if (clignote) LEDR_ON(LEDR); // clignotage LEDR
else LEDR_OFF(LEDR);
break;
}
}
void LEDS()
{
byte i;
byte tmp=0, tmpV=0, tmpI=0;
if(bit_test(status3,0))
{
if (bit_test(EnTrans_Shunt,1) && !bit_test(STATUS2,0)) LEDV_ON(L_MOS1); //LEDX allumé si OK
else LEDV_OFF(L_MOS1);
if (bit_test(EnTrans_Shunt,2) && !bit_test(STATUS2,1)) LEDV_ON(L_MOS2);
else LEDV_OFF(L_MOS2);
if (bit_test(EnTrans_Shunt,3) && !bit_test(STATUS2,2)) LEDV_ON(L_MOS3);
else LEDV_OFF(L_MOS3);
if (bit_test(EnTrans_Shunt,4) && !bit_test(STATUS2,3)) LEDV_ON(L_MOS4);
else LEDV_OFF(L_MOS4);
if (bit_test(EnTrans_Shunt,6) && !bit_test(STATUS2,4)) LEDV_ON(L_MOS5);
else LEDV_OFF(L_MOS5);
if (bit_test(EnTrans_Shunt,7) && !bit_test(STATUS2,6)) LEDV_ON(L_ASGA);
else LEDV_OFF(L_ASGA);
}
else
{
if (bit_test(EnTrans_Shunt,1)) LED_clignote(0);
else LEDV_OFF(L_MOS1);
if (bit_test(EnTrans_Shunt,2)) LED_clignote(1);
else LEDV_OFF(L_MOS2);
if (bit_test(EnTrans_Shunt,3)) LED_clignote(2);
else LEDV_OFF(L_MOS3);
if (bit_test(EnTrans_Shunt,4)) LED_clignote(3);
else LEDV_OFF(L_MOS4);
if (bit_test(EnTrans_Shunt,6)) LED_clignote(4);
else LEDV_OFF(L_MOS5);
if (bit_test(EnTrans_Shunt,7)) LED_clignote(5);
else LEDV_OFF(L_ASGA);
}
tmpV=0;
tmpI=0;
nb_trans_actif=0;
for(i=0;i<=3;i++)
{
if(bit_test(EnTrans_Shunt,i+1)) nb_trans_actif++; // compte le nb de transistors actifs de 1-4
if (bit_test(STATUS2,i)) tmpV++; // compte le nb de transistors en warning de 1-4
if (bit_test(STATUS1,i)) tmpI++; // compte le nb de transistors en warning de 1-4
}
for(i=0;i<=5;i++) // si Warning I ou V, LEDX clignote qqs etat du TRIG
{
if (i<=4) tmp=i;
else tmp=6;
if(bit_test(STATUS2,tmp) || bit_test(STATUS1,tmp) )
LED_clignote(i);
}
if(bit_test(STATUS3,1) || ((tmpV<nb_trans_actif)&& tmpV>=1 && nb_trans_actif>1) || (tmpI==1 && nb_trans_actif==4)) // warning temp ou VMOSX ou IMOS
bit_set(STATUS3,2); // warning
else
bit_clear(STATUS3,2); // non warning
if (((tmpV==nb_trans_actif)&&nb_trans_actif>0) || bit_test(STATUS2,4) || bit_test(STATUS2,6) || bit_test(STATUS2,7) || bit_test(STATUS1,4) || bit_test(STATUS1,6) || ((nb_trans_actif==1)&&tmpI==1) || ((nb_trans_actif==2)&&tmpI>=1) || ((nb_trans_actif>=3)&&tmpI>=2)) // defaut ts VMOS1-4, VMOS5, VASGA, +10V
{
bit_set(STATUS3,3); // FAULT=1
bit_clear(STATUS3,2); // WARNING=0
// All_bias_OFF(); // Force toutes les regulations à 0A
}
else
{
bit_clear(STATUS3,3); // FAULT=0
}
if (bit_test(STATUS3,2)) LED_clignote(6); // si warning clignotement LEDR
if (bit_test(STATUS3,3)) LEDR_ON(LEDR); // si FAULT allumage LEDR
if(!bit_test(STATUS3,2) && !bit_test(STATUS3,3)) // si pas de defaut ni warning : extinction LEDR
LEDR_OFF(LEDR);
}
void Lecture_I()
{
byte i, tmp1=0, tmp2=0;
int16 VCAN=0, tmp_LI=0;
for(i=0;i<=5; i++) // lecture 6 mesures de courant 0 à 4 IMOS1 à 5; 5: ASGA
{
if (i<3)
set_adc_channel(i);
else
set_adc_channel(i+1);
delay_us(10);
VCAN=read_adc();
if (VCAN<10) VCAN=0;
else
VCAN=read_adc()+O_I[i];
if (i<=3) tmp1=i+1;
else tmp1=i+2;
if (i<=4) tmp2=i;
else tmp2=i+1;
if (bit_test(status3,0) && bit_test(EnTrans_Shunt,tmp1)) // MOS actif?
{
if (bit_test(EnTrans_Shunt,0)) tmp_LI=L_I[i]/2;
else tmp_LI=L_I[i];
if((VCAN<=(tmp_LI*0.75)) || (VCAN>=(tmp_LI*1.25))) // defaut si I > I+25%I ou <I-25%I de la consigne L_I
bit_set(STATUS1,tmp2); // defaut IMOSi
else
bit_clear(STATUS1,tmp2);
}
else bit_clear(STATUS1,tmp2);
M_I[i]=(float)VCAN*8.19/1023;
if (bit_test(EnTrans_Shunt,0)) M_I[i]=M_I[i]/2;
}
}
void lecture_U()
{
byte i;
byte tmp=0;
byte VHCAN=0,VLCAN=0;
int16 VCAN=0;
for (i=0;i<=7;i++)
{
i2c_start();
i2c_write(0b00010000); // ADRESSE physique du CNA =AD1=AD0=0 b0=0 pour ecriture
switch (i)
{
case 0: i2c_write(0b10001000); // Selection de Vcc MOS1
break;
case 1: i2c_write(0b11001000); // Selection de Vcc MOS2
break;
case 2: i2c_write(0b10011000); // Selection de Vcc MOS3
break;
case 3: i2c_write(0b11011000); // Selection de Vcc MOS4
break;
case 4: i2c_write(0b10101000); // Selection de Vcc MOS5
break;
case 5: i2c_write(0b11101000); // Selection de Vcc ASGA
break;
case 6: i2c_write(0b10111000); // Selection de +10V
break;
case 7: i2c_write(0b11111000); // Selection de Temp
break;
}
i2c_stop();
i2c_start();
i2c_write(0b00010001); // ADRESSE physique du CNA =AD1=AD0=0 b0=1 pour lecture
VHCAN=i2c_read(); // lecture des 8 premiers bits
VLCAN=i2c_read(); // lecture des 4 derniers bits
i2c_stop();
VCAN=(int16)VHCAN*16+(int16)VLCAN/16;
M_V[i]=((float)VCAN)/1000; // 2^12-1=4095 4.096V=valeur max en entrée /1000=/4095*4.095 en theorie c'est /4095*4.096. 1000 pour simplifier pour le PIC
switch (i)
{
case 6: if(VCAN<=1019) // +10V < 1860=8V
bit_set(STATUS2,7); // defaut internal +10V = 1
else
bit_clear(STATUS2,7); // defaut internal +10V = 0
break;
case 7: if(VCAN<=LV_TEMP) // Temperature > seuil programmé - Thermistance -> tendance vers 0, temp augmente
bit_set(STATUS3,1); // defaut temp=1
else
bit_clear(STATUS3,1); // defaut temp=0
break;
default:
if(i<=4) // cas de MOS1 à 5 pour i=0 à 4
{
if (i<=3) tmp=i+1;
else tmp=6;
if (bit_test(EnTrans_Shunt,tmp)) // MOS actif?
{
if((VCAN<=(LV_MOS-256)) || (VCAN>=(LV_MOS+256))) // defaut si VMOS > 2V ou <2V de la consigne 2V=256
bit_set(STATUS2,i); // defaut VMOSi
else
bit_clear(STATUS2,i);
}
else bit_clear(STATUS2,i);
}
else
{
if (bit_test(EnTrans_Shunt,7)) // ASGA actif?
{
if((VCAN<=(LV_ASGA-256)) || (VCAN>=(LV_ASGA+256))) // defaut si VASGA > 2V ou <2V de la consigne 2V=256
bit_set(STATUS2,6); // defaut ASGA
else
bit_clear(STATUS2,6);
}
else bit_clear(STATUS2,6);
}
break;
}
M_V[i]=M_V[i]*7.8; //+10V
}
}
void init_BUFF()
{
byte i;
for (i=0;i<size_COM;i++) // Init buffer RS232
buffer_COM[i]='\0';
pointeur_COM=0;
}
int16 Conv_ASCII_int16 (byte start, byte adr_eeprom) // fonction qui va lire le tableau buffer_COM[] de @start à @start+3 et sauvegarde dans EEPROM à @eeprom et eeprom+1
{
int16 tmp=0;
tmp=((int16)buffer_COM[start]-0x30)*0x3E8+((int16)buffer_COM[start+1]-0x30)*0x64+((int16)buffer_COM[start+2]-0x30)*0xA+((int16)buffer_COM[start+3]-0x30);
write_EEPROM(adr_eeprom,make8(tmp,0));
write_EEPROM(adr_eeprom+1,make8(tmp,1));
return(tmp);
}
void USB() //Fonction qui permet de remplir le Buffer_COM par USB
{
if(usb_enumerated())
{
if(usb_cdc_kbhit())
{
buffer_COM[pointeur_COM]=usb_cdc_getc();
pointeur_COM++;
if (pointeur_COM==size_COM) //Buffer plein
init_BUFF(); // init buffer RS232/USB
}
}
}
void gestion_COM()
{
byte i,j;
char tmp[20];
if (buffer_COM[1]!='@') // si l'@ ne correspond pas à celle de la carte
{
if (pointeur_COM>4)
if(usb_enumerated())
{
for (i=0;i<4;i++)
{
tmp[i]=buffer_COM[i+1];
}
if (!strncmp(ADR,tmp,4)) // lecture *IDN?
{
}
else
init_BUFF(); // Init Buffer de communication
}
}
strcpy (tmp,"R----*IDN?");
for (i=0;i<4;i++)
tmp[i+1]=ADR[i];
if (!strncmp(buffer_COM,tmp,10)) // lecture *IDN?
{
if(usb_enumerated())
{
usb_cdc_putc("\r\n");
for (i=0;i<=20;i++)
usb_cdc_putc(ID[i]);
usb_cdc_putc("\r");
}
else
{
}
init_BUFF(); // Init Buffer de communication
}
strcpy (tmp,"W@");
if (!strncmp(buffer_COM,tmp,2)) // ecriture @ carte
if (pointeur_COM>=6)
{
for (i=0;i<4;i++)
{
ADR[i]=buffer_COM[i+2];
write_EEPROM(i,buffer_COM[i+2]);
}
init_BUFF(); // Init Buffer de communication
}
strcpy (tmp,"R@");
if (!strncmp(buffer_COM,tmp,2)) // lecture @ carte
{
if(usb_enumerated())
{
usb_cdc_putc("\r\n");
for (i=0;i<=size_ADR-2;i++)
usb_cdc_putc(ADR[i]);
usb_cdc_putc("\r");
}
else
{
}
init_BUFF(); // Init Buffer de communication
}
strcpy (tmp,"R----MC");
for (i=0;i<4;i++)
tmp[i+1]=ADR[i];
if (!strncmp(buffer_COM,tmp,7)) // lecture mesures en courant
{
if(usb_enumerated())
{
usb_cdc_putc("\r\n");
for (i=0;i<5;i++)
printf(usb_cdc_putc,"%03.1fA ",M_I[i]);
printf(usb_cdc_putc,"%03.1fA",M_I[5]);
usb_cdc_putc("\r");
}
else
{
}
init_BUFF(); // Init Buffer de communication
}
strcpy (tmp,"R----MV");
for (i=0;i<4;i++)
tmp[i+1]=ADR[i];
if (!strncmp(buffer_COM,tmp,7)) // lecture mesures en tension
{
if(usb_enumerated())
{
usb_cdc_putc("\r\n");
for (i=0;i<=6;i++)
printf(usb_cdc_putc,"%2.1fV ",M_V[i]);
usb_cdc_putc("\r");
}
else
{
}
init_BUFF(); // Init Buffer de communication
}
strcpy (tmp,"R----MT");
for (i=0;i<4;i++)
tmp[i+1]=ADR[i];
if (!strncmp(buffer_COM,tmp,7)) // lecture mesure de la tempzerature
{
if(usb_enumerated())
{
usb_cdc_putc("\r\n");
printf(usb_cdc_putc,"%2.2fV ",M_V[7]);
usb_cdc_putc("\r");
}
else
{
}
init_BUFF(); // Init Buffer de communication
}
strcpy (tmp,"W----L");
for (i=0;i<4;i++)
tmp[i+1]=ADR[i];
if (!strncmp(buffer_COM,tmp,6)) // ecriture shunt et Enable trans
if (pointeur_COM>=19)
{
EnTrans_Shunt=buffer_COM[6];
write_EEPROM(5,EnTrans_Shunt);
bias_ON(); // met à ON toutes les reguls Enabelés
LV_MOS=Conv_ASCII_int16(7,11);
LV_ASGA=Conv_ASCII_int16(11,13);
LV_TEMP=Conv_ASCII_int16(15,15);
init_BUFF(); // Init Buffer de communication
}
strcpy (tmp,"R----L");
for (i=0;i<4;i++)
tmp[i+1]=ADR[i];
if (!strncmp(buffer_COM,tmp,6)) // lecture shunt et Enable trans
{
if(usb_enumerated())
{
usb_cdc_putc("\r\n");
printf(usb_cdc_putc,"%C",(char)EnTrans_Shunt);
printf(usb_cdc_putc,"%04lu",LV_MOS);
printf(usb_cdc_putc,"%04lu",LV_ASGA);
printf(usb_cdc_putc,"%04lu",LV_TEMP);
usb_cdc_putc("\r");
}
else
{
}
init_BUFF(); // Init Buffer de communication
}
strcpy (tmp,"W----l");
for (i=0;i<4;i++)
tmp[i+1]=ADR[i];
if (!strncmp(buffer_COM,tmp,6)) // ecriture consigne en courant
if (pointeur_COM>=11)
{
j=buffer_COM[6]-0x30; // j de 1 à 6 1 à 5 pour MOS, 6 pour ASGA
if (j>6) j=6;
if(j==0) j=1;
REF_I[j-1]=Conv_ASCII_int16(7,5*j+15); // ecriture ds EEPROM @ 20, 25 30 35 40 45
Write_CNA(j,REF_I[j-1]); // ecriture consigne sur CNA
init_BUFF(); // Init Buffer de communication
}
strcpy (tmp,"R----l");
for (i=0;i<4;i++)
tmp[i+1]=ADR[i];
if (!strncmp(buffer_COM,tmp,6)) // lecture consigne en courant
if (pointeur_COM>=7)
{
j=buffer_COM[6]-0x30; // j de 1 à 6 1 à 5 pour MOS, 6 pour ASGA
if (j>6) j=6;
if(j==0) j=1;
if(usb_enumerated())
{
usb_cdc_putc("\r\n");
printf(usb_cdc_putc,"%04lu",REF_I[j-1]);
usb_cdc_putc("\r");
}
else
{
}
init_BUFF(); // Init Buffer de communication
}
strcpy (tmp,"W----O");
for (i=0;i<4;i++)
tmp[i+1]=ADR[i];
if (!strncmp(buffer_COM,tmp,6)) // ecriture consigne en courant
if (pointeur_COM>=11)
{
j=buffer_COM[6]-0x30; // j de 1 à 6 1 à 5 pour MOS, 6 pour ASGA
if (j>6) j=6;
if(j==0) j=1;
O_I[j-1]=Conv_ASCII_int16(7,5*j+17); // ecriture ds EEPROM @ 22, 27 32 37 42 47
init_BUFF(); // Init Buffer de communication
}
strcpy (tmp,"W----SETREF");
for (i=0;i<4;i++)
tmp[i+1]=ADR[i];
if (!strncmp(buffer_COM,tmp,11)) // ecriture consigne en courant
if (pointeur_COM>=11)
{
for (i=0;i<=5;i++)
{
L_I[i]=M_I[i]*1023/8.19; // Sauvegarde des 6 niveaux de defauts de courant 0 à 4 IMOS1 à 5; 5: ASGA
write_EEPROM(2*i+50,make8(L_I[i],0));
write_EEPROM(2*i+51,make8(L_I[i],1));
}
if(usb_enumerated())
{
usb_cdc_putc("\r\n");
for (i=0;i<=5;i++)
printf(usb_cdc_putc,"%04lu ",L_I[i]);
usb_cdc_putc("\r");
}
init_BUFF(); // Init Buffer de communication
}
strcpy (tmp,"R----O");
for (i=0;i<4;i++)
tmp[i+1]=ADR[i];
if (!strncmp(buffer_COM,tmp,6)) // lecture consigne en courant
if (pointeur_COM>=7)
{
j=buffer_COM[6]-0x30; // j de 1 à 6 1 à 5 pour MOS, 6 pour ASGA
if (j>6) j=6;
if(j==0) j=1;
if(usb_enumerated())
{
usb_cdc_putc("\r\n");
printf(usb_cdc_putc,"%04lu",O_I[j-1]);
usb_cdc_putc("\r");
}
else
{
}
init_BUFF(); // Init Buffer de communication
}
strcpy (tmp,"R----S");
for (i=0;i<4;i++)
tmp[i+1]=ADR[i];
if (!strncmp(buffer_COM,tmp,6)) // lecture Status carte
{
if(usb_enumerated())
{
usb_cdc_putc("\r\n");
printf(usb_cdc_putc,"%c%c%c",STATUS1, STATUS2, STATUS3);
usb_cdc_putc("\r");
}
else
{
}
init_BUFF(); // Init Buffer de communication
}
if(buffer_COM[0]!='R' && buffer_COM[0]!='W') // filtre sur buffer_COM
init_BUFF(); // Init Buffer de communication
for (i=0;i<size_COM-4;i++) // Init buffer RS232
if(buffer_COM[i]=='R')
if(buffer_COM[i+1]=='S')
if(buffer_COM[i+2]=='T')
init_BUFF();
}
|
|
|
|
Ttelmah
Joined: 11 Mar 2010 Posts: 19504
|
|
Posted: Mon May 19, 2014 6:49 am |
|
|
Classic 'read the data sheet'....
Setting the 'edge' for an interrupt, can always potentially result in the interrupt being triggered.
The sequence has to be:
1) set the edge.
2) clear the interrupt.
3) enable the interrupt.
As a further comment, disabling the interrupt inside the handler is pointless. The hardware disables the interrupts. |
|
|
neo19
Joined: 14 Aug 2012 Posts: 30 Location: France
|
|
Posted: Mon May 19, 2014 7:22 am |
|
|
Thanks for your answer,
So I changed I little bit my code in the #INT_EXT2 :
I deleted disable and enable interrupt,
In the main, in the init, I changed the order of initiate the interrupt:
Code: |
clear_interrupt(INT_EXT2);
enable_interrupts(INT_EXT2);
enable_interrupts(global);
|
but it's not working.
Code: |
#INT_EXT2
void ext2_isr()
{
// disable_interrupts(INT_EXT2);
if(input(TRIG))
{
bias_ON();
bit_set(status3,0); // STATUS TRIG =1
ext_int_edge(2,H_TO_L);
}
else
{
All_bias_OFF(); // Force toutes les regulations à 0
bit_clear(status3,0); // STATUS TRIG =0
ext_int_edge(2,L_TO_H);
}
clear_interrupt(INT_EXT2);
// enable_interrupts(INT_EXT2);
}
void main()
{
setup_adc_ports(AN0_TO_AN6|VSS_VREF); //VREF=4.096V. Attention à la mesure de AN0 à A11.
setup_adc(ADC_CLOCK_INTERNAL);
setup_psp(PSP_DISABLED);
setup_wdt(WDT_OFF);
setup_timer_0(RTCC_INTERNAL);
setup_timer_1(T1_DISABLED);
setup_timer_2(T2_DISABLED,0,1);
setup_timer_3(T3_DISABLED|T3_DIV_BY_1);
setup_comparator(NC_NC_NC_NC);
setup_vref(FALSE);
usb_init();
init_LED(); // Test LED ON puis OFF 100ms
All_bias_OFF(); // Force toutes les regulations à 0A
init_var(); // Recuperation données EEPROM
init_BUFF(); // init buffer RS232/USB
init_CNA();
int_count=INTS_PER_MIN; // Timers pour clignotement
set_rtcc(65279);
setup_counters( RTCC_INTERNAL, RTCC_DIV_256);
enable_interrupts(INT_RTCC);
if(input(TRIG))
{
bias_ON();
bit_set(status3,0); // STATUS TRIG =1
ext_int_edge(2,H_TO_L);// etat initial si TRIG=1 -> detecte un front descendant
}
else
{
All_bias_OFF(); // Force toutes les regulations à 0
bit_clear(status3,0); // STATUS TRIG =0
ext_int_edge(2,L_TO_H);// etat initial si TRIG=1 -> detecte un front montant
}
clear_interrupt(INT_EXT2);
enable_interrupts(INT_EXT2);
enable_interrupts(global);
while(true)
{
EnTrans_Shunt=0b10111110;
/* if(input(TRIG))
{
bias_ON();
bit_set(status3,0); // STATUS TRIG =1
}
else
{
All_bias_OFF(); // Force toutes les regulations à 0
bit_clear(status3,0); // STATUS TRIG =0
}*/
lecture_U(); // + gestion defauts alims
lecture_I();
LEDS();
usb();
gestion_COM();
}
}
|
|
|
|
PCM programmer
Joined: 06 Sep 2003 Posts: 21708
|
|
Posted: Mon May 19, 2014 3:13 pm |
|
|
Quote: | #include <18F4550.h>
#device adc=10
#device ICD = TRUE
#fuses HSPLL, NOWDT, NOPROTECT, NOLVP, NODEBUG, USBDIV, PLL5, CPUDIV1, VREGEN
#use delay (clock=100M)
|
How does the 18F4550 run at 100 MHz when the data sheet says it
runs at 48 MHz max ? |
|
|
neo19
Joined: 14 Aug 2012 Posts: 30 Location: France
|
|
Posted: Tue May 20, 2014 12:36 am |
|
|
You are right,
I started with CCS USB development kit and I don't know where I've found this. It's a big mistake.
So I correct my software :
Quote: | #fuses HSPLL, NOWDT, NOPROTECT, NOLVP, NODEBUG, USBDIV, PLL5, CPUDIV1, VREGEN
#use delay (clock=48M) |
But the result is the same... |
|
|
Ttelmah
Joined: 11 Mar 2010 Posts: 19504
|
|
Posted: Tue May 20, 2014 1:05 am |
|
|
Realistically, you need to learn how to debug....
Nobody is going to actually read through your code in it's entirety (far too large). That includes _you_!....
The key with debugging is to cut code down into smaller chunks, till problems are isolated, allowing you to find errors.
Now scanning through your initialisation, two problems have already been spotted by posters here, but the core fault still remains....
Start much smaller. Learn to write in sections, and get each part working on it's own. Then build using these smaller 'bricks'. |
|
|
neo19
Joined: 14 Aug 2012 Posts: 30 Location: France
|
|
Posted: Tue May 20, 2014 1:09 am |
|
|
That's what I'm trying to do this morning.
To start with a small code and after finding the bug... |
|
|
neo19
Joined: 14 Aug 2012 Posts: 30 Location: France
|
|
Posted: Wed May 28, 2014 2:00 am |
|
|
So now it's ok. The trouble was elsewhere not in the interrupt.
Thanks for your help
Fabrice |
|
|
|
|
You cannot post new topics in this forum You cannot reply to topics in this forum You cannot edit your posts in this forum You cannot delete your posts in this forum You cannot vote in polls in this forum
|
Powered by phpBB © 2001, 2005 phpBB Group
|