Konstigt beteende på program.

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
Användarvisningsbild
newbadboy
Inlägg: 2426
Blev medlem: 16 september 2006, 19:16:28
Ort: Landskrona
Kontakt:

Re: Konstigt beteende på program.

Inlägg av newbadboy »

Jag förstår.


Tillkom en fråga till gällande 16F1937 numera. Har eg bara ett problem kvar att lösa

Jag läser ett "väldigt" snabbt förlopp med ADCn vilket den inte verkar hinna med helt enkelt. Har kretsen inställd på 16MHz vad jag kan se.

Pulsen på bilden är den som sker på matningsspänningen när man låser upp bildörren. Denna försöker jag detektera hela tiden så ofta som möjligt. Amplituden är ca 800mV men tiden är i bästa fall ca 10us. Kan jag ens detektera denna signal

Ser att denna PIC har en neg komparator ingång på denna pinne. Den kanske man kan använda för att kunna snabbare detektera?

Eller några andra bra ideer?

Koden som annars funkar bra bifogas också

Kod: Markera allt

//Rev Hist
//R2.1, New mcu 16F1937

#define LED_RFstat PORTD.F6
#define LED_Stat   PORTD.F7
#define RF_EN      PORTD.F1
#define CAN_stby   PORTB.F4
#define Vbat_adc   PORTA.F1
#define SDO        PORTE.F2
#define SIM800_rst PORTD.F0
#define Int1       PORTE.F0


char AT[]="AT";   // To initialize mode
char noecho[]="ATE0";   // To stop echo
char mode_text[]="AT+CMGF=1";   // to set text mode
char char_mode[]="AT+CSCS=\"GSM\"";   // to set character mode
char param[]="AT+CSMP=17,167,0,0";   // set the parameter of character
char mobile_no[]="AT+CMGS=\"+46723970467\"";   //use to set receinpent number and mesg
char mobile_no1[]="AT+CMGS=\"+46xxxxxxxxxx\"";   //use to set receinpent number and mesg
char terminator=0x1A;     // chartacter form of control + z terminator character


int prio_counter=0, l=0, b=0, j=0, y=0, i=0, m=0, n=0, Vbat, Int1Value, VbatOld, VbatCalc ;
long int k=0;
unsigned short DevID;

//Warning messages to be sent thru SMS
char mesg0[]="GSM Bil OK Rev2.1";
char mesg1[]="!!**INBROTT i Bilen**!!";
char mesg2[]="Svagt bilbatteri";


//function to write anything serially.
void send_to_modem(char *s){
        while(*s)
            UART1_WRITE(*s++);
            UART1_WRITE(0X0D);
        }

void send_to_modem1(char *s){
        while(*s)
            UART1_WRITE(*s++);
        }

//Send different message
void send_sms(int b){
        if(b==0)
          send_to_modem1(mesg0);
        else if(b==1)
          send_to_modem1(mesg1);
        else if(b==2)
          send_to_modem1(mesg2);
        delay_ms(100);
        uart1_write(terminator);
        delay_ms(1000);
        }

void Send_GSM(){
     send_to_modem(AT);
     delay_ms(2000);
     send_to_modem(noecho);
     delay_ms(2000);
     send_to_modem(mode_text);
     delay_ms(2000);
     send_to_modem(mobile_no);
     delay_ms(2000);
     send_sms(b);
     }

//Reset commands to reset adxl345 output
void ADXL345_Reset(){
     I2C1_Start();
     I2C1_Wr(0xA6);
     I2C1_Wr(0x30);
     I2C1_Repeated_Start();
     I2C1_Wr(0xA7);
     DevID=I2C1_Rd(0);
     I2C1_Stop();
     }

//ADX345 setup
void ADXL345_init(){
//Read out device id ocf the ADXL345 chip. By sniffing the I2C, the
//device id should be seen as 229
     I2C1_Start();
     I2C1_Wr(0xA6);
     I2C1_Wr(0x00);
     I2C1_Repeated_Start();
     I2C1_Wr(0xA7);
     DevID=I2C1_Rd(0);
     I2C1_Stop();

//Set power control to normal.
     I2C1_Start();
     I2C1_Wr(0xA6);
     I2C1_Wr(0x2D);
     I2C1_Wr(0x08);
     I2C1_Repeated_Start();
     I2C1_Wr(0xA7);
     DevID=I2C1_Rd(0);
     I2C1_Stop();

//Set tap axes. Use xyz axis
     I2C1_Start();
     I2C1_Wr(0xA6);
     I2C1_Wr(0x2A);
     I2C1_Wr(0x01);
     I2C1_Repeated_Start();
     I2C1_Wr(0xA7);
     DevID=I2C1_Rd(0);
     I2C1_Stop();

//Set threshold for single tap detection
     I2C1_Start();
     I2C1_Wr(0xA6);
     I2C1_Wr(0x1D);
     I2C1_Wr(5);                          //(40) iinnan
     I2C1_Repeated_Start();
     I2C1_Wr(0xA7);
     DevID=I2C1_Rd(0);
     I2C1_Stop();

//Set the duration for single tap detection
     I2C1_Start();
     I2C1_Wr(0xA6);
     I2C1_Wr(0x21);
     I2C1_Wr(32);  //625us/LSB
     I2C1_Repeated_Start();
     I2C1_Wr(0xA7);
     DevID=I2C1_Rd(0);
     I2C1_Stop();

//Set the latency for single tap detection, disable double tap
     I2C1_Start();
     I2C1_Wr(0xA6);
     I2C1_Wr(0x22);
     I2C1_Wr(0);
     I2C1_Repeated_Start();
     I2C1_Wr(0xA7);
     DevID=I2C1_Rd(0);
     I2C1_Stop();

//Map single tap interupt to INT1 pin
     I2C1_Start();
     I2C1_Wr(0xA6);
     I2C1_Wr(0x2F);
     I2C1_Wr(0x00);   //00000000
     I2C1_Repeated_Start();
     I2C1_Wr(0xA7);
     DevID=I2C1_Rd(0);
     I2C1_Stop();

//Enable INT1
    I2C1_Start();
    I2C1_Wr(0xA6);
    I2C1_Wr(0x2E);
    I2C1_Wr(0x40);   //01000000
    I2C1_Repeated_Start();
    I2C1_Wr(0xA7);
    DevID=I2C1_Rd(0);
    I2C1_Stop();

//Reset INT1 output if needed
    ADXL345_Reset();
}



void Init_Main(){
     OSCCON=0b01111000; //Set 16MHz clock      0b01110110

     TRISA=0b00000010;
     TRISB=0b00011000;
     TRISC=0b10000000;
     TRISD=0b00000000;
     TRISE=0b00000011;

     ANSELA=0b00000010;
     ANSELB=0b00000000;
     ANSELD=0b00000000;
     ANSELE=0b00000001;

     SDO=0; // do not alter to avoid short circuit!!!!!

     UART1_Init(9600);
     I2C1_Init(100000);
     ADC_Init();

     for(l=0; l<7; l++){
     LED_Stat=1;
     LED_RFstat=1;
     Delay_ms(50);
     LED_Stat=0;
     LED_RFstat=0;
     Delay_ms(50);
     }

     ADXL345_Init();
     
//Send startupSMS and set b=1 for sms2
     LED_Stat=1;
     LED_RFstat=1;
     RF_EN=1;
     Delay_ms(100);
     SIM800_rst=1;
     Delay_ms(35000);    //Gsm net search
   //  Send_GSM();
     Delay_ms(20000);    //Time to send sms
     SIM800_rst=0;
     Delay_ms(100);
     RF_EN=0;
     LED_Stat=0;
     LED_RFstat=0;
     b=1;
     
     ADXL345_Reset();
}

//Led blink in normal mode
void Led(){
     if(k==9000)
       LED_Stat=1;
     if(k==500)
       LED_Stat=0;
     if(k==12000)
        k=0;
     k++;
     }

void Read_ADXL345(){
     Int1Value=ADC_Read(5);
     if(Int1Value>511){     //2,5V
        //Send SMS. Max 1 time
        ADXL345_Reset();
        if(m<1){
          Delay_ms(10);
          m++;
          LED_Stat=1;
          LED_RFstat=1;
          RF_EN=1;
          Delay_ms(100);
          SIM800_rst=1;
          Delay_ms(35000);    //Gsm net search
        //  Send_GSM();
          Delay_ms(1000);
        //  Send_GSM();
          Delay_ms(20000);
          }
        SIM800_rst=0;
        Delay_ms(100);
        RF_EN=0;
        LED_Stat=0;
        LED_RFstat=0;
        ADXL345_Reset;
        }
}


void Read_Vbat(){
     Vbat=ADC_Read(1);
     if(Vbat>895){     //14V
      Delay_ms(3000);
     //engine started
     while(Vbat>895){
         Vbat=ADC_Read(1);
         LED_Stat=1;
         Delay_ms(100);
         LED_Stat=0;
         Delay_ms(100);
         m=0;
         n=0;
         }
     while(j<450){        //Step out time ~5min
          j++;
          LED_Stat=1;
          Delay_ms(400);
          LED_Stat=0;
          Delay_ms(400);
          }
          j=0;
//Reset INT1 output
          ADXL345_Reset();
          }

     VbatOld=Vbat;
     Vbat=ADC_Read(1);
     VbatCalc=VbatOld-Vbat;
     
//Send sms, low battery
     if(Vbat<703){  //<11.5V
       Delay_ms(10000);
       Vbat=ADC_Read(1);
       VbatOld=Vbat;
       Vbat=ADC_Read(1);
       VbatCalc=VbatOld-Vbat;
       if((Vbat<775)&&(n==0)){
         n++;
         b=2;
         LED_Stat=1;
         LED_RFstat=1;
         RF_EN=1;
         Delay_ms(100);
         SIM800_rst=1;
         Delay_ms(35000);    //Gsm net search
         Send_GSM();
         Delay_ms(20000);    //Time to send sms
         SIM800_rst=0;
         Delay_ms(100);
         RF_EN=0;
         LED_Stat=0;
         LED_RFstat=0;
         b=1;
         }
       ADXL345_Reset();
       }
     
     
    if(VbatCalc>20||Vbat<760){    //>300mv  <11.9V
       Delay_ms(10000);
       Vbat=ADC_Read(1);
       VbatOld=Vbat;
       Vbat=ADC_Read(1);
       VbatCalc=VbatOld-Vbat;
//doors opened
//stay in loop for 5min or as long as Vbat>14V
       while((j<700)||(Vbat>895)){
            LED_Stat=1;
            Delay_ms(100);
            LED_Stat=0;
            Delay_ms(100);
            j++;
            }
//Reset INT1 output
           ADXL345_Reset();
           j=0;
           }
}


void main(){
    Init_main();
    
   /* while(1){
     LED_Stat=1;
     LED_Stat=0;
    }
   */
    
    while(1){
         prio_counter++;
         Led();
         Read_Vbat();
         if(prio_counter==1500){
            Read_ADXL345();
            prio_counter=0;
            }
         }
}
Du har inte behörighet att öppna de filer som bifogats till detta inlägg.
TheUnreal
Inlägg: 115
Blev medlem: 4 september 2005, 16:04:57
Ort: Sundsvall
Kontakt:

Re: Konstigt beteende på program.

Inlägg av TheUnreal »

Eftersom jag nyligen gjort bort mig med A/D omvandling på PIC så tar jag mig friheten att svara.

A/D är helt fel metod för dig, se databladet sidan 140.

Mätkondensatorn är bara inkopplad till signalen under tiden mellan att du väljer kanal och att du startar mätningen.
Sedan behåller mätkondensatorn det värde den laddat från den analoga signalen under omvandlingen.
Enligt databladet enligt sidan ovan finns det en minsta tid för att ladda mätkondensatorn och den är beroende av temperaturen, 4.42 uS vid 50 grader.
Så pulsen räcker för att mätas, om du bara kan se till att starta mätningen i slutet av pulsen ;)

Nu kommer jag att låta som en repad skiva: Använd interupt :)
Om du låter komparatorn generera ett interupt när pulsen kommer slipper du kolla pinnen, komparatorn eller A/D omvandlare med 32 instruktioners mellanrum :)
Användarvisningsbild
newbadboy
Inlägg: 2426
Blev medlem: 16 september 2006, 19:16:28
Ort: Landskrona
Kontakt:

Re: Konstigt beteende på program.

Inlägg av newbadboy »

Japp har också kommit fram till samma slutsats. Därmed har jag redan börjat labba med interrupt men det är ngt skumt som händer.

Kolla koden nedan. OM jag har allting bortkommenterat i while1 loopen i main och jag bara kör interruptet så funkar det fint. När jag kommer under inställd spänning så blinkar den led och sedan hoppar ut och väntar på att ny spänningsdipp skall ske. Men har jag ngn annan funktion igång i main så triggas hela tiden interuptet. Har t.om provat att skriva direkt i main den lilla koden som annars finns i LED() men redan där triggas interupptet. Bittert

Några tips?

Kod: Markera allt

//Rev Hist
//R2.1 New mcu 16F1937
//R2.2 Comparator module used and interrupt() added

#define LED_RFstat PORTD.F6
#define LED_Stat   PORTD.F7
#define RF_EN      PORTD.F1
#define CAN_stby   PORTB.F4
#define Vbat_adc   PORTA.F1
#define SDO        PORTE.F2
#define SIM800_rst PORTD.F0
#define Int1       PORTE.F0


char AT[]="AT";   // To initialize mode
char noecho[]="ATE0";   // To stop echo
char mode_text[]="AT+CMGF=1";   // to set text mode
char char_mode[]="AT+CSCS=\"GSM\"";   // to set character mode
char param[]="AT+CSMP=17,167,0,0";   // set the parameter of character
char mobile_no[]="AT+CMGS=\"+46723970467\"";   //use to set receinpent number and mesg
char mobile_no1[]="AT+CMGS=\"+46xxxxxxxxxx\"";   //use to set receinpent number and mesg
char terminator=0x1A;     // chartacter form of control + z terminator character


int l=0, b=0, j=0, y=0, i=0, m=0, n=0, Vbat, Int1Value, VbatOld, VbatCalc, int_Flag=0 ;
long int k=0;
unsigned short DevID;

//Warning messages to be sent thru SMS
char mesg0[]="GSM Bil OK Rev2.1";
char mesg1[]="!!**INBROTT i Bilen**!!";
char mesg2[]="Svagt bilbatteri";


//function to write anything serially.
void send_to_modem(char *s){
        while(*s)
            UART1_WRITE(*s++);
            UART1_WRITE(0X0D);
        }

void send_to_modem1(char *s){
        while(*s)
            UART1_WRITE(*s++);
        }

//Send different message
void send_sms(int b){
        if(b==0)
          send_to_modem1(mesg0);
        else if(b==1)
          send_to_modem1(mesg1);
        else if(b==2)
          send_to_modem1(mesg2);
        delay_ms(100);
        uart1_write(terminator);
        delay_ms(1000);
        }

void Send_GSM(){
     send_to_modem(AT);
     delay_ms(2000);
     send_to_modem(noecho);
     delay_ms(2000);
     send_to_modem(mode_text);
     delay_ms(2000);
     send_to_modem(mobile_no);
     delay_ms(2000);
     send_sms(b);
     }

//Reset commands to reset adxl345 output
void ADXL345_Reset(){
     I2C1_Start();
     I2C1_Wr(0xA6);
     I2C1_Wr(0x30);
     I2C1_Repeated_Start();
     I2C1_Wr(0xA7);
     DevID=I2C1_Rd(0);
     I2C1_Stop();
     }

//ADX345 setup
void ADXL345_init(){
//Read out device id ocf the ADXL345 chip. By sniffing the I2C, the
//device id should be seen as 229
     I2C1_Start();
     I2C1_Wr(0xA6);
     I2C1_Wr(0x00);
     I2C1_Repeated_Start();
     I2C1_Wr(0xA7);
     DevID=I2C1_Rd(0);
     I2C1_Stop();

//Set power control to normal.
     I2C1_Start();
     I2C1_Wr(0xA6);
     I2C1_Wr(0x2D);
     I2C1_Wr(0x08);
     I2C1_Repeated_Start();
     I2C1_Wr(0xA7);
     DevID=I2C1_Rd(0);
     I2C1_Stop();

//Set tap axes. Use xyz axis
     I2C1_Start();
     I2C1_Wr(0xA6);
     I2C1_Wr(0x2A);
     I2C1_Wr(0x01);
     I2C1_Repeated_Start();
     I2C1_Wr(0xA7);
     DevID=I2C1_Rd(0);
     I2C1_Stop();

//Set threshold for single tap detection
     I2C1_Start();
     I2C1_Wr(0xA6);
     I2C1_Wr(0x1D);
     I2C1_Wr(5);                          //(40) iinnan
     I2C1_Repeated_Start();
     I2C1_Wr(0xA7);
     DevID=I2C1_Rd(0);
     I2C1_Stop();

//Set the duration for single tap detection
     I2C1_Start();
     I2C1_Wr(0xA6);
     I2C1_Wr(0x21);
     I2C1_Wr(32);  //625us/LSB
     I2C1_Repeated_Start();
     I2C1_Wr(0xA7);
     DevID=I2C1_Rd(0);
     I2C1_Stop();

//Set the latency for single tap detection, disable double tap
     I2C1_Start();
     I2C1_Wr(0xA6);
     I2C1_Wr(0x22);
     I2C1_Wr(0);
     I2C1_Repeated_Start();
     I2C1_Wr(0xA7);
     DevID=I2C1_Rd(0);
     I2C1_Stop();

//Map single tap interupt to INT1 pin
     I2C1_Start();
     I2C1_Wr(0xA6);
     I2C1_Wr(0x2F);
     I2C1_Wr(0x00);   //00000000
     I2C1_Repeated_Start();
     I2C1_Wr(0xA7);
     DevID=I2C1_Rd(0);
     I2C1_Stop();

//Enable INT1
    I2C1_Start();
    I2C1_Wr(0xA6);
    I2C1_Wr(0x2E);
    I2C1_Wr(0x40);   //01000000
    I2C1_Repeated_Start();
    I2C1_Wr(0xA7);
    DevID=I2C1_Rd(0);
    I2C1_Stop();

//Reset INT1 output if needed
    ADXL345_Reset();
}

void Interrupt_EN(){
     PEIE_bit=1;
     GIE_bit=1;
     C1IF_bit=0;
     C1IE_bit=1;
}

void Interrupt_DIS(){
     PEIE_bit=0;
     GIE_bit=0;
     C1IF_bit=0;
     C1IE_bit=0;
}

void Init_Main(){
     OSCCON=0b01111000; //Set 16MHz clock      0b01110110

     TRISA=0b00000011;
     TRISB=0b00011000;
     TRISC=0b10000000;
     TRISD=0b00000000;
     TRISE=0b00000011;

     ANSELA=0b00000011;
     ANSELB=0b00000000;
     ANSELD=0b00000000;
     ANSELE=0b00000001;

     SDO=0; // do not alter to avoid short circuit!!!!!

//DAC setup and connect to comparator
     DACCON0=0b11000000;
     DACCON1=0b00011000;  // below ~3.7V (= 11.85V)

//Comparator setup
     CM1CON0=0b11000111;
     CM1CON1=0b10010000;

     UART1_Init(9600);
     I2C1_Init(100000);
     ADC_Init();

     for(l=0; l<7; l++){
     LED_Stat=1;
     LED_RFstat=1;
     Delay_ms(50);
     LED_Stat=0;
     LED_RFstat=0;
     Delay_ms(50);
     }

     ADXL345_Init();
 /*
//Send startupSMS and set b=1 for sms2
     LED_Stat=1;
     LED_RFstat=1;
     RF_EN=1;
     Delay_ms(100);
     SIM800_rst=1;
     Delay_ms(35000);    //Gsm net search
     Send_GSM();
     Delay_ms(20000);    //Time to send sms
     SIM800_rst=0;
     Delay_ms(100);
     RF_EN=0;
     LED_Stat=0;
     LED_RFstat=0;
     b=1;
     Delay_ms(1000);
*/
// enable interrupts & reset adxl
     Interrupt_EN();
     ADXL345_Reset();
}

//Led blink in normal mode
void Led(){
     if(k==9000)
       LED_Stat=1;
     if(k==200)
       LED_Stat=0;
     if(k==12000)
        k=0;
     k++;
     }

void Read_ADXL345(){
     Int1Value=ADC_Read(5);
     if(Int1Value>511){     //2,5V
        //Send SMS. Max 1 time
        ADXL345_Reset();
        if(m<1){
          Delay_ms(10);
          m++;
          LED_Stat=1;
          LED_RFstat=1;
          RF_EN=1;
          Delay_ms(100);
          SIM800_rst=1;
          Delay_ms(35000);    //Gsm net search
        //  Send_GSM();
          Delay_ms(1000);
        //  Send_GSM();
          Delay_ms(20000);
          }
        SIM800_rst=0;
        Delay_ms(100);
        RF_EN=0;
        LED_Stat=0;
        LED_RFstat=0;
        ADXL345_Reset;
        }
}


void Read_Vbat(){

     Vbat=ADC_Read(1);
     if(Vbat>895){     //14V
      Delay_ms(3000);
    //  Interrupt_DIS();
     //engine started
     while(Vbat>895){
         Vbat=ADC_Read(1);
         LED_Stat=1;
         Delay_ms(100);
         LED_Stat=0;
         Delay_ms(100);
         m=0;
         n=0;
         }
     while(j<450){        //Step out time ~5min
          j++;
          LED_Stat=1;
          Delay_ms(400);
          LED_Stat=0;
          Delay_ms(400);
          }
          j=0;
//Reset INT1 output
          ADXL345_Reset();
     //     Interrupt_EN();
          }

//Send sms, low battery
     if(Vbat<703){  //<11.5V
       Delay_ms(10000);
       Vbat=ADC_Read(1);
    //   Interrupt_DIS();
       if((Vbat<775)&&(n==0)){
         n++;
         b=2;
         LED_Stat=1;
         LED_RFstat=1;
         RF_EN=1;
         Delay_ms(100);
         SIM800_rst=1;
         Delay_ms(35000);    //Gsm net search
      //   Send_GSM();
         Delay_ms(20000);    //Time to send sms
         SIM800_rst=0;
         Delay_ms(100);
         RF_EN=0;
         LED_Stat=0;
         LED_RFstat=0;
         b=1;
         }
       ADXL345_Reset();
    //   Interrupt_EN();
       }
}

//doors opened
//stay in loop for 5min
void interrupt(){
    if(C1IF_bit){
       int_Flag=1;
       while((j<50)){          //700
            LED_Stat=1;
            Delay_ms(50);
            LED_Stat=0;
            Delay_ms(50);
            j++;
            }
           j=0;
           C1IF_bit=0;
           int_Flag=0;
       }
}

void main(){
    Init_main();

    while(1){
      //   Led();
      //   if(int_Flag==0){
      //     Read_Vbat();
      //     Read_ADXL345();
      //     }
         }
}
Användarvisningsbild
sodjan
EF Sponsor
Inlägg: 43176
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping
Kontakt:

Re: Konstigt beteende på program.

Inlägg av sodjan »

Inerruptet triggas så länge som förutsättningen finns. T.ex att pulsen är kvar
under/över en nivå där komparatorn larmar eller att du inte har nollat IF flaggan.
Användarvisningsbild
newbadboy
Inlägg: 2426
Blev medlem: 16 september 2006, 19:16:28
Ort: Landskrona
Kontakt:

Re: Konstigt beteende på program.

Inlägg av newbadboy »

Rimligen, där håller jag med. Men därför tycker jag det är skumt, att det funkar perfekt precis på det sättet du beskriver om jag inte ha ngt i main. Direkt jag har kod körandes i main så triggar interruptet hela tiden. Inkoppling och hårdvara är samma hela tiden. :(

If flaggen nollas. Provade att inte nolla flaggan och inte ha ngn aktiv kod körandes main, då triggades interruptet som väntat så nollning av flaggan som görs funkar. det bör inte vara problemet.
Användarvisningsbild
newbadboy
Inlägg: 2426
Blev medlem: 16 september 2006, 19:16:28
Ort: Landskrona
Kontakt:

Re: Konstigt beteende på program.

Inlägg av newbadboy »

Det sista jag hann prova för dagen var att jag bortkommenterad allt som hade med ADC att göra. Då verkar inte interruptet trigga mer. Måste kolla mer imorgon
Användarvisningsbild
sodjan
EF Sponsor
Inlägg: 43176
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping
Kontakt:

Re: Konstigt beteende på program.

Inlägg av sodjan »

Om du "inte har något i main", var befinner sig processorn då?
Om du inte håller processorn i "sleep", så måste den ju köra
instruktioner någonstans ifrån...
Användarvisningsbild
newbadboy
Inlägg: 2426
Blev medlem: 16 september 2006, 19:16:28
Ort: Landskrona
Kontakt:

Re: Konstigt beteende på program.

Inlägg av newbadboy »

Håller den inte inte i sleep. Men den utför ibget bara snurrar antar jag. Sedan ligger ju interrupt rutinen i bakgrunden och kör
Användarvisningsbild
sodjan
EF Sponsor
Inlägg: 43176
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping
Kontakt:

Re: Konstigt beteende på program.

Inlägg av sodjan »

Processorn kan inte bara ligga och "snurra". Om den inte är i "sleep",
eller om man inte håller i den hårt med reset-pinnen, så kommer den
alltid att försöka köra instruktioner från minnet.

Du kanske menar med "inget i main" att du har en tom while loop
utan innehåll? Men det är ju inte "inget". Då innehåller main i princip
en GOTO till sig självt. Men sen så ska det ju inte spela någon roll om
det ser ut så eller om man även gör något mer (lite beroende på vad
detta är för något, så klart), den övergripande funktionen bör vara samma.

För processorn finns det ingen "bakgrund". Ett interrupt är bara ett sätt
att asynkront (utan att man i koden själv gör en CALL) anropa en funktion
då något händer, internt eller externt. Men för prcessorn är det i princip
som en CALL/RETURN av vilken funktion som helst, plus någon flagga
som hanteras. Main och interrupt rutinen körs aldrig samtidigt, så klart.

Aja, lite svårt att säga något mer utan ett par enkla exempel som "fungerar"
och som "inte fungerar". Med allt bortplockat utom det som absolut behövs
för att via på fenomenet.
Användarvisningsbild
newbadboy
Inlägg: 2426
Blev medlem: 16 september 2006, 19:16:28
Ort: Landskrona
Kontakt:

Re: Konstigt beteende på program.

Inlägg av newbadboy »

Koden är postad i tråden så du har nog missat det. Ja det är en tom while loop eftersom jag kommenterat bort allt i den för testandets skull.

Men som jag nämnde verkar problemet ev hänga ihop med adcn. Kommenterar bort ADC grejerna men låter annat köras som vanligt så triggas inte interruptet hela tiden.
Användarvisningsbild
sodjan
EF Sponsor
Inlägg: 43176
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping
Kontakt:

Re: Konstigt beteende på program.

Inlägg av sodjan »

Du kanske fortfarande har IF flaggan för ADC'n "enablad" efter testerna med ADC?
Annars så ska ju inte ADC'n som sådan generera några interrupt "av sig självt"...
Användarvisningsbild
newbadboy
Inlägg: 2426
Blev medlem: 16 september 2006, 19:16:28
Ort: Landskrona
Kontakt:

Re: Konstigt beteende på program.

Inlägg av newbadboy »

Ska kolla det imrogon. Jag har dock inte använt ADC interrupt. Den läser jag på traditionellt sätt. Men ska sätta den flaggan oavsett för säkerhets skull
Användarvisningsbild
Swech
EF Sponsor
Inlägg: 4693
Blev medlem: 6 november 2006, 21:43:35
Ort: Munkedal, Sverige (Sweden)
Kontakt:

Re: Konstigt beteende på program.

Inlägg av Swech »

När du skriver att spiken dyker upp på matningsspänningen
menar du då på 12V batteripolen?
Eller vad menar du?

Swech
Användarvisningsbild
newbadboy
Inlägg: 2426
Blev medlem: 16 september 2006, 19:16:28
Ort: Landskrona
Kontakt:

Re: Konstigt beteende på program.

Inlägg av newbadboy »

Stämmer bra det. Min larmdongel kommer vara inkopplad på obd kontaktens permanenta matning och där syns även spänning dippen när man låser upp dörrarna.

Dock kör jag nu i labbet med en powerbox och sänker manuellt.

Har testat i bilen och komparator interruptet fångar den snabba dippen så den delen funkar fint.
Men som sagt det är endast med powerbox jag kör just nu


Hur så?
Användarvisningsbild
newbadboy
Inlägg: 2426
Blev medlem: 16 september 2006, 19:16:28
Ort: Landskrona
Kontakt:

Re: Konstigt beteende på program.

Inlägg av newbadboy »

Jag tror jag har hittat problemet med att den triggar själv. Både ADC ingången och COMP ingången använde båda samma spänningsdelare. Jag satte en spänningsdelare till COMP och nu självtriggar den inte iaf :)

Dock tror jag det är ngt jag missar med inställningarna. Jag har satt att den skall trigga under ca 12V men hur jag än ställer registerna så triggar den på över 12V och den fortsätter trigga sålänge jag är över 12V. Trodde den bara skall trigga på flanker och inte nivå
registerna nedan är satta av mig.

//DAC setup and connect to comparator
DACCON0=0b11000000;
DACCON1=0b00011000; // below ~3.7V (= 11.85V) 0b00011000

//Comparator setup
CM1CON0=0b10001111;
CM1CON1=0b01010000;
Skriv svar