c - 简单中断程序陷阱/卡住cpu(USART/PIC18F/MICROCHIP/XC8)

标签 c interrupt pic pic18 xc8

我正在使用以下内容:

  • pic18f4550,
  • xc8 编译器,
  • mplab x ide v3.20,
  • 发射器和接收器模块(使用主程序进行测试,没有任何中断和工作)。
  • LED 连接到 RD0、RD1 和 RD2(1 = 亮起)
  • 连接到 RB0、RB1 和 RB2 的按钮(0 = 按钮被按下)//此时无关紧要

显然此代码中的所有内容都工作正常,但有中断 "void interrupt SerialComm(void)"
(我做了一个不中断的程序,led灯亮了)。

主甚至没有加载;我已经把 "PORTD = 0x0F",
(主程序的第 3 行)。

因此,如果 LED 灯亮起,则意味着至少主程序的第 3 行可以正常工作。
(至少在那条线之前,但是 led 没有。)

是否有任何寄存器我必须先禁用我错过了这个?
另外,我已经学习了大多数教程,有没有我错过的东西?, 我见过很多带有#pragma 的程序,但我不确定在使用 XC8 编译器时是否需要。

    /*
 * File:   transmit.c
 * Author: steve 
 *
 * Created on September 25, 2016, 12:36 AM
 */
#define _XTAL_FREQ 48000000

#include <xc.h>
#include <pic18f4550.h>
void DelayMs(int x);
char ButtonsChecker();
char ButtonsCheckValue = 0; //returned value
char data_received = 0;


void main(void) {
    TRISB = 0x0F;
    TRISD = 0b00000000;

    TRISCbits.TRISC2 = 0; //TXD Power
    TRISCbits.TRISC6 = 0; //RC6 
    TRISCbits.TRISC7 = 1; //RC7
    PORTCbits.RC2 = 1;

    RCSTA = 0x90;
    TXSTA = 0x20;
    SPBRG = 77;

    RCREG = 0;
    RCIF = 0;


    PORTDbits.RD0 = 1;
    PORTDbits.RD1 = 1;
    PORTDbits.RD2 = 1;

    RCIE = 1;
    TXIE = 0;

    PEIE = 1;
    GIE = 1;

    while (1) {

        while (ButtonsChecker()) {

            TXREG = ButtonsChecker();
        }


        //while (!TRMT); // waiting for a whole data frame to be ready for a transmission
        //TXREG = PORTB;

        //while (!RCIF); // waiting for a whole data frame to be received
        //PORTD = RCREG;

    }
}

void DelayMs(int x) {
    while (x > 0) {
        __delay_ms(1);
        x--;
    }
}

char ButtonsChecker() {
    if (PORTBbits.RB0 == 0) {
        ButtonsCheckValue = 1;
    } else if (PORTBbits.RB1 == 0) {
        ButtonsCheckValue = 2;
    } else if (PORTBbits.RB2 == 0) {
        ButtonsCheckValue = 4;
    }//else if (PORTBbits.RB3 == 0) {
        // ButtonsCheckValue = 8;}
    else ButtonsCheckValue = 0;

    return (ButtonsCheckValue);
}


void interrupt ReceiveData() {
    if (RCIF == 1) {
        RCIF = 0;
        ~PORTDbits.RD1;
    }
}

最佳答案

一切看起来都很好。除了你没有启用 TX 和 RC 中断。 所以在 USART 启动时添加:

PIE1bits.RCIE = 1;
PIE1bits.TXIE = 1;

在启动部分的末尾还添加:

INTCONbits.GIE = 1; 

...启用全局中断。

关于c - 简单中断程序陷阱/卡住cpu(USART/PIC18F/MICROCHIP/XC8),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41675576/

相关文章:

html - 用C从html文件中提取纯文本

linux - 一个简单的汇编代码导致段错误?

c - 为什么Linux内核在preempt_schedule_irq中启用中断?

c - PIC24F16KA102 上的定时器 1 不工作

c++ - 支持单个位偏移的类似“memcpy”的函数?

c - 当在由结构组成的树上使用 qsort() 时,我没有收到排序后的数组

c - 操作系统: Isn't it a wrong practice to switch to another process with the interrupt blocked?

c - 在 MikroC 上将存储体数量设置为 8

pic - 免费的 PIC C 编译器

c - 为什么 char* 创建一个字符串?