8ビットPIC用のファームウェアの作成に慣れています。 RXコマンドを受け取るLEDモジュールにPIC16F1829を使用しています。私は、RXピンで一定の値が受信されたときにLEDを点灯させるような基本設定をしようとしていますが、それを得ることさえできません。PIC16F1829 UART RX割り込みがMPLABXとXC8コンパイラを使用していません
割り込み経由でUARTを動作させたいのですが、メインループでポーリングを行うことさえできません。私の割り込みベクトルは以下のコードでコメントアウトされています。
RXピン:RC5
TXピン:オンとオフのLEDを切り替えるRB7
ピン:RA5
ピンRA5は、オンとオフのLEDを切り替えるには正常に動作します。 TXピンは動作していますが、RCIFが機能していないのと同様に、TXIF割り込みも機能していないかどうか確認していません。
私はRCIFとPIR1bits.RCIFを読んでみました。どちらもコンパイルされています。どちらもうまくいきませんでした。私は2つの異なるLEDモジュール上の2つの異なるPICでこれを試しました。それらはオンになりますが、RXピンを読み取ってもどちらでも動作しませんでした。
変数RXINは最初は3と定義されています。したがって、メインループ内のRXIN_ループによって、ライトが起動時に3回点滅するため、メインループに入ることがわかります。しかし、RCIF割り込みがRXピンでの受信時に発火していないことが分かります。
オシロスコープで、同じボーを使用してRXとTXピンの信号が一致していることを確認しましたので、ボーレートが正しく設定されていると思います(300ボー、8N1)。 5V信号。これまでRCIFをポーリングしたり、割り込みサービスルーティングを使用したりしていませんでした。私が見ていないコードで誰かが問題を見ることができれば、あなたの助けに感謝します。
マイコード:
#include <stdio.h>
#include <stdlib.h>
#include <xc.h>
// This is for 300 baud rate
#define _BAUD_PRESCALER_LOW_ 0x2A
#define _BAUD_PRESCALER_HIGH_ 0x68
#define _XTAL_FREQ 32000000
#pragma config FOSC = INTOSC // Oscillator Selection->INTOSC oscillator: I/O function on CLKIN pin
#pragma config WDTE = OFF // Watchdog Timer Enable->WDT enabled
#pragma config PWRTE = OFF // Power-up Timer Enable->PWRT disabled
#pragma config MCLRE = OFF // MCLR Pin Function Select->MCLR/VPP pin function is digital input
#pragma config CP = OFF // Flash Program Memory Code Protection->Program memory code protection is disabled
#pragma config CPD = OFF // Data Memory Code Protection->Data 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 = OFF // Internal/External Switchover->Internal/External Switchover mode is disabled
#pragma config FCMEN = OFF // Fail-Safe Clock Monitor Enable->Fail-Safe Clock Monitor is disabled
// CONFIG2
#pragma config WRT = OFF // Flash Memory Self-Write Protection->Write protection off
#pragma config PLLEN = ON // PLL Enable->4x PLL 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 LVP = OFF
int flagRXFramingError = 0;
int flagRXOverrunError = 0;
volatile unsigned char RXIN = 3;
unsigned char UARTRead(){
return RCREG;
}
void writeRXIN(unsigned char a){
RXIN = a;
}
void TX(unsigned char a){
while(!TXIF){}
TXREG = a;
}
int main(int argc, char** argv) {
// SCS FOSC; SPLLEN disabled; IRCF 8MHz_HF;
OSCCON = 0xF0;
// TUN 0;
OSCTUNE = 0x00;
// Set the secondary oscillator
// Wait for PLL to stabilize
while(PLLR == 0)
{
}
// WDTPS 1:65536; SWDTEN OFF;
WDTCON = 0x16;
__delay_ms(5);
GIE = 1; // Global interrupts enabled
__delay_ms(5);
PEIE = 1; // Active peripheral interrupts enabled
__delay_ms(5);
RCIE = 1; // Enable USART Receive interrupt
__delay_ms(5);
TXIE = 1; // Enable USART Transmitter interrupt
__delay_ms(5);
ADIE = 1; // Enable ADC interrupts
__delay_ms(5);
RXDTSEL = 0; // RX is on RC5 pin
__delay_ms(5);
TXCKSEL = 0; // TX is on RB7 pin
__delay_ms(5);
TRISC5 = 1; // RX pin set as input
__delay_ms(5);
SPEN = 1; // Serial Port Enabled
__delay_ms(5);
SYNC = 0; // Asynchronous mode
__delay_ms(5);
RX9 = 0; // 8 bit reception
__delay_ms(5);
TX9 = 0; // 8-bit transmission
__delay_ms(5);
CREN = 1; // Receiver enabled
__delay_ms(5);
TXEN = 1; // Transmitter enabled
__delay_ms(5);
BRG16 = 1; // 16-bit baud generation
__delay_ms(5);
BRGH = 1; // High baud rate enabled
__delay_ms(5);
ABDEN = 0; // Auto baud detect disabled
__delay_ms(5);
// Baud prescaler n = [Fosc/(D*BR)] - 1
SPBRGH = _BAUD_PRESCALER_HIGH_;
__delay_ms(5);
SPBRGL = _BAUD_PRESCALER_LOW_;
__delay_ms(5);
TRISC6 = 0; // IadjPWM pin configured as output
__delay_ms(5);
ANSC6 = 0; // IadjPWM pin not analog input
__delay_ms(5);
TRISA5 = 0; // DimPWM pin configured as output
__delay_ms(5);
LATC6 = 1; // Max current for now until PWM written
__delay_ms(5);
while(1){
// Inline assembly code to clear watchdog timer
//asm("CLRWDT");
/*if(RXIN == 5){
RA5 = 1;
}
else{
RA5 = 0;
}*/
if(PIR1bits.RCIF){
writeRXIN(UARTRead());
//RA5 = 0;
TX(RXIN);
} // end if RCIF
while(RXIN > 0){
RA5 = 1;
__delay_ms(100);
RA5 = 0;
__delay_ms(100);
RXIN--;
}
}
// infinite loop
// never leave this loop
RA5 = 1;
return (EXIT_SUCCESS);
} // end main
/*void interrupt ISR(void){
if(RCIF){// if USART Receive interrupt flag
RA5 = 1;
if(FERR){
flagRXFramingError = 1;
SPEN = 0;
SPEN = 1;
}
if(OERR){
flagRXOverrunError = 1;
CREN = 0;
CREN = 1;
}
while(RCIF){ // RCIF high as long as there is data in FIFO register. Read RCREG to clear RCIF flag
writeRXIN(UARTRead());
}
RA5 = 0;
}
if (TXIF){// if USART Transmit interrupt
TXIF = 0; // Clear interrupt flag
}
} // end ISRs*/
レジスタへの書き込みの間の5msの遅延はナンセンスです。 5ミリ秒は厄介なPICでも永遠です。これらはオンチップのメモリマップドレジスタです。遅延はまったく必要ありません。 (いくつかの特殊なケースでは、ポートI/Oのデータ方向を設定してから数クロックサイクル待つ必要があるかもしれませんが、それはそれです。)5msの遅延をすべて取り除くことから始めます。 – Lundin
(将来の参照のための補足として、この質問はうまく話題になりますが、https://electronics.stackexchange.com/で特定のハードウェア周辺機器に関する質問がある場合は、 )特定のPIC上のUART。そのサイトとマイクロコントローラのファームウェアの質問に潜んでいるPICの専門家の多くは、そこに完全にトピックです。) – Lundin
しかし、私はこれをupvoteに強制されています、私はボーレートが正しく設定されていると思います(300ボー、8N1)。また、オシロスコープのRXピンが強くクリーンな5V信号を受信していることを確認しました。ハードウェアが動作していることをまったく示唆していない埋め込み質問が多すぎるので、ソフトウェアのQ&Aサイトでは投票がすぐに終了/削除/削除されなければならない;( –