|
发表于 2011-8-7 07:58:03
|
显示全部楼层
用 AVR 可以搞定。
(原文件名:DutyCycle25.png)
注意:
1. 可将 PORT value 存於 R16, R17, 用 OUT 指令, 这样一周期便可更改 PORT Bit.
2. 如使用 CBI 或 SBI 指令, 是占用 2 周期, 上方的等待值需减小1。
3. 以下用Tiny2313试验成功, 楼主可用任何AVR, 只须改变 PORT 及 DDR 便可。
;*******************************************************************
;*******************************************************************
;
; Description
;
; To produce a frequency 1/1000 of the original input,
; with 25% duty cycle
; Author = eblc1388
; Target = Tiny2313 or any AVR
; Date = 2011-08-7
;
; Code is written for use with AVR assembler
;
; Making use of cycle accurate delay macro by Danni
;
; Program operation verified using AVR simulator on 07-Aug-2011
;
;******************************************************************************
.include "tn2313def.inc"
;************************************************************************/
;* */
;* Delay Macro 8 ... 65543 Cycle */
;* */
;* Author: Peter Dannegger */
;* */
;************************************************************************/
.macro mdelay
ldi r24, low( @0 - 8 )
ldi r25, high( @0 - 8 )
sbiw r24, 4
brcc pc - 1
cpi r24, 0xFD
brcs pc + 4
breq pc + 3
cpi r24, 0xFF
breq pc + 1
.endmacro
.org 0
ldi r16,0x01 ; port B bit 0 as output
out DDRB,r16
clr r17
loop:
out PORTB, r16 ; set port in high
mdelay 249 ; delay 249 cycles
out PORTB, r17 ; set port pin low
mdelay 747 ; delay 747 cycles
rjmp loop
;******************************************************************************
; end of file
;****************************************************************************** |
|