Я использую следующее:
- pic18f4550,
- компилятор xc8,
- mplab x ide v3.20,
- модуль передатчика и приемника (протестирован основной программой без перебоев и работает).
- Светодиоды подключены к RD0, RD1 и RD2 (1 = светится)
- Кнопки, подключенные к RB0, RB1 и RB2 (0 = кнопка нажата) // на этом этапе не имеет значения
Судя по всему, в этом коде все работает нормально, но с прерываниями "void interrupt SerialComm(void)"
(я сделал программу без прерывания и загорается светодиод).
Основная даже не загружается; Я поставил "PORTD = 0x0F",
(строка 3 основной программы).
Таким образом, если светодиод загорается, это означает, что работает как минимум 3-я строка основной программы.
(по крайней мере, до этой строки, но светодиод не работал).
Есть ли какой-нибудь регистр, который я должен сначала отключить, который я пропустил из-за этого?
Кроме того, я следил за большинством руководств, может быть что-то я пропустил? Я видел много программ с #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;
}
}