編譯時出現 "函數" is never called 的警告要怎麼關掉?
|
||||
---|---|---|---|---|
資深會員
![]() ![]() |
MCU:16F819
X IDE:v5.45 XC8:v2.31 假設我設一個函數 BUZZ_STOP(),但在程式終未呼叫到,編譯時會出現下面的警告: warning: (520) function "_BUZZ_STOP" is never called 雖然可以編譯執行,但每次看到警告就是不舒服,之前在用 XC32 寫 PIC32 系列時都沒有這種現象,但為什麼用 XC8 寫 16F 系列時會有這種警告,我在 X IDE 內找不到地方可以關掉,請問有辦法關掉這個警告嗎?
發表於: 2021/7/15 11:28
|
|||
|
Re: 16F819 CCP 模組用 PWM 工作模式時週期和 Duty Cycle 解析度不同的疑問
|
||||
---|---|---|---|---|
資深會員
![]() ![]() |
謝謝 Ryang 大的說明,我發現去改變那 2 位元的 LSB 對輸出影響不大,最簡單的方法就是把 Duty Cycle 當成 8 位元的解析度來做就好,所以就令 CCPR1L = PR2/2,這樣也會產生接近 50% 的方波。
發表於: 2021/7/15 9:25
|
|||
|
Re: 16F819 CCP 模組用 PWM 工作模式時週期和 Duty Cycle 解析度不同的疑問
|
||||
---|---|---|---|---|
資深會員
![]() ![]() |
請問 Ryang 大:
現在 16F819 跑 8MHz,所以指令週期就是 1/(8MHz/4)=0.5us 若想製造一個 PWM 週期 = 1ms(1KHz),Duty Cycle = 50% 的方波。 設 TMR2 的 Prescaler = 4,所以計算 PR2 的值 = PWM 週期 /(Prescaler×指令週期) = 1ms/(4×0.5us) = 500, 所以 PR2 = 500。 再來 Duty Cycle 是放在 CCPR1L(MSB 8位元) 和 CCP1CON 的 bit5~4(LSB 2位元), 請問這 10 位元的值該如何計算以填入 2 個暫存器內?謝謝。
發表於: 2021/7/12 11:30
|
|||
|
Re: 16F819 CCP 模組用 PWM 工作模式時週期和 Duty Cycle 解析度不同的疑問
|
||||
---|---|---|---|---|
資深會員
![]() ![]() |
原來關鍵就是 FIGURE 9-3 裡面 TMR2 右邊的 Note 1 註釋,由於 T2CON 的 prescaler 是 2-bit,所以拿來跟 TMR2 串在一起就變成 10-bit timer,這樣就可以比對了,但是 internal Q clock 是什麼東西還是沒概念,謝謝。
發表於: 2021/7/9 15:24
|
|||
|
16F819 CCP 模組用 PWM 工作模式時週期和 Duty Cycle 解析度不同的疑問
|
||||
---|---|---|---|---|
資深會員
![]() ![]() |
使用 PWM 模式時,PWM 的週期值是放在 PR2 暫存器,跟搭配的 TMR2 一樣是 8 位元。
而 Duty Cycle 是 10 位元解析度,放在 CCPR1L(MSB 8位元) 和 CCP1CON 的 bit5~4(LSB 2位元)。 依據這張時序圖,當 TMR2 = PR2 時 PWM 輸出 1,當 TMR2 = Duty Cycle 時 PWM 輸出 0。 TMR2 和 PR2 都是 8 位元,最大就是 FF=255(d),兩者互相比對沒問題,但 Duty Cycle 卻有 10 位元,最大是 3FF=1023(d),就算是 50% 工作週期也有 3FF/2=1FF=511(d)。 那 TMR2 怎麼計數都不可能跟 10 位元的值比較,但為什麼輸出可以正確,是 MCU 裡面會再做一個轉換比較嗎?
發表於: 2021/7/9 10:49
|
|||
|
Re: PIC16 Interrup
|
||||
---|---|---|---|---|
資深會員
![]() ![]() |
我在使用 XC8 寫 PIC16F 的時候也遇到這個問題,一開始我也是如同 XC8 講義 Page 116 那樣宣告中斷函數:
void interrupt ISR(void){ } 結果也是出現樓主的錯誤訊息一直編譯不通過,後來去 Google 發現這兩個帖子: https://bbs.21ic.com/icview-2546270-1-1.html https://bbs.csdn.net/topics/392505791 把 void interrupt 中斷名(void) 改為 void __interrupt() 中斷名(void),下劃線是兩個,於是我的中斷函數改成這樣子: void __interrupt() ISR(void){ } 這樣就編譯通過了,為什麼要這樣子宣告才行,是 XC8 講義寫錯了嗎?有人知道原因嗎?
發表於: 2021/7/1 16:52
|
|||
|
Re: X IDE 能否產生與劇本同名稱的 HEX 檔?
|
||||
---|---|---|---|---|
資深會員
![]() ![]() |
謝謝 yang 大的回覆,我目前是在不同的劇本中設型號關鍵字,然後在程式中設條件組譯判斷式,X IDE 會決定哪些哪些程式段要編譯,用某個劇本編譯完的 HEX 檔我都另外複製到其他地方並更名為型號名稱,如果分成幾個不同型號的專案,專案數太多會變的不好管理,所以希望能一個專案內多個劇本的方式來管理型號版本,希望未來的 X IDE 在劇本中能增加設定輸出 HEX 檔名稱的選項,沒設的話就用專案名稱。
發表於: 2021/2/24 16:50
|
|||
|
X IDE 能否產生與劇本同名稱的 HEX 檔?
|
||||
---|---|---|---|---|
資深會員
![]() ![]() |
大家好:
我在 X IDE 中編輯了個劇本,但編譯產生的 HEX 檔都是專案名稱例如:專案名稱.X.production.hex 能否設定成直接產生劇本的名稱例如:劇本名稱.X.production.hex 不然都會搞不清楚產生的 HEX 檔是哪一個劇本的, 不知道 X IDE 裡面有沒有這個設定?謝謝。
發表於: 2021/2/17 14:42
|
|||
|
Re: MX470 的 RB14 讀取 AD 值偏高
|
|
|||
---|---|---|---|---|
資深會員
![]() ![]() |
發表於: 2019/3/20 13:45
|
|||
|