會員登陸
帳號:

密碼:

記住我



忘記密碼?

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


正在流覽:   1 名訪客



(1) 2 »


請問這個要求需要使用到multi-task甚至是RTOS嗎?
中級會員
註冊日期:
2014/09/29 12:04
所屬群組:
註冊會員
文章: 53
等級: 6; EXP: 12
HP : 0 / 128
MP : 17 / 1117
離線
MCU: PIC16F1824
Compiler: XC8
IDE: X
各位好,小弟我目前在寫一個project。需求"大致"(需求很細故不贅述)如下:

1.輸出一PWM,週期為一秒,duty視情況需求為16% or 32%
2.有兩顆LED,閃爍最短周期0.25秒(duty33%),最長2秒(duty50%)
3.I2C通訊,週期為一秒
4.最高priority的外部中斷(執行後MCU自動沒有電源)

順序:

MCU利用I2C抓取slave端的資料,判定電池在哪個狀態,如果為低電壓,則輸出16%duty之PWM同時控制LED閃爍;如果為中電壓,輸出32%duty之PWM同時控制LED閃爍,在這過程中如果有外部中斷則執行。

困難:

如果LED閃爍的方式是用delay的話,當外部中斷發生時並不能馬上執行,所以不能用delay的方式寫。且在delay中也無法切換PWM的頻率。

上網查了FreeRTOS跟Salvo,想說找寫好的API來呼叫並學習如何使用,但遇到以下困難點:

1.FreeRTOS沒有支援PIC16
2.Salvo有支援PIC16,但所使用的compiler是HI-TECH

如果資訊提供不足,請知會我一聲,小弟會隨後補上。
想請問各位前輩,小弟目前該從哪裡著手比較好?這個程式需要用到Multi-task嗎?如果要用/不用的話,該怎麼樣才能達到硬體時間的要求?

謝謝各位撥冗查看,小弟感激不盡。

9月11日 12:01:17
轉換PDF檔 列印


Re: 請問這個要求需要使用到multi-task甚至是RTOS嗎?
版主
註冊日期:
2004/04/30 10:53
來自 CAE, Microchip
所屬群組:
站務管理者
註冊會員
MICROCHIP
文章: 14102
等級: 72; EXP: 43
HP : 1071 / 1785
MP : 4700 / 69921
在線上

1.輸出
@PWM,週期為@秒,duty視情況需求為16% or 32%
2.有兩顆LED,{{最短周期0.25秒(duty33%),最長2秒(duty50%)
3.I2C通訊,週期為@
4.最高priority的
~部中斷(執行後MCU自動沒有電源)


以上的功能算是很基本的應用,用最基本的方式就可以處理。這還不需要使用 RTOS 的,再說 PIC16F1824 是好小顆的 PIC, RTOS 是不會支援如此小元件的。

1. PWM 是硬體產生的,隨時隨地都可以更新 Duty Cycle 的,這與中斷無關。

2. LED 的閃爍控制可以使用 Timer 計時中斷方式來控制其閃爍效果。所以說 LED 控制是再背景完成的不會影響主程式的運作。

3. I2C 也是時間到就執行,與 1 & 2 無關。

4. 中斷發生時,分別檢查 xxIF 看是誰產生的中斷,如果是外部中斷的發生即可立即斷水斷電自我立即毀滅關機。

9月11日 13:50:21
轉換PDF檔 列印


Re: 請問這個要求需要使用到multi-task甚至是RTOS嗎?
資深會員
註冊日期:
2010/06/30 16:18
來自 CAE, Microchip Technology Inc.
所屬群組:
站務管理者
註冊會員
文章: 1543
等級: 33; EXP: 41
HP : 162 / 810
MP : 514 / 17126
離線
Salvo 是要收費的喔,
不過好像很久沒更新了....

9月11日 14:42:29
轉換PDF檔 列印


Re: 請問這個要求需要使用到multi-task甚至是RTOS嗎?
中級會員
註冊日期:
2014/09/29 12:04
所屬群組:
註冊會員
文章: 53
等級: 6; EXP: 12
HP : 0 / 128
MP : 17 / 1117
離線
引用:

1. PWM 是硬體產生的,隨時隨地都可以更新 Duty Cycle 的,這與中斷無關。

2. LED 的閃爍控制可以使用 Timer 計時中斷方式來控制其閃爍效果。所以說 LED 控制是再背景完成的不會影響主程式的運作。

3. I2C 也是時間到就執行,與 1 & 2 無關。

4. 中斷發生時,分別檢查 xxIF 看是誰產生的中斷,如果是外部中斷的發生即可立即斷水斷電自我立即毀滅關機。


謝謝版主回覆,有些問題想要在請教版主您。

據我所知,如果程式不在CCPRxL:CCPxCON設定新值,PWM並不會更新它的Duty,只是會一直重複輸出同樣Duty的PWM。

LED的閃爍條件與I2C所擷取到的電流有關,請問在這種情況下,要如何使用Timer中斷的方式達到LED的閃爍呢?

9月11日 15:08:36
轉換PDF檔 列印


Re: 請問這個要求需要使用到multi-task甚至是RTOS嗎?
資深會員
註冊日期:
2004/07/23 16:25
所屬群組:
註冊會員
文章: 1163
等級: 29; EXP: 80
HP : 0 / 720
MP : 387 / 27714
離線
眯著眼睛,隨便寫寫,pseudo code 大概就這樣

跟本不用os

就4ms 中斷一次,主程序每4ms 處理一次時間,再用flag 控制,簡簡單單~~


main_loop
()

    if
1sec_set{
        
read_i2c()
        if
low_battery{
            
led_16_set
        
}else if mid_battery{
            
led_32_set
        
}
    }
    
tbm_4ms_on{
        
1sec_cnt--
        if(
1sec_cnt==0){
            
1sec_cnt=250
            1sec_set
=1
        
}
        
        
led_cnt--
        if(
led_cnt==0){
            if
led_16_set{
                if
led_on{
                    
led_off
                    pwm_out
=0
                    led_cnt
=250-40
                    
                
}
                else{
                    
led_on
                    pwm_out
=1
                    led_cnt
=40
                
}
            }
            else if
led_32_set{
                if
led_on{
                    
led_off
                    pwm_out
=0
                    led_cnt
=250-80
                
}
                else{
                    
led_on
                    pwm_out
=1
                    led_cnt
=80
                
}
            
            }
        }
        
        

    }    
}

9月11日 15:46:42
轉換PDF檔 列印


Re: 請問這個要求需要使用到multi-task甚至是RTOS嗎?
中級會員
註冊日期:
2014/09/29 12:04
所屬群組:
註冊會員
文章: 53
等級: 6; EXP: 12
HP : 0 / 128
MP : 17 / 1117
離線
To Eigen:
抱歉....小弟是新手@@不太懂您的意思

請問4ms中斷一次,主程序每4ms處理一次時間,是指什麼意思?

9月11日 16:20:12
轉換PDF檔 列印


Re: 請問這個要求需要使用到multi-task甚至是RTOS嗎?
資深會員
註冊日期:
2004/07/23 16:25
所屬群組:
註冊會員
文章: 1163
等級: 29; EXP: 80
HP : 0 / 720
MP : 387 / 27714
離線
你不懂 4ms 處理一次?

一般pic timer0 ,最基本就是讓timer0 4ms interrupt 一次。

當然你要 1ms 8ms 16ms 都可以,只是最基礎都是 4ms,每中斷一次,就 set flag



二、你的main loop,則一直檢查 flag ,flag set,就表示 發生 4ms 中斷,就進去處理

處理什麼? 250-- 到0 = 1sec ,

40-- 到 0 =160ms 210--到0 =840ms = 1sec duty 16%
80-- 到 0 =320ms 170--到0 =780ms = 1sec duty 32%

1sec 的pwm 用 timer 很容易就做出來了~~

9月11日 18:36:22
轉換PDF檔 列印


Re: 請問這個要求需要使用到multi-task甚至是RTOS嗎?
中級會員
註冊日期:
2014/09/29 12:04
所屬群組:
註冊會員
文章: 53
等級: 6; EXP: 12
HP : 0 / 128
MP : 17 / 1117
離線
To Eigen:
謝謝大大回覆。您說的這個方法是Round-Robin with interrupt吧?
當中斷發生時跳進中斷函式裡set flag(自己設的變數),再跳回main裡用while輪詢flag,當flag為true就進入if裡面做task。

想請問一下大大,我在網路上看到另一種寫法,該寫法是說:中斷發生後進入中斷函式,直接在中斷函式裡面做task,做完之後再跳回main。

想請問這兩種寫法的差異在哪?這兩個寫法的優缺點?

謝謝前輩。

9月12日 09:30:28
轉換PDF檔 列印


Re: 請問這個要求需要使用到multi-task甚至是RTOS嗎?
資深會員
註冊日期:
2012/05/04 19:18
所屬群組:
註冊會員
文章: 179
等級: 12; EXP: 43
HP : 0 / 285
MP : 59 / 4500
離線
假設你在中斷內處理事情,若這個期間內發生更中要的中斷怎麼辦?
除非你是比較高階的MCU,可以巢狀中斷,也就是說中斷發生時,可以被更高優先權的中斷給攔截而去處理高優先權中斷的事,但以這種pic16或pic18來說,
盡量簡單就是中斷事件發生後設旗標,然後再main loop內去處理事件,
這樣會比你把事情擠在中斷內處理完更有彈性!

9月12日 11:26:32
轉換PDF檔 列印


Re: 請問這個要求需要使用到multi-task甚至是RTOS嗎?
版主
註冊日期:
2004/04/30 10:53
來自 CAE, Microchip
所屬群組:
站務管理者
註冊會員
MICROCHIP
文章: 14102
等級: 72; EXP: 43
HP : 1071 / 1785
MP : 4700 / 69921
在線上

想請問
@下大大,我在網路上看到另@種寫法,該寫法是說:中斷發生後進入中斷函式,直接在中斷函式裡面做task,做完之後再跳^main


這種做法不是學者,那是即時作業系統的做法很複雜的。初學者用這種方式程式是穩死的。
鍵意第一做法,由 Timer 的中斷來設定旗號交由主程式這個時段該執行那的 Task。
參考一下 W402T v2.0 PIC18F整合應用課程 的做法。如下貼圖。


不過你的需求是很簡單不要搞到這麼複雜。先從如何讓 LED 在背景程式下做點亮熄滅的控制或閃爍。

附加檔案:



jpg  擷取.JPG (93.21 KB)
16_59b756c325343.jpg 1110X761 px

9月12日 11:32:48
轉換PDF檔 列印



(1) 2 »



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

[進階搜尋]


搜尋
線上教學影片
網頁捷徑
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