Закъснение във времето на моята снимка

Подгответе се за неудобен въпрос.

Пиша някакъв изключително прост код за този нов 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. Какъв PIC използвате?

Ако използвате 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