求救:模拟串口接收一个pc的 数据会后面多个数据 用一个外部中断判断起始位 软件延时
;系统时钟是4.0MHZ,波特率为19200pbs,每位数据的传送时间为208个周期.include"m16def.inc"
.def tmp=r16
.def bitcnt=r17
.def buffer=r20
.def status=r18
.def count=r19
.def count1=r21
.equ BUSY=7
.org $0000
jmp reset
jmp extinct
reti
nop
reti
nop
reti
nop
reti
nop
reti
nop
reti
nop
reti
nop
reti
nop
reti
nop
reti
nop
reti
nop
reti
nop
reti
nop
reti
nop
reti
nop
reti
nop
reti
nop
reti
nop
reti
nop
.org $002A
reset:
ldi tmp,high(ramend);
out sph,tmp
ldi tmp,low(ramend)
out spl,tmp
ldi tmp,0xFB
out DDRD,tmp;D口PD2为输入,其余口为输出
ser tmp
out portd,tmp
ldi tmp,0<<PUD;PUD置0使上拉电阻有效
out sfior,tmp
ldi status,0
rcall init;调用初始化函数
sei ;开放中断
main:
cpi status,1
brne main
clr status
rcall receive接受子程序
rcall txm发送起始位
rcall Transmit 发送8位数据和停止位
rjmp main
;初始化
init: ldi tmp,0x02
out MCUCR,tmp ;下降沿触发中断
ldi tmp,1<<INT0
out GICR,tmp ;INT0中断允许位为1
ldi tmp,0x40
out GIFR,tmp
clr status
ret
;接受子程序
receive:
ldi count,74;延时296个周期
loop1: dec count
cpi count,0
brne loop1
nop
nop
t:
sec ;1T
sbis PIND,2 ;2T
clc ;1T
ror buffer;1T
inc bitcnt;1T
cpi bitcnt,8
breq t1
ldi count,49;延时196个周期
loop3:
dec count
cpi count,0
brne loop3
nop
nop
cpi bitcnt,9
brne t
t1:
ldi count,73;延时304个周期
loop4: dec count
cpi count,0
brne loop4
nop
ldi tmp,1<<INT0
out GICR,tmp;开外部中断
ret
;发送起始位
txm:
ser bitcnt
cbi portd,PD4
ret
;发送8位数据和停止位
Transmit:
t3: ldi count,48;延时192个周期
loop5: dec count
cpi count,0
brne loop5
inc bitcnt
sbrc bitcnt,3
rjmp stopb
sbrc buffer,0
sbi portd,PD4
sbrs buffer,0
cbi portd,PD4
lsr buffer;待发送数据位右移一位
loop2: inc count
cpi count,2
brne loop2
rjmp t3
stopb: nop
nop
nop
sbi portd,PD4
sbrs bitcnt,0
rjmp t3
nop
nop
nop
nop
ret
;外部中断程序
extinct:
in r15,SREG
push r15
ldi status,1
clr bitcnt ;位计数器清零
out GICR,bitcnt;关外部中断
exit:
pop r15
out SREG,r15
reti
求救:模拟串口后面会多个数据 FF 导致不可以发送N个数据 查了好久得不到解决 希望老师指点一下
图:
点击此处打开ourdev_178132.jpg(文件大小:455K,只有300K以内的图片才能直接显示)
点击此处打开ourdev_178133.jpg(文件大小:550K,只有300K以内的图片才能直接显示) 建议先买本我的新书,把RS232打通,确认硬件上没问题了,再回过头来学习汇编吧。 你的书是肯定买的 板子是在这里买的 应该没问题的 汇编从你的第四章编到十一章了 可是后面的 就等你的书出来了 "汇编从你的第四章编到十一章了",不理解。
是你将第四章编到十一章了的代码都用AVR汇编重新写过了?那你就比我厉害多了。 建议进入外部中断时消抖一下试试. 问题不在于消抖.
LZ在做模拟串口的工作,使用汇编.这不是一个初学人员能做的事.需要一定的能力,也不是几句话就讲清楚的.
建议LZ找以下PIC的书或资料,记得PIC有用I/O模拟串口的介绍,先把方法掌握,正确的方法很重要.另外,先模拟频率低一些,如2400,4800.成功后再考虑19200.
越高难度越大,当然AVR肯定可以(USB都模拟出来了).
作为锻炼学习,这到是非常好的题目. 谢谢马老师 上面程序没有问题,可能是采用内部时钟不稳定, 改熔丝位将将其改为外部的就可以了 ,问题已经解决了, 但是到底什么原因还不肯定
页:
[1]