Временная задержка на моем PIC

Приготовьтесь к нубскому вопросу.

Я пишу очень простой код для этого нового PIC, который я только что получил. Все, что я пытаюсь сделать, это мигать светодиодом. Ниже приведены два примера кода — первый работает, а второй нет. Почему?? Не вижу проблем со вторым.

РАБОТАЕТ:

        while(1)
{
    i=99999;
    while(i--) {
        LATAbits.LATA0 = 0;  // set RA0 to logic 1
    }
    i=99999;
    while(i--) {
    LATAbits.LATA0 = 1;  // set RA0 to logic 0
    }
}    

НЕ РАБОТАЕТ:

        while(1)
{
    LATAbits.LATA0 = 1;  // set RA0 to logic 1
    for(i=0;i<99999;i++) {}
    LATAbits.LATA0 = 0;  // set RA0 to logic 0
    for(i=0;i<99999;i++) {}
}

Заранее спасибо за помощь!


person edipo99    schedule 11.01.2014    source источник


Ответы (2)


Попробуй это:

while(1)
{
    for(i=0;i<99999;i++) 
    {
        LATAbits.LATA0 = 1;  // set RA0 to logic 1
    } 
    for(i=0;i<99999;i++) 
    {
        LATAbits.LATA0 = 0;  // set RA0 to logic 0
    }
}

Возможно, ваш компилятор оптимизирует и игнорирует операторы for, поскольку у них нет кода для выполнения внутри. Что я сделал, так это поместил назначение RA0 в эти операторы, заставив компилятор сохранить циклы задержки.

Вы также можете передать аргумент -S своему компилятору, чтобы увидеть сгенерированный код сборки и подтвердить, что операторы for были удалены. Параметр -S создает промежуточный файл с расширением ".S".

person Lucio Paiva    schedule 12.01.2014
comment
Да, спасибо, это похоже на ответ. Итак, если мне нужен код, который на самом деле ничего не делает, для выполнения в цикле for, могу ли я использовать что-то вроде asm(NOP)? - person edipo99; 12.01.2014
comment
Я всегда пишу код для PIC прямо на ассемблере, поэтому не могу этого подтвердить; это имеет смысл, так что, вероятно, да, это будет работать так, как вы ожидаете. - person Lucio Paiva; 12.01.2014
comment
Какой компилятор вы используете? Вы, вероятно, можете использовать __asm__("NOP");, но это не работает для всех из них. - person DrRobotNinja; 13.01.2014

  1. Каково ваше определение i? char i? int i? long i?
  2. Какой ПИК вы используете?

Если вы используете int, 8-битные PIC используют 16-битный int.

Итак, что происходит:

// Try to stuff 99999 into 16-bits, but it becomes 34463
i=99999;

// Count-down from 34463 to zero
while(i--) {}

// Successfully exit delay

В отличие от:

// Count up from zero
// Get to 65535 and then reset to zero
// Never reach 99999
for(i=0;i<99999;i++) {}
// Never exit delay

Попробуйте использовать unsigned long int для i, который имеет тенденцию быть 32-битным на PIC, и посмотрите, начнет ли он работать.

person DrRobotNinja    schedule 13.01.2014