會員登陸
帳號:

密碼:

記住我



忘記密碼?

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


正在流覽:   1 名訪客





pic18f4520程式設定問題
新會員
註冊日期:
4月12日 20:15:59
所屬群組:
註冊會員
文章: 7
等級: 1; EXP: 60
HP : 0 / 15
MP : 2 / 15
離線
想請問各位前輩,我想要讓latd0產生作用,但不知道哪裡出嘞問題,不能作用,這是哪裡設置錯誤呢?

#include <xc.h>
//宣告時間相關變數並初始化為0
unsigned int sec=0, update=0;

//定義中斷優先順序位置
void interrupt HIGHISR(void)
{
PIR1bits.TMR1IF = 0; //TMR1未發生溢位
WriteTimer1(0x80000); //設定計時器初始值
//TMR1H = 0b10000000;
//TMR1L = 0b00000000;
update=1; // 設定更新旗標
}

void main() {
TRISBbits.TRISB0 = 1; // 將TRISB設為1,PORTB設定為輸入
TRISD = 0; // 將TRISD設為0,PORTD設定為輸出
LATD = 0; // 將PORTD清除
TRISCbits.RC2 = 0; // 將TRISC設為0,PORTC設定為輸出
LATC = 0; // 將PORTC清除

//設置類比數位訊號轉換模組
ADCON1 = 0x0F; //

//設置TIMER2模組生成PWM週期
T2CON = 0b00000101; //T2CON定義,後除器設定位元<6-3>1:1,啟動TIMER2計時器,前除器設定位元<1-0>1:4
PWM1CONbits.PRSEN = 1; // PWM1CON定義,當觸發關閉的事件消失,ECCPASE位元將自動清除為0
PWM1CONbits.PDC = 0x7F; //延遲時間設定
PR2 = 0xF9; //設定訊號週期暫存器PR2為249,頻率為4kHz,CLK0頻率為16MHz,PWM訊號週期=[PR2+1]*4*TOSC*[TMR2prescale value]
//PR2 = 0xF9 = 249 這是指 MSB 部分,別忘了他因為是 Tcy 進去的所以每改一個數值就會影響到 2-bit 的 Duty 變化。所以 PR2+1 還要加上兩個 bits 的當量變成 0xFA x 2-bit = 250 x 4 = 1000
//致於 Duty 的算法是 SetDCPWM1( 0x1F4) ==> 這在展開成 10-bit 的化成為 0b 01 1111 0100 = 500 十進制。
//但真正寫到 CCPR1L 的值為 0b0111 1101 + CCP1CON<5:4> 0b00 才對。
//所以最後算出來的Duty Cycle 為 500 / 1000 = 50%
CCPR1L = 0x7D;
CCP1CON = 0b10001100; //CCPxCON定義,PWM工作週期的最低位元,配合CCPxRL暫存器使用<5-4>,CCP模組設定位元<3-0> =>波寬調變模式
ECCP1AS = 0b01000000; // ECCP1AS定義,<7>輸出正常,<6-4>禁止自動關閉,<3-2>將接腳A和C設定為0,<1-0>將接腳B和D設定為0

//設置TIMER1模組
T1CON = 0;
T1CON = 0b11001111; //T1CON定義,開啟TIMER計時器16位元讀寫模式<7>,前除器設定位元<5-4>1:1,開啟外部震盪源<3>,不進行指令週期與外部訊號同步程序<2>,使用外部時脈輸入<1>,開啟TIMER1計時器<0>
WriteTimer1(0x80000); //設定計時器初始值
//TMR1H = 0b10000000;
//TMR1L = 0b00000000;
PIR1bits.TMR1IF = 0; //TMR2計時器符合PR2週期暫存器之內容,須以軟體清除為0

//設置中斷
RCONbits.IPEN = 1; //開啟中斷優先順序功能
INTCONbits.GIE = 1; //開啟所有的中斷
INTCONbits.PEIE = 1; //開啟所有的硬體中斷
IPR1bits.TMR1IP = 1; //設置高優先中斷
PIE1bits.TMR1IE = 1; //TMR1未發生溢位
PIE1bits.TMR2IE = 1; //關閉TMR2計時器符合PR2週期暫存器之內容中斷功能

while (1) { // 永久迴圈
if(update = 0) {
LATDbits.LATD0=~LATDbits.LATD0; // 每秒閃爍
sec++; // 秒數遞加
if (sec >= 60)
sec -= 60;
update = 0; //歸零
}
if (sec == 0)
SetDCPWM1(500); // 向PWM寫入一個新的佔空比值
else if (sec == 30)
SetDCPWM1(0); // 向PWM寫入一個新的佔空比值
}
}

7月18日 19:54:02
轉換PDF檔 列印


Re: pic18f4520程式設定問題
版主
註冊日期:
2004/04/30 10:53
來自 CAE, Microchip
所屬群組:
站務管理者
註冊會員
MICROCHIP
文章: 14436
等級: 72; EXP: 96
HP : 1079 / 1799
MP : 4812 / 75200
離線
//定義中斷優先順序位置
void interrupt HIGHISR(void)
{
PIR1bits.TMR1IF = 0; //TMR1未發生溢位
WriteTimer1(0x80000); //設定計時器初始值
//TMR1H = 0b10000000;
//TMR1L = 0b00000000;
update=1; // 設定更新旗標}

所以你的 Timer1 必須使設定使用外部的 32768Hz 的 Crystal 來當作 Timer1 的 OSC Source。
時間設成 0x8000, 意味這 Timer1 每一秒中斷一次。中斷後將旗號 update 設成 1 。


while (1) { // 永久迴圈
if(update = 0) {
LATDbits.LATD0=~LATDbits.LATD0; // 每秒閃爍
sec++; // 秒數遞加
if (sec >= 60)
sec -= 60;
update = 0; //歸零
}

if(update = 0) 這個判斷式不對,請改成 if(update ==1)
=0 不是判斷式而是一個指定運算。所以要改一下。

7月19日 07:57:50
轉換PDF檔 列印


Re: pic18f4520程式設定問題
新會員
註冊日期:
4月12日 20:15:59
所屬群組:
註冊會員
文章: 7
等級: 1; EXP: 60
HP : 0 / 15
MP : 2 / 15
離線
謝謝板主

7月19日 14:18:05
轉換PDF檔 列印


Re: pic18f4520程式設定問題
新會員
註冊日期:
4月12日 20:15:59
所屬群組:
註冊會員
文章: 7
等級: 1; EXP: 60
HP : 0 / 15
MP : 2 / 15
離線
板主您好,想請問您
我目前把震盪器設定在hspll上,
T2CON = 0b00000100;
PR2 = 0x2;
CCPR1L = 0xA;
但示波器卻沒有顯示出波形,這是什麼原因呢?
感謝

7月27日 14:34:30
轉換PDF檔 列印


Re: pic18f4520程式設定問題
版主
註冊日期:
2004/04/30 10:53
來自 CAE, Microchip
所屬群組:
站務管理者
註冊會員
MICROCHIP
文章: 14436
等級: 72; EXP: 96
HP : 1079 / 1799
MP : 4812 / 75200
離線
Duty 必需小於週期(CCPR1L<PR2)。
CCP1 腳位也要設成輸出。

7月28日 12:44:28
轉換PDF檔 列印






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

[進階搜尋]


搜尋
Microchip連結

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