txbhcml 发表于 2007-10-24 17:53:39

求救:模拟串口接收一个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以内的图片才能直接显示)

machao 发表于 2007-10-24 18:38:43

建议先买本我的新书,把RS232打通,确认硬件上没问题了,再回过头来学习汇编吧。

txbhcml 发表于 2007-10-25 09:40:06

你的书是肯定买的   板子是在这里买的 应该没问题的 汇编从你的第四章编到十一章了 可是后面的 就等你的书出来了

machao 发表于 2007-10-25 19:36:10

"汇编从你的第四章编到十一章了",不理解。

是你将第四章编到十一章了的代码都用AVR汇编重新写过了?那你就比我厉害多了。

WF1120034357 发表于 2007-11-26 16:08:57

建议进入外部中断时消抖一下试试.

machao 发表于 2007-11-26 17:45:02

问题不在于消抖.

LZ在做模拟串口的工作,使用汇编.这不是一个初学人员能做的事.需要一定的能力,也不是几句话就讲清楚的.

建议LZ找以下PIC的书或资料,记得PIC有用I/O模拟串口的介绍,先把方法掌握,正确的方法很重要.另外,先模拟频率低一些,如2400,4800.成功后再考虑19200.

越高难度越大,当然AVR肯定可以(USB都模拟出来了).

作为锻炼学习,这到是非常好的题目.

txbhcml 发表于 2007-11-27 09:21:31

谢谢马老师 上面程序没有问题,可能是采用内部时钟不稳定, 改熔丝位将将其改为外部的就可以了 ,问题已经解决了, 但是到底什么原因还不肯定
页: [1]
查看完整版本: 求救:模拟串口接收一个pc的 数据会后面多个数据 用一个外部中断判断起始位 软件延时