Микроконтроллер PIC - __delay_ms() не действует

Я новичок в программировании на C на микроконтроллере pic. Я медленно просматриваю различные учебные пособия и литературу, чтобы попытаться применить свои знания.

В настоящее время я пытаюсь мигать светодиодом с помощью pic16f1619, используя плату любопытства, используя MPLAB IDE X, в частности контакт A5.

Мой код выглядит следующим образом:

#include <xc.h>
#include <stdlib.h>
#include <stdio.h>

#define _XTAL_FREQ 32000000 //internal oscillator of pic16f1619 is 32MHz

// Above is header files - xc is for compiler, stdlib is for general  function             and stdio is for I/O
// Below is the bit configuration - this is taken from the curiosity mcc    generated bit configuration

// CONFIG1

#pragma config FOSC = INTOSC    // Oscillator Selection Bits (INTOSC    oscillator: I/O function on CLKIN pin)
#pragma config PWRTE = OFF      // Power-up Timer Enable (PWRT disabled)

#pragma config MCLRE = ON       // MCLR Pin Function Select (MCLR/VPP pin    function is MCLR)

#pragma config CP = OFF         // Flash Program Memory Code Protection    (Program memory code protection is disabled)

#pragma config BOREN = ON       // Brown-out Reset Enable (Brown-out Reset    enabled)

#pragma config CLKOUTEN = OFF   // Clock Out Enable (CLKOUT function is    disabled. I/O or oscillator function on the CLKOUT pin)

#pragma config IESO = ON        // Internal/External Switch Over (Internal    External Switch Over mode is enabled)

#pragma config FCMEN = ON       // Fail-Safe Clock Monitor Enable (Fail-Safe    Clock Monitor is enabled)


// CONFIG2

#pragma config WRT = OFF        // Flash Memory Self-Write Protection (Write    protection off)

#pragma config PPS1WAY = ON     // Peripheral Pin Select one-way control (The    PPSLOCK bit cannot be cleared once it is set by software)

#pragma config ZCD = OFF        // Zero Cross Detect Disable Bit (ZCD disable.  ZCD can be enabled by setting the ZCDSEN bit of ZCDCON)

#pragma config PLLEN = ON       // PLL Enable Bit (4x PLL is always enabled)

#pragma config STVREN = ON      // Stack Overflow/Underflow Reset Enable (Stack Overflow or Underflow will cause a Reset)

#pragma config BORV = LO        // Brown-out Reset Voltage Selection (Brown-out Reset Voltage (Vbor), low trip point selected.)

#pragma config LPBOR = OFF      // Low-Power Brown Out Reset (Low-Power BOR is disabled)

#pragma config LVP = ON         // Low-Voltage Programming Enable (Low-voltage programming enabled)

// CONFIG3

#pragma config WDTCPS = WDTCPS1F// WDT Period Select (Software Control (WDTPS))

#pragma config WDTE = OFF       // Watchdog Timer Enable (WDT disabled)

#pragma config WDTCWS = WDTCWSSW// WDT Window Select (Software WDT window size control (WDTWS bits))

#pragma config WDTCCS = SWC     // WDT Input Clock Selector (Software     control, controlled by WDTCS bits)

void main(void) {
TRISAbits.TRISA5= 0; // set pin as output
LATAbits.LATA5 = 1;  //set pin as high

while(1)
{
LATAbits.LATA5 = 1;  //set pin as high
__delay_ms(1000); //delay of 1second
LATAbits.LATA5 = 0;  //set pin as high
}

}

На данный момент нет никакого влияния на вывод контакта A5. Я попытался изменить функцию вывода с помощью разных регистров. Любая помощь будет принята с благодарностью! Я знаю этот код - LATAbits.LATA5=~ LATAbits.LATA5; // Переключить бит порта A5

Любая помощь будет принята с благодарностью, так как я действительно застрял!

Что значит "Я знаю этот код - LATAbits.LATA5=~ LATAbits.LATA5;" иметь в виду?

Ответы (1)

while(1) {
  LATAbits.LATA5 = 1;  //set pin as high
  __delay_ms(1000); //delay of 1second
  LATAbits.LATA5 = 0;  //set pin as low
}

Вы не позволяете светодиоду оставаться выключенным достаточно долго, чтобы его заметили. Вы вбиваете булавку в последнюю линию петли while. Как только это происходит, выполнение возвращается к началу цикла. Немедленно вы включаете светодиод. Если вы можете посмотреть на цифровой выход с помощью осциллографа, вы должны увидеть очень короткий провал длительностью порядка микросекунды. Это слишком коротко для глаза, чтобы заметить. Так что добавьте еще одну задержку.

while(1) {
  LATAbits.LATA5 = 1;  //set pin as high
  __delay_ms(1000); //delay of 1second
  LATAbits.LATA5 = 0;  //set pin as low
  __delay_ms(1000);   // <- 
}

ps Это популярная ошибка в "Hello Blinky LED!" программы.

Кроме того, чтобы избежать путаницы, ваш второй комментарий должен быть «установить пин как низкий».