рис 18F4550: проблема локальной переменной, - PullRequest
1 голос
/ 21 апреля 2011

Я использую pic18F4550 с микрочипом v8.63 и с компилятором C 18.Я использую LDR, который извлекает значение светодиода (не на моей плате Picdem) (красный, зеленый и синий), эти значения сохраняются в переменной после каждого преобразования.После этого, когда я нажимаю кнопку S2, я захожу в метод ISR: эта часть работает.

Но теперь: я пытаюсь сравнить переменную red, green и blue в if: но я думаю, что это не такслучается, он просто идет к моему «другому» (привел RB3 на моей доске для записи карт).

#include <p18f4550.h>  

/** V E C T O R  R E M A P P I N G *******************************************/

extern void _startup (void);        // See c018i.c in your C18 compiler dir
#pragma code _RESET_INTERRUPT_VECTOR = 0x001000
void _reset (void)
{
    _asm goto _startup _endasm
}
#pragma code
void ISR (void);
#pragma code _HIGH_INTERRUPT_VECTOR = 0x001008
void _high_ISR (void)
{
      _asm goto ISR _endasm
}

#pragma code _LOW_INTERRUPT_VECTOR = 0x001018
void _low_ISR (void)
{
    ;
}
#pragma code
/******************************************************************************/

// global variable, value off LDR.
unsigned int var1ADRESH = 0x00;
unsigned int color_red = 0;
unsigned int color_green = 0;
unsigned int color_blue = 0;

void main (void)
{   
    TRISD = 0x00;               // PORTD  als uitgang

    RCONbits.IPEN = 0;          // prioriteit uit
    INTCONbits.GIE = 1;         // enable interrupt
    INTCONbits.RBIE = 1;        // interrupt portB aan

    //= set up port =
    TRISAbits.TRISA0 = 1;           // Set RA0/AN0 to input
    //leds
    TRISAbits.TRISA3 = 0;
    TRISAbits.TRISA4 = 0;
    TRISAbits.TRISA5 = 0;
    LATAbits.LATA3 = 1;
    LATAbits.LATA4 = 1;
    LATAbits.LATA5 = 1;

    ADCON0 = 0b00000000;            // Set channel select to AN0
    ADCON1 = 0b00001110;            // Configure RA0/AN0 as analogue
    ADCON2 = 0b10101010;            // Right justified result
                                    // TAD 12 and FOSC 32 - may need to adjust this
                                    // depending on your clock frequency (see datasheet)

    while(1)
    {   
        _asm sleep _endasm  
    }
}

#pragma interrupt ISR
void ISR (void)
{
    if (INTCONbits.RBIF==1) {

        //conversie blauw
        LATAbits.LATA3 = 0;
        ADCON0bits.ADON = 1;            // Enable ADC   
        // read LDR value.
        ADCON0bits.GO = 1;              // Set the GO bit of the ADCON0 register to start the conversion.
        while (ADCON0bits.GO);          // Wait until the conversion is complete.
        ADCON2bits.ADFM = 0;            // read result as 8-bit. (dus data in ADRESH) ! 
        //= read data in ADRESH =
        var1ADRESH = ADRESH;    // reading value from LDR

        color_blue = ADRESH; //waarde in blauw

        //conversie rood
        LATAbits.LATA3 = 1;
        LATAbits.LATA4 = 0;

        ADCON0bits.ADON = 1;            // Enable ADC   
        // read LDR value.
        ADCON0bits.GO = 1;              // Set the GO bit of the ADCON0 register to start the conversion.
        while (ADCON0bits.GO);          // Wait until the conversion is complete.
        ADCON2bits.ADFM = 0;            // read result as 8-bit. (dus data in ADRESH) ! 
        //= read data in ADRESH =
        var1ADRESH = ADRESH;    // reading value from LDR

        color_red = ADRESH; //waarde in blauwe steken

        //conversie groen
        LATAbits.LATA4 = 1;
        LATAbits.LATA5 = 0;

        ADCON0bits.ADON = 1;            // Enable ADC   
        // read LDR value.
        ADCON0bits.GO = 1;              // Set the GO bit of the ADCON0 register to start the conversion.
        while (ADCON0bits.GO);          // Wait until the conversion is complete.
        ADCON2bits.ADFM = 0;            // read result as 8-bit. (dus data in ADRESH) ! 
        //= read data in ADRESH =
        var1ADRESH = ADRESH;    // reading value from LDR

        color_green = ADRESH; //waarde in blauwe steken

        // alles uitzetten
        //PORTB = 0b1111111;
        LATAbits.LATA5 = 1;

        if(color_blue > color_red && color_blue > color_green){
            //blauw
            LATDbits.LATD0 = 1;
        }
        if(color_red > color_blue && color_red > color_green){
            //rood
            LATDbits.LATD1 = 1;
        }
        if(color_green > color_red && color_green > color_blue){
            //groen
            LATDbits.LATD2 = 1;
        } 
        else {
            LATDbits.LATD3 = 1;
        }   
    }
    INTCONbits.RBIF = 0;
}

Ответы [ 2 ]

0 голосов
/ 01 мая 2011

Я обнаружил несколько странных вещей (но, признаюсь, ни один из них не мог быть источником).

Как только вы установите биты LATA, LDR немедленно изменит значение val? Конечно нет, но это вопрос нс, нас или мс? ... Я не вижу никаких задержек для времени установления LDR. Вы всегда спите, поэтому, вероятно, требуется установить ADON = 1 (проверьте DS). Тем не менее, проверьте DS устройства на предмет того, сколько времени AD нужно, чтобы его внутренние устройства были готовы и готовы после установки ADON = 1. По этому вопросу, как только ADON = 1, вы не должны и не должны устанавливать его заново в следующих двух приобретениях. То же самое и с форматом результата. Установите его один раз и сделайте это до того, как GO = 1. Не переустанавливайте каждую конверсию. Если вы используете только 8-битные результаты, почему unsigned int? (Между прочим, int довольно опасен в микроконтроллерах. Используйте short и символы и всегда указывайте явно).

Почему тогда назначение var1ADRESH color_xxx? когда биты LATD в конечном итоге получают = 0? Ваш If else работает только на последней ветке. Я полагаю, вы намеревались создать if {} else if {} else if ... *. 1005 *

0 голосов
/ 01 мая 2011
  • Попробуйте установить все три из LATA3,4,5 перед каждым считыванием?
  • Установить TRIS для D0..2
...