:::


Browsing this Thread:   1 Anonymous Users






PIC16F1503 timer 計數 每秒開+每秒關LED 循環
#1
新會員
新會員


查看用戶資訊
請教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 載入)
}

發表於: 12/17 11:06
Twitter Facebook Google Plus Linkedin Del.icio.us Digg Reddit Mr. Wong 頂部


Re: PIC16F1503 timer 計數 每秒開+每秒關LED 循環
#2
版主
版主


查看用戶資訊
if (LED=1) 是指定運算,還是用 == 的比較運算?

發表於: 12/17 14:31
Twitter Facebook Google Plus Linkedin Del.icio.us Digg Reddit Mr. Wong 頂部


Re: PIC16F1503 timer 計數 每秒開+每秒關LED 循環
#3
新會員
新會員


查看用戶資訊
if(LED=1)跟if(LED=0)是用來表示LED的狀態HI或是LO

發表於: 12/17 15:18
Twitter Facebook Google Plus Linkedin Del.icio.us Digg Reddit Mr. Wong 頂部


Re: PIC16F1503 timer 計數 每秒開+每秒關LED 循環
#4
版主
版主


查看用戶資訊
LED=1 是將 LED 設定成 Hi 輸出。不是狀態指示。

發表於: 12/17 17:46
Twitter Facebook Google Plus Linkedin Del.icio.us Digg Reddit Mr. Wong 頂部


Re: PIC16F1503 timer 計數 每秒開+每秒關LED 循環
#5
新會員
新會員


查看用戶資訊
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 載入)
}

發表於: 12/18 8:16
Twitter Facebook Google Plus Linkedin Del.icio.us Digg Reddit Mr. Wong 頂部


Re: PIC16F1503 timer 計數 每秒開+每秒關LED 循環
#6
版主
版主


查看用戶資訊
參照:
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切換
}

發表於: 12/18 10:39
Twitter Facebook Google Plus Linkedin Del.icio.us Digg Reddit Mr. Wong 頂部


Re: PIC16F1503 timer 計數 每秒開+每秒關LED 循環
#7
初級會員
初級會員


查看用戶資訊
整個程式大概像下面這樣,可能要在小修改一下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切換
}

發表於: 12/24 21:09
Twitter Facebook Google Plus Linkedin Del.icio.us Digg Reddit Mr. Wong 頂部


Re: PIC16F1503 timer 計數 每秒開+每秒關LED 循環
#8
版主
版主


查看用戶資訊
這是一般用的寫法,現在可以用mcc的工具來產生這些週邊函數來使用。你可以參考一下教育訓綀光碟裡面的 "PIC101 X IDE & MCC & XC8 的綜合基礎課程 New!"的教材 。

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

發表於: 12/25 11:39

Edited by Ryang on 2019年12月26日 11:57:53
Twitter Facebook Google Plus Linkedin Del.icio.us Digg Reddit Mr. Wong 頂部







You can view topic.
You cannot start a new topic.
You cannot reply to posts.
You cannot edit your posts.
You cannot delete your posts.
You cannot add new polls.
You cannot vote in polls.
You cannot attach files to posts.
You cannot post without approval.
You cannot use topic type.
You cannot use HTML syntax.
You cannot use signature.
You cannot create PDF files.
You cannot get print page.

[進階搜尋]