Бесконечный цикл MPLAB

У меня есть 2 вопроса.

Первый: у меня проблема в поведении этого кода; когда запускаю в протеусе программа заставляет прошивальщик "повторять код в основной функции" что делать?

Это код:

#include <p18f452.h>
#include <delays.h>
#include <io.h>

void main ()
{
    TRISC=0x00;
    PORTC=0xff;
    Delay1KTCYx(900);
    PORTC=0x00;
    Delay1KTCYx(900);
    while(1)
    {

    }
}

Второй вопрос: какую правильную функцию задержки я могу использовать? и как я могу измерить время задержки?


person Gehad Mohamed    schedule 21.04.2017    source источник
comment
Ваш код будет мигать только один раз, чтобы исправить это перемещение строк PORTC и задержки в тело цикла.   -  person Colin    schedule 21.04.2017


Ответы (2)


Сторожевой таймер отключен в моделировании? Если он включен, это вызовет повторение программы.

Попробуйте добавить эту строку после include.

#pragma config WDT = OFF
person fjardon    schedule 21.04.2017
comment
я так и сделал но проблема осталась - person Gehad Mohamed; 22.04.2017

У вас есть только код для создания одной вспышки. Переместите вспышку и задержки в цикл:

for(;;)
{
  PORTC = 0xff;
  Delay1KTCYx(900);
  PORTC = 0x00;
  Delay1KTCYx(900);
}

Примерное измерение можно выполнить вручную, синхронизировав N с секундомером. Конечно, проще использовать измерительный прибор (для этого подойдет осциллограф), если он у вас есть.

Кроме того, поскольку ваш рабочий цикл составляет 50%, вы можете упростить код:

PORTC = 0;
for (;;)
{
  PORTC = ~PORTC;
  Delay1KTCYx(900);
}

Это использует побитовое не (~) для инвертирования битов PORTC, что заставит их переключаться с единицы на ноль и наоборот. Установка всего порта в 0 перед циклом гарантирует, что все контакты находятся в известном состоянии.

person unwind    schedule 21.04.2017
comment
я знаю, что этот код генерирует одну вспышку, но в симуляции код генерирует бесконечное количество вспышек - person Gehad Mohamed; 21.04.2017
comment
@GehadMohamed Хорошо, это звучит странно. Возможно, симулятор сбрасывает смоделированную машину, когда обнаруживает бесконечный цикл, что приводит к перезапуску программы и созданию новой вспышки и т. д. Я только предполагаю сейчас, конечно. - person unwind; 21.04.2017
comment
Любая причина для использования PORTC ^= 0xFF, а не PORTC = ~PORTC, просто кажется мне немного менее интуитивной. Рекомендуется записывать в регистр LATx, а не в регистр PORTx. - person Colin; 21.04.2017
comment
@Colin__s Нет причин, поменял. Недостаточно знаком с PIC18, чтобы вводить другие регистры, старался держать его близко к коду OP для простоты понимания. Конечно, не стесняйтесь редактировать или публиковать новый ответ. - person unwind; 21.04.2017