會員登陸
帳號:

密碼:

記住我



忘記密碼?

現在註冊!
網站導航
最新下載
訪問統計 (自2012/5/3)


正在流覽:   1 名訪客





PIC18F26K20 USART使用問題
新會員
註冊日期:
2月03日 23:29:58
所屬群組:
註冊會員
文章: 3
等級: 1; EXP: 10
HP : 0 / 2
MP : 1 / 4
離線
目前想做A/D轉換後的值,用藍芽4.0模組將資料發送出去 ,使用 C18編譯,AN0做A/D轉換動作 利用Docklight下指令卻沒有反應無法接收指令。 我該如何修改程式

#include<p18f26k20.h>
#include<adc.h>
#include<delays.h>
#include<timers.h>
#include<usart.h>

//************************************************************* // MCU Configuration //*************************************************************

#pragma config FOSC=INTIO67,PWRT=OFF,WDTEN=OFF
#pragma config PBADEN=OFF
#pragma config MCLRE=OFF //注意

//************************************************************* // Define Function //*************************************************************

//--------------------------------PIC Initial -----------------

void INIT_ALL(void);
void MCU_INIT(void);
void Usart_INIT(void);
void PORT_INIT(void);
void INT_INIT(void);

//------------------------------ Interrupt Function -----------

void Hi_Interrupt_Code(void);
void Lo_Interrupt_Code(void);
void Hi_Priority_ISR(void) ; // Hi_Priority_Interrupt
void Lo_Priority_ISR(void) ; // Hi_Priority_Interrupt

//------------------------------- Delay Function --------------

void DELAY_MS(void);

//------------------------------- A/D -------------------------

void INT_ADC(void); void CONVERT(void);
unsigned int AD_Temp;

//************************************************************* // Define Port //*************************************************************

//--Port A
#define TR_U3_Out TRISAbits.TRISA0
#define TR_U3_A2 TRISAbits.TRISA1
#define PO_U3_A2 PORTAbits.RA1
#define TR_U3_A1 TRISAbits.TRISA2
#define PO_U3_A1 PORTAbits.RA2
#define TR_U3_A0 TRISAbits.TRISA3
#define PO_U3_A0 PORTAbits.RA3
#define TR_LED1 TRISAbits.TRISA5
#define PO_LED1 PORTAbits.RA5
//--Port B
#define TR_U3_S3 TRISBbits.TRISB2
#define PO_U3_S3 PORTBbits.RB2
#define TR_U3_E TRISBbits.TRISB1
#define PO_U3_E PORTBbits.RB1
//--Port C

//************************************************************* // Code Start //*************************************************************

#pragma code Code_Start=0x500
void main(void)
{
INIT_ALL();
while(
1)
  {
     
// PO_LED1=1;
     // Delay10KTCYx(2);
     // PO_LED1=0;
     // Delay10KTCYx(2);
          
ConvertADC(); // Convert A/D
          
while(BusyADC()); // Waiting A/D until done
          
{
            
AD_Temp=ReadADC();
           }
            while(
BusyUSART());
            {
            
Delay10KTCYx(2);
            
putsUSART(AD_Temp);
            }
   }
#pragma code

//************************************************************* // Interrupt //*************************************************************

//-------------------------------------------------------------

// High Interrupt

//-------------------------------------------------------------

#pragma code Hi_Vector=0x0008     // High Priority
void Hi_Interrupt_Code(void)
{
   
_asm                           //begin in-line assembly
    
goto Hi_Priority_ISR          //go to isr_high function
   
_endasm                        //end in-line assembly
}
#pragma code

//------------------------------ High Interrupt ISR -----------

#pragma interrupt Hi_Priority_ISR //
void Hi_Priority_ISR(void)
{
    while(
INTCONbits.INT0IF==1)
      {
         
INTCONbits.INT0IF=0; //INT0I禁止外部中斷
         
IPR1bits.ADIP=1; //ADC轉換器高優先中斷
         
ReadUSART();
      }
}

//-------------------------------------------------------------

// Low Interrupt

//--------------------------------------------

#pragma code Lo_Vector=0x0018 // Low Priority void Lo_Interrupt_Code(void)
{
  
_asm                              //begin in-line assembly
  
goto Lo_Priority_ISR              //go to isr_high function
  
_endasm                           //end in-line assembly
}
#pragma code
//------------------------------ Low Interrupt ISR -----------
#pragma interruptlow Lo_Priority_ISR //
void Lo_Priority_ISR(void)
{
  
//----------------------- Timer1 INT ------------------------
   
while(PIR1bits.TMR1IF==1)
   {
      
PIR1bits.TMR1IF=0;
      
T1CONbits.TMR1ON=0; //停止timer1
      
TMR1L=0; //計時器重置
      
PIR1bits.TMR1IF=0;
   }
   while(
PIR1bits.TMR2IF==1) // Clear Timer2 interrupt Flag
   
{
      
PIR1bits.TMR2IF = 0;
    }
}

void INIT_ALL(void)
{
   
MCU_INIT();
   
Usart_INIT();
   
PORT_INIT();
   
INT_INIT();
   
INT_ADC();
}

void MCU_INIT(void)
{
//-----Internal OSC-----
  
OSCCONbits.IRCF=0b111; // HFINTOSC 內部振盪頻率16MHz
  
OSCCONbits.SCS=0b00; // Primary clock,PLL四倍FOSC為64MHZ
  
OSCTUNEbits.PLLEN=0; // PLL關閉

//-------------------------------- SPI Setting -----

//OpenSPI(SPI_FOSC_16, MODE_00, SMPMID);

//-------------------------------- Timer Setting --------------

OpenTimer1( TIMER_INT_OFF & T1_16BIT_RW & T1_SOURCE_INT & T1_PS_1_8 & T1_OSC1EN_OFF & T1_SYNC_EXT_OFF ); // Timer1

OpenTimer2( TIMER_INT_OFF & T2_PS_1_16 & T2_POST_1_16 ); // Timer2

//----------------------- Timer3 INT --------------------------

T3CONbits.RD16 = 0;

T3CONbits.T3CKPS1 = 0;
T3CONbits.T3CKPS0 = 0;

T3CONbits.T3SYNC = 1;
T3CONbits.TMR3ON = 0;
}

void Usart_INIT(void)
{
OpenUSART(USART_TX_INT_OFF&USART_RX_INT_ON&USART_ASYNCH_MODE&USART_EIGHT_BIT&USART_SYNC_SLAVE&USART_CONT_RX&USART_BRGH_HIGH,103);
//禁止發送中斷.允陰策洶刈_.異步模式.8 位發送/接收.同步從模式.連續接收.高串列傳輸速率.設定 SPBRG=103 Baud Rate=9600

//------------------------------ USART Setting -----

RCSTAbits.SPEN = 1; // Serial Port enabled
TRISCbits.TRISC7 = 1; // Usart RX input
TRISCbits.TRISC6 = 0; // Usart TX output
PIE1bits.TXIE=0; // EUSART TX Interrupt Flag
PIR1bits.RCIF=0; // EUSART Receive Interrupt Flag IPR1bits.RCIP=1; // USART RX High priority
PIE1bits.RCIE=1; // EUSART RX 允陰策洶刈_
}

void PORT_INIT(void)
{
  
ANSEL=0XF1; //11110001
  
ANSELH=0X1A; //00011010
  //--Port A
  
TR_U3_Out=1;
  
TR_U3_A2=0;
  
TR_U3_A1=0;
  
TR_U3_A0=0;
  
TR_LED1=0;
  
//--Port B
  
TR_U3_S3=0;
  
TR_U3_E=0;
}

void INT_INIT(void)
{
   
WriteTimer1( 0 );
   
WriteTimer2( 0 );
  
//----------------------------- Interrupt Priority ----------

IPR1bits.TMR1IP=0; // Timer1 Low priority
IPR1bits.TMR2IP=0; // Timer2 Low priority
IPR2bits.TMR3IP=0; // Timer3 Low priority

PIR1bits.TMR1IF=0; // TMR1 Overflow Interrupt Flag

PIR1bits.TMR2IF=0; // TMR2 Overflow Interrupt Flag

PIR2bits.TMR3IF=0; // TMR3 Overflow Interrupt Flag

//Usart_RX_Counter = RCREG; // Clear RX_Buffer

INTCONbits.INT0IF=0; //禁止INT0外部中斷
INTCON2bits.INTEDG0=0; // Interrupt on falling edge //PIE1bits.TMR1IE = 1; //允袍MR1溢出中斷
PIE1bits.TMR2IE = 1; //允袍MR2與PR2匹配中斷 INTCONbits.INT0IE=1; //允蛆NT0外部中斷

//----------------------------- Interrupt Setting -------------

RCONbits.IPEN=1;
INTCONbits.GIEH=1;
INTCONbits.PEIE=1;
}

//------------------------------------------------------------- // Delay Function
//------------------------------------------------------------
//Delay1TCY Delay 62.5ns for 64M OSC
//Delay10TCYx Delay 0.625us for 64M OSC
//Delay100TCYx Delay 6.25us for 64M OSC
//Delay1KTCYx Delay 62.5us for 64M OSC
//Delay10KTCYx Delay 0.625ms for 64M OSC
void DELAY_MS(void)
{
  
Delay10KTCYx(2);
}
//-----------------------------------------------------------

// ADC Initial

//-------------------------------------------------------------

void INT_ADC(void)
{
OpenADC( ADC_FOSC_32 &ADC_RIGHT_JUST &ADC_4_TAD,ADC_CH0 &ADC_INT_OFF,0); ADCON1=0x00;
//OpenADC的值為Vref的ADCON1,需重新設定 }

2月22日 13:16:52

ahao1022 於 2019年02月22日 13:55:46
轉換PDF檔 列印


Re: PIC18F26K20 USART使用問題
版主
註冊日期:
2004/04/30 10:53
來自 CAE, Microchip
所屬群組:
站務管理者
註冊會員
MICROCHIP
文章: 14805
等級: 73; EXP: 53
HP : 1087 / 1813
MP : 4935 / 81149
離線
老實說,我看不懂你的流程架構。你有使用中斷卻沒有開啟相關周邊的中斷功能。

建議你先確定 ADC 可以正確讀取 VR1 的值後,再來搞定 UART 的傳輸訊號。

http://www.microchip.com.tw/Data_CD/

使用 C18 的話可以參考一下 W401 的教材。練習五就開始講中斷的設定與應用。

UART & ADC 的範例也都在 W401 的教材裡。

2月22日 13:34:18
轉換PDF檔 列印






無法在此發表文章
可以在此觀看文章
無法回覆文章
無法編輯自己的文章
無法刪除自己的文章
無法發起投票調查
無法在此投票
無法上傳附加檔案
無法不經審核直接發表文章

[進階搜尋]


搜尋
Microchip連結

網頁捷徑
2019 Summer Elite 報名
教育訓練
其它網站連結
電話: 02-25000405
產品技術問題產品技術支援專線:0800-717718 台北02-25088600 新竹03-5778366 Ext. 8600 高雄07-2137830 MicrochipDIRECT 專線: 07-2137830
Powered by XOOPS © 2001-2012 The XOOPS Project