會員登陸
帳號:

密碼:

記住我



忘記密碼?

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


正在流覽:   1 名訪客





QEI與UART的練習
新會員
註冊日期:
2014/09/25 16:38
所屬群組:
註冊會員
文章: 5
等級: 1; EXP: 34
HP : 0 / 8
MP : 1 / 58
離線
我目前是使用dspic33fj256mc710練習把QEI的POS1CNT的值丟到UART,然後已baud:38400傳輸到PC。現在我遇到了兩個問題:

1.此case在開啟UART TX的中斷後,會出現'No source code lines were found at current PC 0x0',對pic使用一般的make and program也是一動也不動。上網查了一下解法,試過了重開project、重新創建一個project、關閉SFR的memory views、去project properties的pickit3按Reset鍵...都不能解決我的問題。

2.因為UART TX的中斷也不是非開不可,所以索性就不開了。雖然程式在關掉UART TX的中斷之後可以debug了,但是當程式已make and program燒進pic後,UART TX只會吐出'0'(value = 0x30)。但會到debug mode,程式又正常運作了。

以上兩個問題都是第一次遇到,懇請大家指點,程式碼在下方。


int main
(void)
{
    
char temp_str[10] = {0};
    
volatile unsigned int temp = 0;
    
unsigned int i = 0,j = 0;

    
Init_PLL();
    while (
OSCCONbits.CF == 1); //check clock failed
    
while (OSCCONbits.COSC != 0b011); // Wait for Clock switch to occur
    
while (OSCCONbits.LOCK == 0); //check PLL locked

    
initUART1(38400);
    
initQEI();
    
    while (
1) {
         
temp = POS1CNT; sprintf(temp_str, "%d", temp);
         
sendUART1String(temp_str);
         for(
i = 0;i < 5000;i++){
             for(
j = 0;j < 1000;j++){
                 
Nop();
             }
         }
    }
}
//in main



void Init_PLL
(void)
{
    
int i, j;
    
CLKDIVbits.ROI = 0;
    
CLKDIVbits.DOZEN = 0;
    
CLKDIVbits.DOZE = 0;
    
CLKDIVbits.PLLPRE = 18; // N1 = PLLPRE + 2 = 18+2 =20  
    
PLLFBD = 158; // M = 158+2=160
    
CLKDIVbits.PLLPOST = 0; // N2 = 2 sum: Fosc= {OSC*M/(N1*N2)}=20M*160/(20*2)=80MHz
    // Tcy=1/80M*4=50nS
    
SRbits.IPL = 0;

    
//wait for Fosc stablize
    
for (i = 1000; i > 0; i--) {
        for (
j = 1000; j > 0; j--) {
        }
    }
}



void initQEI
(void)
{
    
PMD1bits.QEIMD = 0; //Enable QEI module QEI1CON = 0;     
    
DFLT1CON = 0;
    
QEI1CONbits.QEIM = 0b111; //x4 mode and reset by match
    
MAXCNT IEC3bits.QEIIE = 0; //disable interrupt
    
AD1PCFGL = 0x0038;
    
POS1CNT = 0; MAX1CNT = 220;
}



void initUART1
(unsigned int baudrate)
{
    
U1MODE = 0x0000; // clear all setting
    
U1MODEbits.RTSMD = 1; //1 = UxRTS pin in Simplex mode;
    
U1MODEbits.PDSEL = 0; //8-bit data,no parity
    
U1MODEbits.STSEL = 0; //0 = One Stop bit
    
U1STAbits.UTXISEL0 = 0; // Interrupt generated when any character is transferred to the Transmit Shift register   
    
U1STAbits.UTXISEL1 = 0;
    
U1STAbits.URXISEL = 0; // Interrupt is set when any character is received and transferred from the UxRSR to the receive
    
U1BRG = ((FCY / baudrate) / 16) - 1;
    
    
IFS0bits.U1TXIF = 0; // Clear the Transmit Interrupt Flag
    
IEC0bits.U1TXIE = 0; // Enable Transmit Interrupts

    
TRISFbits.TRISF2 = 1; //U1 RX
    
TRISFbits.TRISF3 = 0; //U1 TX

    
U1MODEbits.UARTEN = 1; // Enable UART
    
U1STAbits.UTXEN = 1; // Enable UART Tx
}



void sendUART1String
(char* buf)
{
    
int i;
    for (
i = 0; *(buf + i) != 0; i++) {
        
U1TXREG = *(buf + i);
        while (!
U1STAbits.TRMT);
    }
}

2016/12/07 11:02
轉換PDF檔 列印


Re: QEI與UART的練習
高級會員
註冊日期:
2009/04/07 13:30
所屬群組:
註冊會員
文章: 130
等級: 10; EXP: 44
HP : 0 / 236
MP : 43 / 5378
離線
1. 在開啟UART TX的中斷後會有不正常的現象...

因為:
(1)開啟了 UART TX 中斷, 但卻沒有該中斷函式程序,
若出現該中斷發生, 則會跳至 UART TX 中斷未定義的預設位址.
(絕大部分的狀況下,就是 reset 了啦!)
(2) PIC 的 UART TX 中斷, 是當 UART TX 可用時為中斷發生,
一開始初始時應該是未致能, 等要傳送時才致能.
否則, 初始就設定為致能, 在模組致能啟動後會馬上跳進中斷.
(如果又沒有能有效判斷的中斷程序, 那等於馬上就往 reset .)

-----------------------------------------------------------------

2. UART TX只會吐出'0'(value = 0x30) ???

沒有看到將 QEA, QEB 上 AN 功能關閉的相關處理,
可以試試是不是這項的關係.


void initQEI
(void)
{
    
AD1PCFGL = 0xFFFF;  // set AN0 - AN15 analog mode disable, as the digital I/O.

    
PMD1bits.QEIMD = 0; //Enable QEI module QEI1CON = 0;     
    
DFLT1CON = 0;
    
QEI1CONbits.QEIM = 0b111; //x4 mode and reset by match
    
MAXCNT IEC3bits.QEIIE = 0; //disable interrupt
    
AD1PCFGL = 0x0038;
    
POS1CNT = 0; MAX1CNT = 220;
}

2016/12/07 22:05
轉換PDF檔 列印


Re: QEI與UART的練習
新會員
註冊日期:
2014/09/25 16:38
所屬群組:
註冊會員
文章: 5
等級: 1; EXP: 34
HP : 0 / 8
MP : 1 / 58
離線
謝謝OuO...的回覆。
確實,第一個問題藉由加上

void __attribute__
((__interrupt__,auto_psv)) _U1TXInterrupt(void)
{
    
IFS0bits.U1TXIF = 0;
}

這段中斷副程式之後,程式能正常的運作了。

但問題二的部分依然是沒有起色。
其實我原本的程式中有打上
AD1PCFGL = 0x0038;
後來也想說以試試看的想法改成
AD1PCFGL = 0xFFFF;
而結果依樣是:
【在debug mode下,程式會正常運作。例如正轉POS1CNT會是4、8、12...。
但在make and program->拿開pikit3->重新上電之後,UART TX只會吐出'0'(value = 0x30)。】

因為debug mode工作正常,所以我想應該不是AN功能的問題。

2016/12/07 23:16
轉換PDF檔 列印


Re: QEI與UART的練習
高級會員
註冊日期:
2009/04/07 13:30
所屬群組:
註冊會員
文章: 130
等級: 10; EXP: 44
HP : 0 / 236
MP : 43 / 5378
離線
這個嘛!!!

不知道你是否有把看門狗(WDT)給關上 !?

2016/12/08 00:17
轉換PDF檔 列印


Re: QEI與UART的練習
新會員
註冊日期:
2014/09/25 16:38
所屬群組:
註冊會員
文章: 5
等級: 1; EXP: 34
HP : 0 / 8
MP : 1 / 58
離線
WDT有使用
/* 0xF8000A FWDT */
#pragma config WDTPOST = PS4096, WDTPRE = PR128, WINDIS = OFF, FWDTEN = OFF

關閉了

2016/12/08 10:05
轉換PDF檔 列印


Re: QEI與UART的練習
高級會員
註冊日期:
2009/04/07 13:30
所屬群組:
註冊會員
文章: 130
等級: 10; EXP: 44
HP : 0 / 236
MP : 43 / 5378
離線
那麼建議你先修改為以下,
好查出是 QEI 數值沒變化? 或是被不斷 reset ?

如果可以得到 UART 輸出 0->1->2->3->0->1...., 那就是 QEI 數值沒變化.
如果還是得到 UART 輸出只有 '0', 那就是被不斷的 reset 了.


int main
(void)
{
    
char temp_str[10] = {0};
    
volatile unsigned int temp = 0;
    
unsigned int i = 0,j = 0;

    
Init_PLL();
    while (
OSCCONbits.CF == 1); //check clock failed
    
while (OSCCONbits.COSC != 0b011); // Wait for Clock switch to occur
    
while (OSCCONbits.LOCK == 0); //check PLL locked

    
initUART1(38400);
    
initQEI();
    
    while (
1) {
//         temp = POS1CNT; sprintf(temp_str, "%d", temp);

// test code at here.
         
temp_str[0] = '0' + ((temp_str[0] + 1) & 3);
         
temp_str[1] = 0;

         
sendUART1String(temp_str);
         for(
i = 0;i < 5000;i++){
             for(
j = 0;j < 1000;j++){
                 
Nop();
             }
         }
    }
}
//in main

2016/12/08 14:19
轉換PDF檔 列印


Re: QEI與UART的練習
新會員
註冊日期:
2014/09/25 16:38
所屬群組:
註冊會員
文章: 5
等級: 1; EXP: 34
HP : 0 / 8
MP : 1 / 58
離線
燒錄了OuO...提供的程式後,UART的值是有0->1->2->3->0...這樣變化的。由此來看UART的功能是正常的,沒有被reset。

剛剛有找到一個似乎是可以解決我們問題的討論串,PO給大家看看
http://www.eeskill.com/article/id/44129

2016/12/08 22:14

Scron 於 2016年12月08日 22:33:49
轉換PDF檔 列印


Re: QEI與UART的練習
新會員
註冊日期:
2014/09/25 16:38
所屬群組:
註冊會員
文章: 5
等級: 1; EXP: 34
HP : 0 / 8
MP : 1 / 58
離線
藉由剛剛找的到網站,其中有一句話突破盲腸啦!

"修改初始化程序,初始化复用引脚时增加对模数转化模块AD2PCFGL的配置,就解角F这个问题。"

雖然他下面貼了完全與這句話不相關的圖,但由這句話可以找到在datasheet的page:252,在REGISTER 22-10: ADxPCFGL: ADCx PORT CONFIGURATION REGISTER LOW這個對register的介紹底下有3個Note,其中第2個告訴我們:

"On devices with two analog-to-digital modules, both AD1PCFGL and AD2PCFGL will affect the configuration of port pins multiplexed with AN0-AN15."

雖然不是100%理解他在講啥,可以我看了之後以試試看的心態在initQEI中多加了AD2PCFGL = 0xFFFF;,現在程式可以在一般的燒錄狀態下正常執行了。Goog job~~!!

感謝OuO...大大參與討論,本來想說這個中文版不是那麼活躍會不會問題石沉大海。。:.゚ぶ(*´∀`)ノ゚.:。

所以這是現在的initQEI程式碼:

void initQEI
(void)
{
    
AD1PCFGL = 0xFFFF;
    
AD2PCFGL = 0xFFFF;

    
PMD1bits.QEIMD = 0; //Enable QEI module
    
QEI1CON = 0;
    
DFLT1CON = 0;
    
QEI1CONbits.QEIM = 0b111; //x4 mode and reset by match MAXCNT
    
IEC3bits.QEIIE = 0; //disable interrupt

    
AD1PCFGL = 0x0038;
    
POS1CNT = 0;
    
MAX1CNT = 220;
}

2016/12/08 23:00
轉換PDF檔 列印






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

[進階搜尋]


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