Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

PIC C Compiler - a numeric expression must appear here

daggie_maggie 16 Sty 2011 19:49 1706 4
  • #1 16 Sty 2011 19:49
    daggie_maggie
    Poziom 8  

    witamy!

    takie komunikat otrzymujemy podczas próby kompilacji oprogramowania do mikroprocesora

    input ma wynosić 1 gdy napięcie z czujników CNY70 jest >2,5 a 0 gdy mniejsze, dlatego nie zamieniamy sygnału na analogowy (próbowałyśmy w sumie, ale błąd był ten sam)

    problem pojawia się przy wszystkich if-ach:
    if((value1) && (!value2)) && (value3))

    zamiana int na short int przy deklaracji value nie pomogła

    jak można rozwiązać ten problem?


    Code:
    #include <16F88.h>
    
    #use delay(clock=4000000)

    #define SEN1 PIN_A0
    #define SEN2 PIN_A1
    #define SEN3 PIN_A2
    #define SER1 PIN_B6
    #define SER2 PIN_B7

    //PORTA //0000000
    //TRISA = 0b00000111


    void delay_min (void);
    void delay_var (char n);
    void pause (void);

    void main(){

      int value1;
      int value2;
      int value3;
     
     int pos1=127;
     int pos2=127;
     
    setup_ccp1(CCP_PWM);
    //setup_port_a(ALL_ANALOG);
    //setup_adc(ADC_CLOCK_INTERNAL);
    //ANSEL=0b00000001;


    //CCP1CON=0b01100000;   //- 01100000 - Put into PWM mode - 8 bit mode

    while(1)
    {
     value1=input(SEN1);
     value2=input(SEN2);
     value2=input(SEN3);


    if((value1) & (value2) & (~value3))) //w lewo
    {

    output_high(SER1);
    pos1=57;
    delay_var(pos1);
    output_low(SER1);

    output_high(SER2);
    pos2=127;
    delay_var(pos2);
    output_low(SER1);

    };

    if((value1) && (!value2)) && (value3)) //centralnie
    {

    output_high(SER1);
    pos1=57;
    delay_var(pos1);
    output_low(SER1);

    output_high(SER2);
    pos2=57;
    delay_var(pos2);
    output_low(SER2);

    };

    if((value1) && (!value2) && (!value3))) //lekko w lewo
    {
    output_high(SER1);
    pos1=57;
    delay_var(pos1);
    output_low(SER1);

    output_high(SER2););
    pos2=127;
    delay_var(pos2);
    output_low(SER2);
    };

    if((!value1) && (value2)) && (value3)) //w prawo
    {
    output_high(SER1);
    pos1=127;
    delay_var(pos1);
    output_low(SER1);

    output_high(SER2);
    pos2=57;
    delay_var(pos2);
    output_low(SER2);
    };

    if((!value1)) && (!value2)) && (value3)) // lekko w prawo
    {
    output_high(SER1);
    pos1=127;
    delay_var(pos1);
    output_low(SER1);

    output_high(SER2);
    pos2=57;
    delay_var(pos2);
    output_low(SER2);
    };
    pause();

    } //od while



    } // od main


    void delay_min (void)  // 750 uS including overhead
    {
    char n=248;
    do ; while(--n>0);
    delay_ms(1); //  padding to produce precise time
    }
    // delay = 2 + 2 + (n x 3) -1 +1 +2 = 750us  @ 4MHz
    // 2 for call, 2 for preset n, (n x 3)-1 for loop, 1 padding, 2 for return

    void delay_var (char n) // adc x 7 uS = 1790us max.
    {
    do {delay_ms(4);} while(--n>0);
    }
    // delay= 2 + 2 + (t x 7) -1 +2 us  @ 4MHz

    void pause (void)  // delay between pulses approx 20 ms
    {
    char n;
    for (n=0;n<26;n++)
     {
     delay_min();   // 750 us
     }
    }

    0 4
  • #2 16 Sty 2011 20:08
    Morpheusss
    Poziom 15  

    Zacząłbym od policzenia nawiasów ;)
    w pierwszym IFie jest jeden zbędny ')', dalej nie szukałem.

    0
  • #3 16 Sty 2011 21:59
    mirekk36
    Poziom 42  

    Przede wszystkim to zacznij pisać program zgodnie ze sztuką. Już zastosowanie samych wcięć , odstępów i liczenie nawiasów - dużo by tu pomogło.

    0
  • #4 16 Sty 2011 22:26
    LordBlick
    VIP Zasłużony dla elektroda

    Kod w tagach [code][/code] byłby tu odpowiedniejszy zamiast [quote][/quote].

    0
  • #5 17 Sty 2011 11:34
    daggie_maggie
    Poziom 8  

    nawias był problemem :) dzięki

    0