打印

微机新手求教关于I2C总线以及2402的问题,程序调试!

[复制链接]
1716|3
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
sulla|  楼主 | 2011-9-9 15:53 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我是一个微机新手。用8255的两个管脚分别接2402的SDA 和 SCL 模拟I2C总线向2402输入一页数据再读出来,用8253给出精确定时。但是在调试程序的时候出现了一个情况,就是写入8位数据之后接收不到应答。另外,我用8255的两个管脚分别接两个LED灯上面,分别表示是否接受到应答,调试程序的时候发现系统接收不到应答之后8255也没有控制相应的LED灯亮!!!8255没有问题的。
请问各位高手 知道这是怎么回事吗?这搞得我都不知道怎么调试,拳打**的感觉!!!
以下是我的程序,烦请路过的高手看下,不胜感激!!!
其中 8255的PB0接SDA PC0接SCL PA0~3接LED 是用来显示读出来的数据的。PA7接8253的OUT  PC7和PC6分别接两个LED用来显示是否接到应答


ioport
equ 0d400h-0280h

io8255
equ ioport+28bh
;8255控制寄存器地址

io8255a
equ ioport+288h
;A口地址

io8255b
equ ioport+289h
;B口地址

io8255c
equ ioport+28ah
;C口地址

io8253               equ ioport+283h     ;8253控制寄存器地址
io82530               equ ioport+280h    ;通道0地址
data segment
list db 01h,02h,03h,04h,05h,06h,07h,08h;
count db ?
data ends
stacks segment stack
db 100 dup(?)
stacks ends


code   segment

  assume cs:code,ds:data,ss:stacks

start:   
  mov ax,stacks
  mov ss,ax
  mov ax,data
  mov ds,ax
  
  mov dx,io8255
  mov al,90h
  out dx,al
  call init
  call delay1
sendadrwrite:  
         mov bl,0A0h
;发送器件地址


  mov al,bl
;bl中存放现有要发送的数据(器件地址和片内写地址),原数据始终在BH中


  call senddata

         call testack;检测应 答信号

  call delay


  mov
bl,00h
;发送存储地址


  mov al,bl


  call senddata

         call testack;检测应答信号

  call delay

    mov bx,00h
A:  mov al,list[bx]
    mov dx,io8255a
    in al,dx
    mov bl,al
    inc bx
    call senddata
    call testack
    cmp bx,7   
    jc A
      
  call stop

         call delay10
         mov dx,io8255
         mov al,90h
         out dx,al         
         call init
         call delay1
         mov bh,08h
sendadread: mov bl,0A0h
;发送器件地址


  mov al,bl


  call senddata


  call testack
;检测应答信号


  call delay


  mov
bl,00h
;发送存储单元地址


  mov al,bl


  call senddata


  call testack
;检测应答信号


  call delay


  mov bl,0A1h


  mov al,bl


  call senddata


  call testack
;检测应答信号  


  call delay


  mov cl,07h


  mov ch,08h

readdata: mov bl,00h

  mov dx,io8255            ;设8255为A、C口输出,B口输入,B口接SDA


  mov al,82h


  out dx,al


  mov al,00h  


  mov dx,io8255c


  out dx,al
;PC0接SCL,将SCL置0


  call delay


  mov al,01h  


  mov dx,io8255c


  out dx,al
;PC0接SCL,将SCL置1


  call delay


  mov dx,io8255b


  in al,dx
;读入PB0上的数据存入到BL中


  shl al,07h
;左移CL位


  or bl,al


  call delay


  mov al,00h  


  mov dx,io8255c


  out dx,al
;PC0接SCL,将SCL置0


  dec ch


  jnz readdata


  dec cl

         call testack
disLED:  
         mov dx,io8255              ;A输出   BC输入
         mov al,8Bh
         out dx,al
         mov al,bl
;显示LED指示灯


  mov dx,io8255a


  out dx,al



         dec bh
         jnz sendadread
stopread:
  

         mov dx,io8255            ;设8255为A、B、C输出

  mov al,80h


  out dx,al
  


  mov al,00h
;直接给停止信号


  mov dx,io8255b


  out dx,al


  mov al,01h


  mov dx,io8255c


  out dx,al


  call delay


  mov al,01h


  mov dx,io8255b


  out dx,al


  call delay

exit:
  mov ah,4ch

         int 21h




senddata proc
near

           push cx
            mov dx,io8255            ;设8255为A输入   B、C输出

  mov al,90h


  out dx,al
  

           mov cl,08h
senddata1: mov dx,io8255c
     
  mov al,00h


  out dx,al
;置SCL为0


  call delay


  mov al,bl
;bl中存放当前传输的数


  mov dx,io8255b


  out dx,al
;将AL中最低位数据通过PB0输出给SDA


  call delay


  mov al,01h


  mov dx,io8255c


  out dx,al
;PC0接SCL,将SCL置1,此时SDA数据有效


  call delay


  mov al,00h


  out dx,al
;PC0接SCL,将SCL置0,此时可更改SDA


  call delay

next:
  shr bl,1
;将BL中的数据右移一位,高位添0


  dec cl
;已经传送了一位


  jnz senddata1
;若未发送完则继续发送


  call delay


  


                           


  pop cx

         ret
senddata endp

  

init proc near                                                               

  mov al,01h


  mov dx,io8255b


  out dx,al             ;PB0接SDA,将SDA置1


  call delay

         mov dx,io8255c

  out dx,al
;PC0接SCL,将SCL置1


  call delay


  mov al,00h


  mov dx,io8255b


  out dx,al
;PB0接SDA,将SDA清0,开始信号


  call delay
  


  mov dx,io8255c


  out dx,al
;PC0接SCL,将SCL清0

         ret
init endp


stop proc near      

  mov al,00h


  mov dx,io8255b


  out dx,al

         call delay

  mov al,01h


  mov dx,io8255c


  out dx,al


  call delay


  mov al,01h


  mov dx,io8255b


  out dx,al


  call delay


  ret

stop endp

相关帖子

沙发
sulla|  楼主 | 2011-9-9 15:54 | 只看该作者
delay          proc        near                   ;延迟子程序
          push        cx
         push dx
          
delay5us: mov dx,io8253
         mov        al,10h
        mov dx,io82530
        mov al,05h
        in al,dx
testout5us:  mov dx,io8255a                 ;8255a口输入 OUT端输入PA7
        in al,dx
        rcl al,1                        ;al 循环左移一位,以检测CF是否为1
        jnc testout5us
        pop dx
        pop cx
        ret
delay          endp          


delay1  proc near             ;1ms延时子程序
         push        cx
         push dx

delay1ms: mov dx,io8253
         mov        al,30h             ;选择先低后高写入
        mov dx,io82530
        mov ax,3E8h               ;一毫秒要计数1000,0000 0011 1110 1000
        in ax,dx
        
testout1ms:  mov dx,io8255a                 ;8255a口输入 OUT端输入PA7
        in al,dx
        rcl al,1                        ;al 循环左移一位,以检测CF是否为1
        jnc testout1ms
        pop dx
        pop cx
         ret
delay1 endp

delay10  proc near           ;10ms延时子程序
         push        cx
         push dx
         
delay10ms: mov dx,io8253
         mov        al,30h             ;选择先低后高写入
        mov dx,io82530
        mov ax,2710h               ;10毫秒要计数10000
        in ax,dx
        
testout10ms:  mov dx,io8255a                 ;8255a口输入 OUT端输入PA7
        in al,dx
        rcl al,1                        ;al 循环左移一位,以检测CF是否为1
        jnc testout10ms
        pop dx
        pop cx
         ret
delay10 endp

testack  proc near
          push cx
         mov cx,0ffh
         mov al,00h
          mov dx,io8255c
          out dx,al                        ;PC0接SCL,将SCL置0
         nop
          mov al,01h
          mov dx,io8255b
          out dx,al                        ;PB0接SDA,将SDA置1
          nop
          mov al,01h
          mov dx,io8255c
          out dx,al                        ;PC0接SCL,将SCL置1
          call delay
read:          mov al,92h                        ;读入SDA状态,若是零则表明写成功
          mov dx,io8255
          out dx,al
          mov dx,io8255b
          in  al,dx
          mov bl,al
          mov dx,io8255c
          mov al,00h
          out dx,al
          mov al,bl
          and al,01h
          jz  change
          dec cx
          jcxz error
          jmp  read
error:   mov dx,io8255c                ;此时用LED8显示未接收到响应信号
          mov al,80h
          out dx,al
          jmp exit                        ;结束
change:  mov dx,io8255            ;设8255为A口输入,B、C输出
          mov al,90h
          out dx,al
          mov dx,io8255c
          mov al,40h
          out dx,al                        ;此时用LED7表明接收到响应信号
          pop cx
         ret
testack  endp
code   ends
end start

使用特权

评论回复
板凳
china_sn0w| | 2011-9-15 00:18 | 只看该作者
汇编啊……完全不懂&……:L

使用特权

评论回复
地板
airwill| | 2011-9-16 13:31 | 只看该作者
看样子这是在 DOS 下的程序。不知道你的是什么微机,怎么找到这些引脚的。
你的资源配置有没有跟系统板的配置冲突呢?
8253 的定时器已经被系统用了两个。另外,有没有考虑软件中断(不如定时中断)因为打断 24cxx 的时序而导致读写的错误。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

0

主题

2

帖子

0

粉丝