;脉宽调制(PWM)输出程序
;范例50 ;以定时器定时产生精确半秒信号,以PD5输出精确秒号.ORG $000 ;晶体实测频率为8000367HZ
STRT40: RJMP RST40 ;USE 8535
.ORG $008 ;t/C1 overflow vector
RJMP T1_OVF
.ORG $011
RST40: LDI R16,HIGH(ramend)
OUT SPH,R16
LDI R16,LOW(ramend)
OUT SPL,R16
SBI DDRD,5 ;PD5(OC1A)为输出
CBI PORTD,5 ;初始输出为低
LDI R16,2 ;8分频INT(8000367/8)=1000046) 折半500023定半秒
OUT TCCR1B,R16 ;T/C1控制寄存器(I/O ADDR:$2E)
LDI R16,$5E ;500023=65536*8-24265=$10000*8-$5EC9
OUT TCNT1H,R16 ;TCC=$5EC9 先写高位字节
LDI R16,$C9
OUT TCNTIL,R16
LDI R16,$04
OUT TIMSK,R16 ;允许T/C1溢出中断/8535C/t1:timsk,2&t0:timsk,0
LDI R17,8 ;8次中断定半秒
CLR R16
OUT TIFR,R16 ;清除定时/计数器中断标志
SEI ;
HH40: RJMP HH40 ;背景程序略
T1_OVF: IN R5,SREG ;保存状态寄存器
DEC R17
BRNE COMP1 ;定时时间到?
IN R16,PORTD ;读入PD5当前状态
LDI R17,$20
EOR R16,R17 ;求反PD5(OC1A)输出
OUT PORTD,R16
IN R17,TCNT1L ;*
IN R16,TCNT1H ;*读回TCNT1计数值
SUBI R17,$37 ;*
SBCI R16,$A1 ;*减去$5EC9之补码$A137
SUBI R17,$FF ;*补偿指令8条占一个计数单位
SBCI R16,$FF ;*补偿后TCC=$5EC9+(TCNT1)+1
OUT TCNT1H,R16 ;*
OUT TCNT1L,R17 ;*写入TCNT1
LDI R17,8 ;重新写入中断次数
COMP1: OUT SREG,R5
RETI
;范例51 ;以比较匹配A达到时交替输出高低电平及写入其维持
;时间常数之方法实现脉宽调制输出
.ORG $000
STRT41: RJMP RST41 ;5.008MS(高):10.000MS(低) 晶振4MHZ .ORG $006
RJMP T1_CMPA ;USE 8535
.ORG $011
RST41: LDI R16,HIGH(RAMEND)
OUT SPH,R16
LDI R16,LOW(RAMEND)
OUT SPL,R16
LDI R16,$80 ;T/C1比较匹配A达到时,清除输出脚oc1a
OUT TCCR1A,R16
LDI R16,$0B ;64分频ctc1=1 比较匹配达到清tcnt1
OUT TCCR1B,R16
SBI DDRD,5
SBI PORTD,5 ;pd5(oc1a)初始化输出为高
CLR R16
OUT TCNT1H,R16 ;予清除tcnt1
OUT TCNT1L,R16
LDI R16,1
OUT OCR1AH,R16
LDI R16,$39 ;写比较匹配寄存器(313*0.25*64=5.008MS)
OUT OCR1AL,R16
LDI R16,$10
OUT TIMSK,R16 ;允许比较匹配A中断
SEI
HH41: RJMP HH41 ;背景程序略
T1_CMPA:IN R5,SREG
IN R16,TCCR1A
SBRS R16,6
RJMP OUTLOW ;当前输出低电平,转
LDI R16,1
OUT OCR1AH,R16
LDI R16,$39 ;写入高电平维持时间313
OUT OCR1AL,R16
LDI R16,$80 ;比较匹配A达到时,OC1A输出为低
OUT TCCR1A,R16
OUT SREG,R5
RETI
OUTLOW: LDI R16,2
OUT OCR1AH,R16
LDI R16,$71 ;写入低电平维持时间625(=$271) (625*0.25*64=10.000MS) OUT OCR1AL,R16
LDI R16,$C0 ;比较匹配A达到时,OC1A输出为高
OUT TCCR1A,R16
OUT SREG,R5
RETI
;范例52 ;以比较匹配达到时求反输出并按高低电平写入.ORG $000 ;维持时间之方法实现脉宽调制输出
STRT42: RJMP RST42 ;5.008MS(高):10.000MS(低) 晶振4MHZ .ORG $006
RJMP T1_CMPA
.ORG $011
RST42: LDI R16,HIGH(ramend)
OUT SPH,R16
LDI R16,LOW(RAMEND)
OUT SPL,R16
LDI R16,$40 ;比较匹配A达到时,对OC1A输出求反
OUT TCCR1A,R16
LDI R16,$0C ;256分频ctc1=1 比较匹配达到时清除cnt1 OUT TCCR1B,R16
SBI DDRD,5 ;PD5(oc1a)为输出
SBI PORTD,5 ;初始输出为高
CLR R16
OUT TCNT1H,R16 ;清除tcnt1
OUT TCNT1L,R16
OUT OCR1AH,R16
LDI R16,78 ;高电平时间常数78
OUT OCR1AL,R16
LDI R16,$10
OUT TIMSK,R16 ;允许比较匹配A中断
SEI
HH42: RJMP HH42 ;背景程序略
T1_CMPA:IN R5,SREG ;
IN R16,PORTD
SBRC R16,5
RJMP T1CM1 ;当前oc1a为高,转
LDI R16,0
OUT OCR1AH,R16
LDI R16,156 ;低电平时间常数156
OUT OCR1AL,R16
OUT SREG,R5
RETI
T1CM1: LDI R16,0
OUT OCR1AH,R16
LDI R16,78 ;高电平时间常数78
OUT OCR1AL,R16
OUT SREG,R5
RETI
;模/数转换和数/模转换及脉宽调制输出应用
;范例53 ;模拟量采集和3路脉宽调制输出(OCR1A/OCR1B&OCR2)综合程
;序/晶振4MHZ
.ORG $000
STRT50: RJMP RST50 ;avr is AT90S8535
.ORG $00E
RJMP ADCOM ;模数转换完成中断
.ORG $011
RST50: LDI R16,HIGH(ramend)
OUT SPH,R16
LDI R16,LOW(ramend)
OUT SPL,R16 ;堆栈指针初始化
CLR R11 ;通道号初始化
CLR R12
CLR R13 ;累加和予清除
OUT $07,R11 ;ADC通道初始化,指向0#通道
LDI R16,$6C ;T/C2为自运行pwm输出,加法计数匹配清除OC2,减法计
;数匹配置位OC2(正向PWM);对晶振64分频
OUT TCCR2,R16 ;tccr2' ADDR.:$25
LDI R16,$ED ;使能,启动ADC/自由运行/转换完成中断/对晶振32分频
OUT ADCSR,R16 ;ADDR:$06 adc控制状态寄存器
IN R16,ASSR
CBR R16,8
OUT ASSR,R16 ;TCNT2 用主时钟!
INC R11
OUT $07,R11 ;予切换到1号ADC通道
SBI DDRD,4
SBI PORTB,4 ;pd4:oc1b
SBI DDRD,5 ;pd5:oc1a pd4,pd5 皆为输出oc1b初始输出为高
SBI DDRD,7 ;oc2 输出
LDI R16,$E3 ;0B11100011,自运行PWM,COM1A1/0=11,COM1B1/0=10 OUT TCCR1A,R16 ;减法计数匹配清除OC1A,加法计数匹配置位OC1A(反向PWM);加法计
;数匹配清除OC1B,减法计数匹配置位OC1B(正向PWM)LDI R16,2
OUT TCCR1B,R16 ;tcnt1 8分频
LDI R16,0
OUT TCNT1H,R16 ;wr.high B at first
OUT TCNT1L,R16 ;清除TCNT1
OUT TCNT2,R16 ;清除TCNT2
OUT DDRA,R16 ;A口输入
OUT PORTA,R16 ;输入为高阻态
SEI
COMLP: CPI R11,1
BREQ COMLP ;通道号初始为1,等待切换过去
COML0: CPI R11,1
BRNE COML0 ;通道号再次为1时,0#通道正在转换,7#通道已转换完毕,;已得到8个A/D采样累加和
ASR R12
ROR R13
ASR R12
ROR R13
ASR R12
ROR R13 ;累加和除以8
BRCC COML1
CLR R16
ADC R13,R16
ADC R12,R16 ;四舍五入
COML1: OUT OCR1AH,R12
OUT OCR1AL,R13
OUT OCR1BH,R12
OUT OCR1BL,R13 ;10位数据写入比较匹配寄存器
ASR R12
ROR R13
ASR R12
ROR R13
BRCC COML2
INC R13
BRNE COML2
DEC R13
COML2: OUT OCR2,R13 ;8位数据写入比较匹配寄存器
CLR R12
CLR R13 ;累加和清除
RJMP COMLP
ADCOM: IN R15,ADCL ;ADC完成中断
IN R14,ADCH
ADD R13,R15 ;模拟数值加入累加和
ADC R12,R14
INC R11
SBRC R11,3
CLR R11 ;total 8 chanales!&8 CHANGED TO 0
OUT $07,R11 ;$07:admux'address REGISTER
RETI
;范例54 ;以R-2R电阻网络和C口配合组成DAC与输入模拟量比较实现模数转换
.ORG $000 ;电阻网络DAC最大输出(AIN0)只能达到3.32V(PCi输出只能达到5V)
STRT51: RJMP RST51 ;输入模拟量最大为4.98V,故应将DAC输出放大1.5倍再与前者比较
.ORG $011 ;也可将输入模拟量衰减为2/3再与DAC输出比较
RST51: LDI R16,2 ;但应将转换结果乘以1.5以使其复原,程序取后者OUT SPH,R16 ;堆栈指针初始化
LDI R16,$5F
OUT SPL,R16
SER R16
OUT DDRC,R16 ;C口全部为输出,DAC输出为AIN0输入
CLR R16
OUT DDRB,R16 ;B口为输入
LDI R16,$F3
OUT PORTB,R16 ;PB2(AIN0),PB3(AIN1)输入为高阻状态
CLR R15 ;模数转换结果予清除
LDI R16,$80 ;逼近增量初始值
CMPLP: ADD R15,R16 ;模数转换阶段值加逼近增量
OUT PORTC,R15 ;转成模拟量
NOP
NOP
NOP ;4MHZ/等待1微秒
SBIC ACSR,ACO ;输入模拟量大于DAC模拟量,清除ACO
SUB R15,R16 ;否则去掉逼近增量
LSR R16 ;逼近增量折半
BRNE CMPLP ;逼近增量变为0?
MOV R16,R15 ;*是,转换结束
LSR R15 ;*
ADC R15,R16 ;*将转换结果乘以1.5
HH50: RJMP HH50 ;背景程序略
范例55 ;40点平均在r18r19,累加和在r5r6r7;20点平均在R14R15,累加和在R1R3R4 SLPA V: PUSH R26 ;采样在R8R9,采样数据存储区$150--$19F/工作寄存器r1--r19&r26 r27
PUSH R27
LDI R27,1
LDS R26,$14F ;数据存储区首地址$14F
ADD R7,R9
ADC R6,R8 ;采样加入40点平均累加和
BRCC SLP1
INC R5 ;有进位,高位字节增1
ADC R3,R8 ;采样加入20点平均累加和
BRCC SLP2
INC R1 ;有进位,高位字节增1
SLP2: LD R16,X
ST X+,R9
MOV R9,R16 ;置换出最旧采样低位字节
LD R16,X
ST X+,R8
MOV R8,R16 ;置换出最旧采样高位字节
CPI R26,$A0
BRNE SLPA1
LDI R26,$50 ;采样放满存储区后,指针初始化($1A0=$150)
STS $14F,R26
LDS R16,$A4
SBRC R16,4
RJMP SLPA2 ;40点平均时间达到,转
SBR R16,$10 ;设置40点平均时间达到标志
STS $A4,R16
RJMP SLDIV ;转去计算40点平均
SLPA1: STS $14F,R26 ;暂存指针
LDS R16,$A4
SBRS R16,4
RJMP SLPB0 ;还未到40点平均,转
SLPA2: SUB R7,R9
SBC R6,R8 ;到40点平均后除加上新采样外,还要减去最旧采样BRCC SLDIV
DEC R5 ;不够减,高位字节减1
SLDIV: CLR R12
LDI R16,40
MOV R11,R16
CLR R10
MOV R13,R5
MOV R14,R6
MOV R15,R7
RCALL DIV165 ;计算40点平均
MOV R18,R14
MOV R19,R15 ;存入r18r19
SLPB0: CPI R26,$78
BRNE SLPB1
LDS R16,$A4
SBRC R16,3
RJMP SLPB2
SBR R16,8 ;建20点平均时间到标志
RJMP SLPDV ;
SLPB1: LDS R16,$A4
SBRS R16,3
RJMP SLRET ;20点平均时间未到
SLPB2: SUBI R26,42 ;指针退回42字节,指向20点平均最旧数据CPI R26,$50 ;不小于80,未超出采样数据存储区
BRCC SLPB20
SUBI R26,-80 ;否则加80调整回$150-$19F
SLPB20: LD R11,X+ ;
LD R10,X
SUB R4,R11
SBC R3,R10 ;找到20点平均最旧采样,并将其从累加和中减去!
BRCC SLPDV
DEC R1
SLPDV: LDI R16,20
MOV R11,R16
CLR R10
CLR R12
MOV R13,R1
MOV R14,R3
MOV R15,R4
RCALL DIV165 ;20点平均在r14r15中
SLRET: POP R27
POP R26
RET