• 接口技术-8253芯片实验


    8253芯片实验

    写在前面:

    之前做过一个8255的实验,但是对汇编语言真心摸不着头脑,基础没打好,打代码都痛苦N倍!

    实验内容:

    通过8253芯片通道0和通道2级连,clk0输入时钟信号100khz,使out2每隔1s,通过不可屏蔽引脚NMI产生中断,依次轮流点亮8盏LED灯。

    在公布实验代码前,请允许我卑微的介绍本次实验必不可少的基础知识!
    1、计数器的3个引脚 

    •   CLK时钟输入信号

    • 在计数过程中,此引脚上每输入一个时钟信号(下降沿),计数器的计数值减1

    • GATE门控输入信号

    • 控制计数器工作,可分成电平控制和上升沿控制两种类型

    • OUT计数器输出信号

    • 当一次计数过程结束(计数值减为0),OUT引脚上将产生一个输出信号

    2、确定计数初始值:

    $f_{clk0}$=100khz;因此$T_{clk0}$=$frac{1}{f_{clk0}}$=$frac{1}{100khz}$=$10^{-5}$

    其中,有这个公式$T_{out}=T_{clk}*N$,因此我们观察一下8253

      

    从图可知,Tout0=Tclk2,因此

    $T_{out2}=T_{clk2}*N_{2}=T_{out0}*N_{2}=T_{clk0}*N_{0}*N_{2}=1s$,

    $N_{0}*N_{2}=10^{5}$,在满足等式成立情况下,给N0,N2任意取值皆可。

     

    3、8253的其中2种工作方式:当计数器的计数初值已经确定时,计数器就开始工作

      • 方式0:当计数初值为4时,在做了4个$T_{clk}$时,它就结束了任务,并产生中断。

      • 方式3:初始化计数初值为4后,就一直工作下去。

     

    4、地址

      • 74HC154的地址

    Y0=IO0,Y1=IO1,Y2=IO2;

    结合上表,可知IO2的信号是DCBA=0010,从而得出$A_{12}A_{11}A_{10}A_{9}$=0010;

      • 8253的地址

    我们观察上面的8253的图,可以知道地址线$A_{1}A_{2}$分别接在8253的$A_{0}A_{1}$

    我们从下图可以得知,当$A_{0}A_{1}$=00时,为读写计数器0;当$A_{0}A_{1}$=10时为读写计数器2;

    从而推出对应的$A_{1}A_{2}$的值。

    具体如下:

    计数器0地址:$A_{2}A_{1}$=00;

    计数器1地址:$A_{2}A_{1}$=01;

    计数器2地址:$A_{2}A_{1}$=10;

    控制字地址:$A_{2}A_{1}$=11;

    因此我们可以得出20位8253的地址,我们设置其他地址线为0,则

    计数器0端口地址:$A_{2}A_{1}$=0000 0000 0100 0000 0000B=400H

    计数器1端口地址:$A_{2}A_{1}$=0000 0000 0100 0000 0010B=402H

    计数器2端口地址:$A_{2}A_{1}$=0000 0000 0100 0000 0100B=404H

    控制端口地址:$A_{2}A_{1}$=0000 0000 0100 0000 0110B=406H

      • 灯的地址

    观察以上74HC273的电路图,我们可以发现,IO1和A0接入或非门,查询上表,可得IO1=0001,即$A_{12}A_{11}A_{10}A_{9}$=0001;

    或非门只有当输入全为0时才为1,所以取地址线$A_{0}$=0,同样的,设置其他地址为0,则灯的地址为0000 0000 0010 0000 0000B=200H

    代码如下:

     1 DATA SEGMENT
     2     ;灯的地址及初始状态
     3     LIGHT_ADD EQU 200H;灯的地址
     4     LIGHT_STATUS DB 11111110B;  有8个灯,0开1关,通过循环左移ROL实现灯状态变化
     5      ;8253的地址
     6     PORT0 EQU 400H;  计数器0端口地址
     7     PORT2 EQU 404H;  计数器2端口地址
     8     PORT3 EQU 406H;   控制端口地址
     9     
    10     ;控制方式字
    11     CONTROL0 EQU 00010110B;计数器0 只读写低字节,方式3,二进制
    12     CONTROL2 EQU 10110000B;计数器2 先读写低字节后读写高字节,方式0,二进制
    13 DATA ENDS
    14 
    15 CODE SEGMENT
    16     ASSUME CS:CODE,DS:DATA
    17 BEGIN:
    18     MOV AX,DATA
    19     MOV DS,AX 
    20     
    21 ;设置2号中断向量
    22 NMI_INIT:
    23     PUSH ES
    24     XOR AX,AX
    25     MOV AL,02H
    26     XOR AH,AH
    27     SHL AX,1
    28     SHL AX,1
    29     MOV SI,AX
    30     MOV AX,OFFSET NMI_SERVICE
    31     MOV ES:[SI],AX
    32     INC SI
    33     INC SI
    34     MOV BX,CS
    35     MOV ES:[SI],BX
    36     POP ES
    37     
    38     
    39     ; 8253通道0初始化
    40     ; 写入方式控制字
    41     MOV DX,PORT3
    42     MOV AL,CONTROL0
    43     OUT DX,AL
    44     ; 计数器0写入计数初值
    45     MOV DX,PORT0
    46     MOV AL,11001000B; 设定N0=200
    47     OUT DX,AL
    48     
    49     ; 8253通道2初始化
    50     ;  写入方式控制字
    51     MOV DX,PORT3
    52     MOV AL,CONTROL2
    53     OUT DX,AL
    54     ;  计数器2写入计数初值
    55     MOV DX,PORT2
    56     MOV AX,0000000111110100B; 设定N2=500
    57     OUT DX,AL; 写入低字节计数初值
    58     MOV AL,AH; 将高字节的数值赋值给低字节
    59     OUT DX,AL; 写入高字节计数初值
    60     
    61     ;点亮第一个LED灯   
    62     MOV DX,LIGHT_ADD
    63     MOV AL,LIGHT_STATUS
    64     OUT DX,AL
    65     
    66     ;等待中断
    67     JMP $
    68     
    69     ; 程序退出
    70     MOV AH,4CH
    71     INT 21H
    72              
    73      ;中断服务程序        
    74 NMI_SERVICE PROC FAR
    75     ;点亮下一个LED
    76     MOV DX,LIGHT_ADD
    77     MOV AL,LIGHT_STATUS
    78     ROL AL,1; 循环左移
    79     OUT DX,AL
    80     MOV LIGHT_STATUS,AL; 更新LIGHT_STATUS的值
    81     
    82     ;  通道2送计数初值,再次启动计数
    83     ;  8253通道2初始化
    84     ;  写入方式控制字
    85     MOV DX,PORT3
    86     MOV AL,CONTROL2
    87     OUT DX,AL
    88     
    89     MOV DX,PORT2
    90     MOV AX,0000000111110100B; 
    91     OUT DX,AL;  写入低字节计数初值
    92     MOV AL,AH;
    93     OUT DX,AL;   写入高字节计数初值
    94     
    95     IRET; 中断返回
    96     NMI_SERVICE ENDP
    97 
    98 CODE ENDS
    99 END BEGIN

     参考链接:https://www.cnblogs.com/wstong/p/12890547.html

  • 相关阅读:
    深入理解 Embedding层的本质
    tf.nn.embedding_lookup()的用法
    深度学习原理与框架-CNN在文本分类的应用 1.tf.nn.embedding_lookup(根据索引数据从数据中取出数据) 2.saver.restore(加载sess参数)
    通俗理解tf.name_scope()、tf.variable_scope()
    TENSORFLOW变量作用域(VARIABLE SCOPE)
    Tensorflow函数——tf.variable_scope()
    tf.variable_scope 参数
    何查看Tomcat版本信息
    XCode4中的文本查找和文本替换功能
    引入第三方库错误Undefined symbols for architecture i386: _OBJC_CLASS_$的解决方案
  • 原文地址:https://www.cnblogs.com/acmer-hmin/p/12900420.html
Copyright © 2020-2023  润新知