:シンプルな割り込みプログラムトラップ/ CPUをフリーズ(USART/PIC18F /マイクロチップ/ XC8)私は、次の使用しています
- PIC18F4550を、
- xc8コンパイラ、
- MPLAB X IDEがV3.20、
- トランスミッタとレシーバモジュール(メインプログラムを使用してテストされていますが、中断や動作はありません)。
- のLED(1 =点灯)
- ボタン//この時点では重要ではない
どうやらこのコードのすべてがうまく動作しますが、割り込みがあります。"void interrupt SerialComm(void)"
(割り込みなしでプログラムを作成し、点灯しました)
メインはロードさえしません。私は"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;
}
}
割り込みベクタテーブルに割り込みを登録しましたか? – Lundin
最初にPORTD = 0x0Fを行いますが、突然後でPORTD = 0x01で上書きされます。 PORTD.0(lsbビット)に接続されているものは何ですか?そのピンに電圧があるかどうかを確認してください(おそらくそうしているので、メインがwhile()に入ります)。 – linuxfan
@linuxfan 実際には、ビット0 = 1の場合は3つのピンがLEDに接続され、LEDの1つが点灯し、ビット1とビット2が同じように0x0Fがすべて点灯しますが、メインプログラムが完全に起動する場合、 whileループの0x01で本当に高速にオーバーライドされるので、RD0のLEDが点灯し、残りはオフになりますが、何も点灯しないので、私が作成した割り込み関数であると仮定しています。 //私は何かが私が作成した割り込み機能にCPUをトラップされていますが、私は –