會員登陸
帳號:

密碼:

記住我



忘記密碼?

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


正在流覽:   1 名訪客





while(1)類程式執行時間與進路中斷時間關係
新會員
註冊日期:
3月23日 21:05:20
來自 台灣
所屬群組:
註冊會員
文章: 3
等級: 1; EXP: 10
HP : 0 / 2
MP : 1 / 5
離線
各位高手:
小弟在執行以下程序時七段顯示器的數字會出現不一樣的數字,而用另外一組就不會出現,我想問一下是甚麼原因造成的。
以下程式:
#pragma config FOSC = HSPLL_HS, PLLDIV = 4, CPUDIV = OSC1_PLL2 //時脈選擇
#pragma config WDT = OFF, LVP = OFF, MCLRE = ON, XINST = OFF

#include <p18f4550.h>
#include "timer.h"
#define P_SELO_1 PORTBbits.RB0
#define P_SELO_2 PORTBbits.RB1
#define P_SELO_3 PORTBbits.RB2
#define P_SELO_4 PORTBbits.RB3
#define data_port PORTD

const unsigned char TBL_7SEG[] = {0x03, 0x9f, 0x25, 0x0D, 0x99, 0x49, 0x41, 0x1B, 0x01, 0x09} ;
int TimerCnt_5ms=0, ScanLine=0, count=0, countime=0, test= 0;
void high_isr (void) ;
#pragma code high_voctor = 0x08
void high_interrupt (void){_asm goto high_isr _endasm}
# pragma code
# pragma interrupt high_isr

void high_isr (void)//高優先中斷指令
{
unsigned int temp1 = 0 ;
if(INTCONbits.TMR0IF)
{

INTCONbits.TMR0IF = 0 ;
TMR0H = 0xD1 ;
TMR0L = 0x20 ;
if(countime > 0) countime -- ;
if(TimerCnt_5ms > 0) TimerCnt_5ms -- ;
if(test > 0) test -- ;
if(TimerCnt_5ms == 0) //1ms 變更一次掃描線
{
temp1 = count ;
TimerCnt_5ms = 1 ;
P_SELO_1 = 1 ;
P_SELO_2 = 1 ;
P_SELO_3 = 1 ; /* 消除掃瞄殘影 */
P_SELO_4 = 1 ; /* 消除掃瞄殘影 */
if(ScanLine == 0)
{
temp1 = count % 10000 ;
temp1 = temp1 / 1000 ;
data_port = TBL_7SEG[temp1] ;
P_SELO_1 = 1 ;
P_SELO_2 = 1 ;
P_SELO_3 = 1 ;
P_SELO_4 = 0 ;
ScanLine = 1 ;
}
else if(ScanLine == 1)
{
temp1 = count % 1000 ;
temp1 = temp1 / 100 ;
data_port = TBL_7SEG[temp1] ;
P_SELO_1 = 1 ;
P_SELO_2 = 1 ;
P_SELO_3 = 0 ;
P_SELO_4 = 1 ;
ScanLine = 2 ;
}
else if(ScanLine == 2)
{
temp1 = count % 100 ;
temp1 = temp1 / 10 ;
data_port = TBL_7SEG[temp1] ;
P_SELO_1 = 1 ;
P_SELO_2 = 0 ;
P_SELO_3 = 1 ;
P_SELO_4 = 1 ;
ScanLine = 3 ;
}
else if(ScanLine == 3)
{
temp1 = count % 10 ;
data_port = TBL_7SEG[temp1] ;
P_SELO_1 = 0 ;
P_SELO_2 = 1 ;
P_SELO_3 = 1 ;
P_SELO_4 = 1 ;
ScanLine ++ ;
}
else
{
P_SELO_1 = 1 ;
P_SELO_2 = 1 ;
P_SELO_3 = 1 ;
P_SELO_4 = 1 ;
ScanLine = 0 ;
}
}
}
}
void main()
{
timer0() ;
INTCONbits.TMR0IE = 1 ;
INTCONbits.TMR0IF = 0 ;
TMR0H = 0xD1 ;
TMR0L = 0x20 ;

RCONbits.IPEN = 0 ;
INTCONbits.GIE = 1 ;
INTCONbits.PEIE = 0 ;

timer1() ;
ADCON1bits.PCFG = 0b1111 ;
TRISD = 0x00 ;
TRISBbits.RB0 = 0 ;
TRISBbits.RB1 = 0 ;
TRISBbits.RB2 = 0 ;
TRISBbits.RB3 = 0 ;
TRISEbits.TRISE0 = 1 ;
TRISBbits.RB4 = 0 ;
while(1)
{
if(test == 0)
{
test = 20 ;

if(PORTEbits.RE0)
{
PORTBbits.RB4 = 1 ;
count = 9487 ;
}

else
{
count = 500 ;
PORTBbits.RB4 = 0 ;
}
}
}
}
//我用的是PIC18F4550這塊MCU,然後加上顏色的程式功能才正常,沒加功能就不正常,如有不清楚的以下有附上程式謝謝

11月10日 16:44:55
轉換PDF檔 列印


Re: while(1)類程式執行時間與進路中斷時間關係
資深會員
註冊日期:
2009/04/07 13:30
所屬群組:
註冊會員
文章: 159
等級: 11; EXP: 66
HP : 0 / 266
MP : 53 / 6716
離線
數字拆分 快速個別顯示 的應用做法,
想法 與 程式 看起來都是正確的.

但你問了目前這個程式是不是哪裡有問題...
那樣的話,
目前這個程式的確有個小問題在,
那就是對 "一個數" 的 "顯示一致性" 不足,

顯示 "一個數" 被拆分成了 4次 的動作時,
想想, 當這個數 顯示了 兩個位數 還有 兩個位數 未顯示時,
要被顯示出來的數 在這時候 改變了!!!
當然接著之後顯示的 兩佪位數 就變成了 新數值的顯示內容.

這是我認為的 在目前這程式上的小問題,
不過它也會因為
PORTEbits.RE0 輸入狀態 的變換頻率快慢,
或 主要工作時脈的快摱,
而出現不同程度的實際影響.


當你加入了
:
:
if(test > 0) test -- ;
:
:
:
test = 20 ;
:
:

在其中時...

因為被顯示的 "數"
它的改變時機點被限制剛好在 20 / 5 的整倍數上,
並且也限制了改變顯示的 "新數值" 顯示的最小保持時間的長度,
所以, 顯示 "一致性" 的問題現象 就 被抑制了.

11月11日 16:35:04
轉換PDF檔 列印


Re: while(1)類程式執行時間與進路中斷時間關係
新會員
註冊日期:
3月23日 21:05:20
來自 台灣
所屬群組:
註冊會員
文章: 3
等級: 1; EXP: 10
HP : 0 / 2
MP : 1 / 5
離線
那如果我把while(1){}裡面的數字跟判斷都改掉,改成:
while(1)
{
count = 任一數 ;
}
結果還是ˋ跟有沒有加那幾段程式的結果是一樣的,有加就正常,沒加就不正常。那我還想問一個問題,如果用電源供應器去供電給PIC這塊MCU正常的限流值要設多少才好,因為我之前有限流太過低,導致MCU沒有正常運作過。

11月12日 15:37:55
轉換PDF檔 列印


Re: while(1)類程式執行時間與進路中斷時間關係
資深會員
註冊日期:
2012/05/04 19:18
所屬群組:
註冊會員
文章: 183
等級: 12; EXP: 58
HP : 0 / 289
MP : 61 / 4687
離線
沒很詳細看你的程式,但你的變數宣告與使用上有些問題,在中斷內使用的變數一定要宣告成volatile比較好,這樣程式不會把它最佳化掉,會漏掉很多步驟,程式跑出來可能會不如預期!

int TimerCnt_5ms=0, ScanLine=0, count=0, countime=0, test= 0;

11月13日 08:49:20
轉換PDF檔 列印


Re: while(1)類程式執行時間與進路中斷時間關係
新會員
註冊日期:
3月23日 21:05:20
來自 台灣
所屬群組:
註冊會員
文章: 3
等級: 1; EXP: 10
HP : 0 / 2
MP : 1 / 5
離線
引用:

Edison_yu 寫道:
沒很詳細看你的程式,但你的變數宣告與使用上有些問題,在中斷內使用的變數一定要宣告成volatile比較好,這樣程式不會把它最佳化掉,會漏掉很多步驟,程式跑出來可能會不如預期!

int TimerCnt_5ms=0, ScanLine=0, count=0, countime=0, test= 0;


謝謝Edison_yu你的指導,問題已解決。

11月13日 09:46:32
轉換PDF檔 列印






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

[進階搜尋]


搜尋
Microchip連結

網頁捷徑
2017 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