Em viết một chương trình tạo xung pwm bằng timer0 với chu kỳ xung T = 51.2us nhưng không hiểu thế nào mà đều ra là 70us ??
Đoạn chương trình C
Đoạn timer0 bằng ASM
Trong đó:
- Lệnh MOVLW:Mất 1 chu kỳ máy
- Lệnh MOVWF:Mất 1 chu kỳ máy
- Lệnh XORWF:Mất 1 chu kỳ máy
Tài liệu tham khảo lệnh asm: http://ww1.microchip.com/downloads/e...Doc/31029a.pdf
Chương trình: timer0-pwm.zip
Đoạn chương trình C
#include <16F877a.h>
//#DEVICE ADC= 8
#include <def_877a.h>
#FUSES NOWDT, HS, NOPUT, NOPROTECT, NODEBUG, NOBROWNOUT, NOLVP, NOCPD, NOWRT
#use Delay(Clock=20000000)
//------------------------------------------------------------------------------------------------
#define pwm1 RB0
//-------------------------------ngắt timer0-----------------------------------------------
#int_TIMER0
void TIMER0_isr(void)
{
set_timer0(127);
pwm1=!pwm1;
}
//-----------------------------------------------------------------------------
void main()
{
setup_adc(ADC_OFF);
set_tris_a(0xff);
set_tris_d(0x00);
set_tris_b(0x00);
set_tris_c(0x00);
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);//0-255 tran 51.2us
delay_ms(100);
set_timer0(127);
enable_interrupts(INT_TIMER0);
enable_interrupts(GlOBAL);
//-----------------------------------------------------------------------------
while(1)
{
}
}
//#DEVICE ADC= 8
#include <def_877a.h>
#FUSES NOWDT, HS, NOPUT, NOPROTECT, NODEBUG, NOBROWNOUT, NOLVP, NOCPD, NOWRT
#use Delay(Clock=20000000)
//------------------------------------------------------------------------------------------------
#define pwm1 RB0
//-------------------------------ngắt timer0-----------------------------------------------
#int_TIMER0
void TIMER0_isr(void)
{
set_timer0(127);
pwm1=!pwm1;
}
//-----------------------------------------------------------------------------
void main()
{
setup_adc(ADC_OFF);
set_tris_a(0xff);
set_tris_d(0x00);
set_tris_b(0x00);
set_tris_c(0x00);
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);//0-255 tran 51.2us
delay_ms(100);
set_timer0(127);
enable_interrupts(INT_TIMER0);
enable_interrupts(GlOBAL);
//-----------------------------------------------------------------------------
while(1)
{
}
}
.................... #int_TIMER0
.................... void TIMER0_isr(void)
.................... {
.................... set_timer0(127);
*
003C: MOVLW 7F
003D: MOVWF 01
.................... pwm1=!pwm1;
003E: MOVLW 01
003F: XORWF 06,F
.................... }
.................... void TIMER0_isr(void)
.................... {
.................... set_timer0(127);
*
003C: MOVLW 7F
003D: MOVWF 01
.................... pwm1=!pwm1;
003E: MOVLW 01
003F: XORWF 06,F
.................... }
- Lệnh MOVLW:Mất 1 chu kỳ máy
- Lệnh MOVWF:Mất 1 chu kỳ máy
- Lệnh XORWF:Mất 1 chu kỳ máy
Tài liệu tham khảo lệnh asm: http://ww1.microchip.com/downloads/e...Doc/31029a.pdf
Chương trình: timer0-pwm.zip
Comment