會員登陸
帳號:

密碼:

記住我



忘記密碼?

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


正在流覽:   1 名訪客





PIC16F1503 timer 計數 每秒開+每秒關LED 循環
新會員
註冊日期:
2019/12/17 08:40
所屬群組:
註冊會員
文章: 4
等級: 1; EXP: 21
HP : 0 / 5
MP : 1 / 7
離線
請教PIC16F1503 TIMER1設定的問題,以下是我的程式,使用RC2控制LED,1秒亮燈,1秒關燈,循環,不知道是我哪邊沒有設定好,以至於都無法動作,只會停在初始狀態的LED亮燈,無法進行我需求的動作,請有經驗的高手幫幫忙,謝謝!

/*
功能:

ON 1S + OFF 1S cycle mode
-----------------------------------------------------------------------------
Fosc = 1MHz
Tosc = 1μs
TMR1 預分頻比 = 8

MCU : PIC16F1503

*/

#include<pic.h>

__CONFIG(FOSC_INTOSC&WDTE_OFF&PWRTE_ON&MCLRE_OFF&CP_OFF&BOREN_OFF);

#define LED RC2

void system_initial(void);

unsigned char seconds=0;

void main(void)
{
system_initial();

while (1)
{
while(!TMR1IF); //檢查 Timer1 1S 計時溢位了嗎? (沒有,繼續等待)
TMR1IF=0; //時間溢位,清除旗號
TMR1H=0x85; //TMR1H 133,預載入 MSB (1S) (重新載入Timer1 120mS 的計時)
TMR1L=0xEE; //TMR1L 238,同時載入載入 1S 計數值到 Timer1(16-bit 載入)
seconds+=1; //seconds 計數 seconds 加一

if(LED=1)
{
if(seconds==1)
{
seconds=0;
LED=0;
}

}

if(LED=0)
{
if(seconds==1)
{
seconds=0;
LED=1;
}

}
}

}

void system_initial(void)
{
TRISA=0b00111111; //設定RA0~RA5皆為輸入腳,1設為輸入,0設為輸出
TRISC=0b00001000; //設定RC3為輸入腳,RC0、RC1、RC2、RC4、RC5皆為輸出腳,1設為輸入,0設為輸出
ANSELC=0b00001000; //設定RC0~RC2皆為Digital I/O,RC3類比
OSCCON=0b01011011; //內部振盪器頻率設為1MHz

LED=1;
seconds=0;

T1CON=0b00110111; //Timer1時鐘源為指令時鐘(FOSC/4, 時鐘預分頻比=8, 異步時鐘輸入, Timer1 ON
PIE1=0b00000001; //Timer1溢出中斷ON
INTCON=0b11000000; //允許所有有效中斷, 允許所有有效外設中斷
TMR1H=0x85; //TMR1H 133, 預載入 MSB (1S)
TMR1L=0xEE; //TMR1L 238, 同時載入 1S 計數值到 Timer1(16-bit 載入)
}

2019/12/17 11:06
轉換PDF檔 列印


Re: PIC16F1503 timer 計數 每秒開+每秒關LED 循環
版主
註冊日期:
2004/04/30 10:53
來自 CAE, Microchip
所屬群組:
站務管理者
註冊會員
MICROCHIP
文章: 15045
等級: 73; EXP: 89
HP : 1093 / 1822
MP : 5015 / 85655
離線
if (LED=1) 是指定運算,還是用 == 的比較運算?

2019/12/17 14:31
轉換PDF檔 列印


Re: PIC16F1503 timer 計數 每秒開+每秒關LED 循環
新會員
註冊日期:
2019/12/17 08:40
所屬群組:
註冊會員
文章: 4
等級: 1; EXP: 21
HP : 0 / 5
MP : 1 / 7
離線
if(LED=1)跟if(LED=0)是用來表示LED的狀態HI或是LO

2019/12/17 15:18
轉換PDF檔 列印


Re: PIC16F1503 timer 計數 每秒開+每秒關LED 循環
版主
註冊日期:
2004/04/30 10:53
來自 CAE, Microchip
所屬群組:
站務管理者
註冊會員
MICROCHIP
文章: 15045
等級: 73; EXP: 89
HP : 1093 / 1822
MP : 5015 / 85655
離線
LED=1 是將 LED 設定成 Hi 輸出。不是狀態指示。

2019/12/17 17:46
轉換PDF檔 列印


Re: PIC16F1503 timer 計數 每秒開+每秒關LED 循環
新會員
註冊日期:
2019/12/17 08:40
所屬群組:
註冊會員
文章: 4
等級: 1; EXP: 21
HP : 0 / 5
MP : 1 / 7
離線
Ryang大大:

如果我改成以下寫法呢?另外請教我的void system_initial(void)裡面是否有設定錯誤或是少設定哪些功能呢?目前還是都沒辦法運作,新手請多指教,謝謝

#include<pic.h>

__CONFIG(FOSC_INTOSC&WDTE_OFF&PWRTE_ON&MCLRE_OFF&CP_OFF&BOREN_OFF);

#define LED RC2

void system_initial(void);

unsigned char seconds=0;

void main(void)
{
system_initial();

while (1)
{
while(!TMR1IF); //檢查 Timer1 1S 計時溢位了嗎? (沒有,繼續等待)
TMR1IF=0; //時間溢位,清除旗號
TMR1H=0x85; //TMR1H 133,預載入 MSB (1S) (重新載入Timer1 120mS 的計時)
TMR1L=0xEE; //TMR1L 238,同時載入載入 1S 計數值到 Timer1(16-bit 載入)

LED=~LED; //LED切換
}

}

void system_initial(void)
{
TRISA=0b00111111; //設定RA0~RA5皆為輸入腳,1設為輸入,0設為輸出
TRISC=0b00001000; //設定RC3為輸入腳,RC0、RC1、RC2、RC4、RC5皆為輸出腳,1設為輸入,0設為輸出
ANSELC=0b00001000; //設定RC0~RC2皆為Digital I/O,RC3類比
OSCCON=0b01011011; //內部振盪器頻率設為1MHz

T1CON=0b00110111; //Timer1時鐘源為指令時鐘(FOSC/4, 時鐘預分頻比=8, 異步時鐘輸入, Timer1 ON
PIE1=0b00000001; //Timer1溢出中斷ON
INTCON=0b11000000; //允許所有有效中斷, 允許所有有效外設中斷
TMR1H=0x85; //TMR1H 133, 預載入 MSB (1S)
TMR1L=0xEE; //TMR1L 238, 同時載入 1S 計數值到 Timer1(16-bit 載入)
}

2019/12/18 08:16
轉換PDF檔 列印


Re: PIC16F1503 timer 計數 每秒開+每秒關LED 循環
版主
註冊日期:
2004/04/30 10:53
來自 CAE, Microchip
所屬群組:
站務管理者
註冊會員
MICROCHIP
文章: 15045
等級: 73; EXP: 89
HP : 1093 / 1822
MP : 5015 / 85655
離線
引用:
PIE1=0b00000001; //Timer1溢出中斷ON
INTCON=0b11000000; //允許所有有效中斷, 允許所有有效外設中斷


你在程式裡並沒有做中斷的動作,但你卻開啟了中斷功能。所以程式在 Timer1 發生中斷時程式會亂掉。

所以將 INTCON 設成 0x00 已關閉所有的中斷 (Polling Mode)。


或使用中斷方式來計時,參考一下底下的寫法:

TMR1IE = 1; // Enable Timer1 Interrupt
PEIE=1; // Enable Peripheral Interrupt
GIE=1; // Enable Global Interrupt

Main()
{ while (1); }

void interrupt isr(void)
{
TMR1IF=0; //時間溢位,清除旗號
TMR1H=0x85; //TMR1H 133,預載入 MSB (1S) (重新載入Timer1 120mS 的計時)
TMR1L=0xEE; //TMR1L 238,同時載入載入 1S 計數值到 Timer1(16-bit 載入)

LED=~LED; //LED切換
}

2019/12/18 10:39
轉換PDF檔 列印


Re: PIC16F1503 timer 計數 每秒開+每秒關LED 循環
初級會員
註冊日期:
2015/08/16 22:04
所屬群組:
註冊會員
文章: 28
等級: 4; EXP: 3
HP : 0 / 75
MP : 9 / 1060
離線
整個程式大概像下面這樣,可能要在小修改一下TIMER之類的設定:

#include<pic.h>

__CONFIG(FOSC_INTOSC&WDTE_OFF&PWRTE_ON&MCLRE_OFF&CP_OFF&BOREN_OFF);

#define LED RC2

void system_init()
{
TRISA=0b00000000; //設定RA0~RA5皆輸出,沒用到的腳設為輸出,較不會被干擾
TRISC=0b00001000; //設定RC3為輸入腳,RC0、RC1、RC2、RC4、RC5皆為輸出腳,1設為輸入,0設為輸出
ANSELC=0b00000000; //全設為Digital I/O,類比io是用在輸入電壓,例如做ADC
OSCCON=0b01011011; //內部振盪器頻率設為1MHz
}

void interrupt_init()
{

TMR1IE=1; // Enable Timer1 Interrupt
PEIE=1; // Enable Peripheral Interrupt
GIE=1; // Enable Global Interrupt
T1CON=0b00110111; //Timer1時鐘源為指令時鐘(FOSC/4, 時鐘預分頻比=8, 異步時鐘輸入, Timer1 ON
INTCON=0b11000000; //允許所有有效中斷, 允許所有有效外設中斷
TMR1H=0x85; //TMR1H 133, 預載入 MSB (1S)
TMR1L=0xEE; //TMR1L 238, 同時載入 1S 計數值到 Timer1(16-bit 載入)

}

void main(void)
{
while (1);//原地等待中斷
}

void interrupt isr(void) //中斷進入點,要在main之後
{
TMR1IF=0; //時間溢位,清除旗號
TMR1H=0x85; //TMR1H 133,預載入 MSB (1S) (重新載入Timer1 120mS 的計時)
TMR1L=0xEE; //TMR1L 238,同時載入載入 1S 計數值到 Timer1(16-bit 載入)

LED=~LED; //LED切換
}

2019/12/24 21:09
轉換PDF檔 列印


Re: PIC16F1503 timer 計數 每秒開+每秒關LED 循環
版主
註冊日期:
2004/04/30 10:53
來自 CAE, Microchip
所屬群組:
站務管理者
註冊會員
MICROCHIP
文章: 15045
等級: 73; EXP: 89
HP : 1093 / 1822
MP : 5015 / 85655
離線
這是一般用的寫法,現在可以用mcc的工具來產生這些週邊函數來使用。你可以參考一下教育訓綀光碟裡面的 "PIC101 X IDE & MCC & XC8 的綜合基礎課程 New!"的教材 。

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

2019/12/25 11:39

Ryang 於 2019年12月26日 11:57:53
轉換PDF檔 列印






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

[進階搜尋]


搜尋
Microchip連結
產品技術問題產品技術支援專線:0800-717718 台北02-25088600 新竹03-5778366 Ext. 8600 高雄07-2137830 MicrochipDIRECT 專線: 07-2137830
Powered by XOOPS © 2001-2012 The XOOPS Project