• slider image 442
  • slider image 492
  • slider image 493
  • slider image 494
  • slider image 495
  • slider image 496
:::

論壇索引


Board index » All Posts




pwm
新會員
新會員


各位高手....
我寫了一個簡單的抓pwm程式,可是想請問是否可以讓我的程式執行下來更有效率,以方便我抓到更小的pwm波寬值,麻煩高手指教,謝謝。
我的程式如下:
#include <p18f452.h>
#include <usart.h>
#include <delays.h>
#include <timers.h>
#include <stdlib.h>
#include <portb.h>

#define UART_40Mhz_19200 129


void external_int(void);

unsigned char a[7];
unsigned char PWM_out[8];


union
{
unsigned char One_Byte[2];
unsigned int Two_Byte[1];
}Buff;


#pragma code high_vector=0x0008 // high priotity interrupt isr
void high_interrupt (void)
{_asm goto external_int _endasm}
#pragma code

//********* Port B chagne detect *********
#pragma interrupt external_int

void external_int()
{
//** INT0 **********************************************
if(INTCONbits.INT0IF){
WriteTimer1(0);
TMR1H=0;
TMR1L=0;
INTCONbits.INT0IF=0; // clear INT0IF

}

//**** INT 1 **********************************************
if(INTCON3bits.INT1IF){
//x=ReadTimer1();
Buff.One_Byte[0]=TMR1L;
Buff.One_Byte[1]=TMR1H;
INTCON3bits.INT1IF=0;
}
}
#pragma

//**********************************************//
void main(){
// Setup UART for 9600bps with 20MHZ for high speed
OpenUSART(USART_TX_INT_OFF&
USART_RX_INT_OFF&
USART_ASYNCH_MODE&
USART_EIGHT_BIT&
USART_CONT_RX&
USART_BRGH_HIGH,UART_40Mhz_19200);
//Setup Timer1
OpenTimer1(TIMER_INT_OFF&
T1_16BIT_RW&
T1_SOURCE_INT&
T1_PS_1_1);

//Initialize Ports
TRISB=0b00000011;// set RB5-RB4 for input on change
TRISCbits.TRISC2=1;// CCP1
TRISCbits.TRISC6=0;
TRISCbits.TRISC7=1;

TRISD=0; // PORTD all output
PORTB=0;
PORTD=0;

// Set up interrupt control bit
PIR1bits.TMR1IF=0; // clear timer1 IF

// setup INT0
INTCONbits.INT0IE=1;
INTCONbits.INT0IF=0;
INTCON2bits.INTEDG0=1;// set INT0 for Rising Edge

// setup INT1
INTCON3bits.INT1IE=1;
INTCON3bits.INT1IF=0;
INTCON2bits.INTEDG1=0;// set INT1 for Falling Edge
INTCON3bits.INT1IP=1;// set for Low Priority

RCONbits.IPEN=1; // enable priority interrupt
INTCONbits.PEIE=1;// enable peripheral interrupt
INTCONbits.GIE=1;// enable global interrupt

putrsUSART("\r AS5040 PWM Measurement \n\r");

while(1)
{
//ltoa(x,a);
ltoa(Buff.Two_Byte[0],PWM_out);
putrsUSART("\rPWM ");
Delay10KTCYx(1);
//putsUSART(a);

putsUSART(PWM_out);
putrsUSART("\n");
}

}



發表於: 2005/7/5 8:04
頂部


Re: ECCP用于捕捉的问题
資深會員
資深會員



TIMER3 -> 16 bit
PRESCALE 1:8 -> 3 bit
19 bit -> 512 K

20MHz -> 5 MIPs

SO MAX TIME --> 0.1 Sec -> 10 Hz

PRESCALE 或許需要再調高一點會更好

不會 18 不懂 C

發表於: 2005/7/5 3:36
頂部


Re: 程式指點...
資深會員
資深會員


PCL --> PROGRAM COUNTER 的 LOW BYTE
執行第 ( 幾 ) 個指令的參考值
本來是執行一個指令 便加一
但 ADDWF PCL ,F 會再加上放在 W 的值
所以便會跳過 W個 指令
例如 W = 0 則 會執行 第一個 (沒跳) 指令
retlw b'00000001'

例如 W = 5 則 會執行 第六個 (跳五個) 指令
retlw b'00000100'

RETLW 返回時 會將一個值 放在 W 內( 如 b'00000001' )
所以這種程式寫法 通常都叫做查表法


發表於: 2005/7/5 3:06
頂部


Re: 如何設定內部RC震盪
資深會員
資深會員


參照:

astonsun 寫道:
請問 12F675 12F629 16F676等內部RC震盪值存放在0x3FF位址,如何在燒錄時自動將校正值存入0x3FF內



這數值是出廠時便已設定好的 , 你只需把它取出填入OSCCAL
便行

bsf STATUS, RP0 ;Bank 1
call 0XFFh ;Get the cal value
movwf OSCCAL ;Calibrate
bcf STATUS , RP0 ;Bank 0

規格書 : DS41190C-page 54
9.2.5.1 Calibrating the Internal Oscillator

如此便能得到較正確的震盪值

發表於: 2005/7/5 2:34
頂部


如何設定內部RC震盪
初級會員
初級會員


請問 12F675 12F629 16F676等內部RC震盪值存放在0x3FF位址,如何在燒錄時自動將校正值存入0x3FF內

發表於: 2005/7/4 23:58
頂部


程式指點...
中級會員
中級會員


大家好 我照著書上範例測試 可以work 但是我不明白
addwf PCL,f 是要幹麻ㄉ 請指點 謝謝

list p=16F873a
#include <p16f873a.inc> ; Include file locate at defult directory

w_temp equ 0x20
STATUS_temp equ 0x21
scaler equ 0x22
blankcnt equ 0x23
maxcount equ 0x32

;********************************************

;*********************************************
org 0x00
nop
goto Main
org 0x04
goto IntServ

IntServ
movwf w_temp
swapf STATUS_temp,w
movwf STATUS_temp
btfsc PIR1,TMR1IF
call Timer1
swapf STATUS_temp,w
movwf STATUS
swapf w_temp,f
swapf w_temp,w
retfie

Timer1
banksel PIR1
bcf PIR1,TMR1IF
decf scaler,f
clrf TMR1L
movlw 0xf8
movwf TMR1H
movlw 0x2f
movwf TMR1L
return
;----------------------main----------------------------------------------------------
Main
call initial
loop
call Blink
call looptime
goto loop

;-------------------------------------------------------------------------------------
initial
banksel maxcount
movlw maxcount
movwf blankcnt
movlw b'11111111'
movwf PORTB
movlw 0x04
movwf scaler
banksel TRISB
clrf TRISB
banksel T1CON
clrf T1CON

clrf TMR1H
clrf TMR1L
clrf INTCON
bsf INTCON,PEIE
banksel PIE1
clrf PIE1
bsf PIE1,TMR1IE
banksel PIR1
clrf PIR1
banksel TMR1L
clrf TMR1L
movlw 0xf8
movwf TMR1H
movlw 0x2f
movwf TMR1L
bsf T1CON,TMR1ON
banksel INTCON
bsf INTCON,GIE
return
;----------------Blink--------------------------------------------------------------------------
Blink
decfsz blankcnt,f
goto blinkend
movlw maxcount
movwf blankcnt
call blinktable
xorwf PORTB,f
blinkend
return
;----------------table--------------------------------------------------------------------------
blinktable
movf PORTB,w
andlw b'00000111'
addwf PCL,f
retlw b'00000001'
retlw b'00000011'
retlw b'00000110'
retlw b'00000010'
retlw b'00000101'
retlw b'00000100'
retlw b'00000111'
retlw b'00000110'
;---------------------looptime-----------------------------------------------------------------
looptime
btfss scaler,7
goto looptime
movlw 5
addwf scaler,f
return
;------------------------
end

發表於: 2005/7/4 22:46
頂部


請問有哪些指令會更改FSR?
資深會員
資深會員


PIC18F452
我有一堆資料要傳送
由於我都依序放在一個變數區塊裡
(應該是屬於檔案暫存器吧?)

我的方式是
CLRF    FSR0H                 ;清除檔案暫存器指標位址H
          MOVLW   IIC_DATA_0            
;載入指標位址L
          MOVWF   FSR0L                 
;
寫入迴圈
          MOVFF   INDF0
,SSPBUF          ;送出資料
          INCF    FSR0L                 
;資料指標遞增
          CALL    WAIT_IIC              
;等待IIC傳送資料完成
          CALL    WAIT_ACK              
;等待回傳確認
          DECFSZ  EEP_W_CNT             
;寫入資料記數器-1後若不為0
          BRA     寫入迴圈              
;則繼續寫入資料
          BRA     IIC_STOP              
;停止IIC通訊

我把要傳送的資料丟到IIC_DATA_0 ~ IIC_DATA_15
然後用這副程式依序丟出去
剛剛模擬結果是沒問題
不過我目前沒開中斷
在考慮進中斷前是否需要備份FSR0L這個指標值...

目前試MOVFF MOVWF這兩個指令不會更動FSR0L的值
看了指令集,只要我不使用LFSR這指令
整個程式就都不會動到FSR暫存器了是吧?!

發表於: 2005/7/4 14:51
頂部


rs232一問
高級會員
高級會員


各位前輩:小弟我想要利用外部中斷int1取代鍵盤傳一字元到電腦終端機上再利用ReadUSART()收中斷將此一字元回傳到pic~~~字元能順利送出,但pic一直收不到資料~~~不知道哪裡有錯,請各位指點

發表於: 2005/7/4 14:20
頂部


Re: 用Capture 量測PWM的High的時間的問題
新會員
新會員


已經試了3天了...
第一次進入ISR之後出還之前有清掉旗標
第2次之後中斷旗標有上來..但..就是進不去ISR...

有人知道為什麼嗎??

謝謝 !

發表於: 2005/7/4 12:02
頂部


ECCP用于捕捉的问题
初級會員
初級會員


我采用18F458的ECCP功能测量外部频率,晶振用的是20MHz,ECCP使用TMR3为定时器,PRESCALE设为1:8,通过记录两次捕捉间的ECCPR的差值计算频率时,出现的问题是,当外部频率高于40Hz时,基本正常,但外部频率低于40Hz时,捕捉不稳定,有时能正确捕捉,但有时捕捉的结果是频率为0,从波形上看,捕捉后输出的波形跳跃很大,不稳定。
不知是什么原因?
我在中断服务程序中清除TMR1/3,CCP1/ECCP1的标志位,并获得CCP1R/ECCP1R的值,所用的编译器为PICC-18.

發表於: 2005/7/3 23:58
頂部



« 1 ... 7019 7020 7021 (7022) 7023 7024 7025 ... 7525 »



:::

Microchip連結

https://www.facebook.com/microchiptechnologytaiwan/
http://www.microchip.com.tw/modules/tad_uploader/index.php?of_cat_sn=13
https://mu.microchip.com/page/tmu
http://elearning.microchip.com.tw/modules/tad_link/index.php?cate_sn=1
https://page.microchip.com/APAC-PrefCenters-TW.html
http://www.microchip.com/
http://www.microchip.com/treelink
http://www.microchipdirect.com/
http://www.microchip.com.cn/newcommunity/index.php?m=Video&a=index&id=103
http://www.microchip.com.tw/modules/tad_uploader/index.php?of_cat_sn=2
http://www.microchip.com.tw/Data_CD/eLearning/index.html
http://www.microchip.com.tw/RTC/RTC_DVD/
https://www.microchip.com/development-tools/
https://www.youtube.com/user/MicrochipTechnology
[ more... ]

教育訓練中心

!開發工具購買
辦法說明 [業界客戶] [教育單位]
----------------------------------
!校園樣品申請
辦法說明 [教師資格] [學生資格]
----------------------------------