6.4 接口芯片综合演练


6.4 接口芯片综合演练

本节摘要:把 8255、8253、8259 三颗芯片焊成一台"可调频率流水灯"——从需求拆解、地址分配、初始化代码到调试记录的完整工程档案,这是前五节所有知识点的合龙验收。

前面各站都在单点训练,本站做合龙。项目虽小,五脏俱全:中断驱动的定时节拍、方式字驱动的并行输出、译码电路分配的门牌——一块控制板该有的关节一个不缺。跟着这份档案走一遍,接口开发的完整手感就有了。

把三颗芯片焊成一台机器

需求。 八只 LED 按顺序流动点亮;流动速度可由一个输入开关在两档间切换;主循环保持空闲,随时能响应新的键盘命令。逐条翻译成技术决策:定时节拍由 8253 方式 3 方波产生;节拍沿触发 8259 的一级中断,服务程序里只做"移一格灯";速度档位由 8255 的口 B 读入,改变档位时重装 8253 初值。

图 6-3:流水灯控制板的系统接线与信号流

图 6-3:流水灯控制板的系统接线与信号流

地址分配。 延续 6.1 节的译码设计:8255 占 360H 到 363H(口 A、口 B、口 C、控制口),8253 占 364H 到 367H(三通道加控制口)。两片同挂一片 138 的两个输出上,地址连续、电路省一截——这就是"先画地址地图再动焊台"的回报。

初始化。 上电后按依赖次序写:先 8255 定方向,再 8259 登记类型码与屏蔽,最后 8253 装初值开跑:

INIT: MOV AL, 89H ; 8255 方式字:A 口输出 B 口输入 C 口输出 MOV DX, 363H OUT DX, AL MOV AL, 0FEH ; 8259 只开第0级,本例用第2级可改为 FBH MOV DX, 021H OUT DX, AL MOV AL, 36H ; 8253 通道0 先低后高 方式3 MOV DX, 367H OUT DX, AL MOV AL, 4AH ; 快档初值低字节:对应约100Hz MOV DX, 364H OUT DX, AL MOV AL, 00H OUT DX, AL STI ; 万事俱备,开中断

中断服务程序。 严格贯彻 5.2 节纪律:保现场、读档位、档变则重装初值、移灯、发结束命令、恢复现场:

TIMER_ISR: PUSH AX PUSH DX PUSHF ; 保险起见连标志一起保 MOV DX, 361H IN AL, DX ; 读档位开关 TEST AL, 01H JZ FAST_MODE CALL RELOAD_SLOW ; 慢档:重装较大初值 JMP SHIFT_LED FAST_MODE: CALL RELOAD_FAST SHIFT_LED: MOV AL, LED_STATE ROL AL, 1 ; 循环左移一格 MOV LED_STATE, AL MOV DX, 360H OUT DX, AL ; 点亮新的那格 MOV AL, 62H ; 结束命令:发往 8259,对应第2级 MOV DX, 020H OUT DX, AL POPF POP DX POP AX IRET

调试记录。 首次上电,灯以恒定快档流动,拨动档位开关毫无反应。按 5.4 的证据链排查:示波器确认 8253 输出方波正常、8259 申请脉冲每档位变化后仍在发出;冻结现场读服务程序内的档位值,发现无论开关拨向哪里,读回的都是同一值——问题在口 B 的译码使能条件写松了一位,361H 与 365H 同时命中,读口 B 时实际混入了 8253 数据口的总线浮空电平。收紧译码使能后,档位切换立即生效。这份记录的教训写进 6.1 的口诀:逐地址扫描验证译码,多一拍片选都是bug。

解读与变式。 本项目的所有行为都可追溯到前五节的某个知识点:方波来自 8253 的除法数学,中断纪律来自 5.2,译码设防来自 6.1,档位判定的 TEST 指令与 2.1 的标志位视角一脉相承。变式一:把 LED 换成步进电机的相线,ROL 改为按相序表查表,同一骨架即成电机控制器;变式二:把档位开关换成串口命令,系统自然长出远程配置能力——接口系统的生长,靠的是在既有信号链上插新节点,而不是推倒重来。

上电自检:让板子自证清白

调试记录之外,产品还需要一段常驻的上电自检,让每块出厂的板子自证清白。思路是把本项目的每个芯片都"考一题":

SELF_TEST: ; 考 8255:方式字写入后回读口B上拉电平 MOV AL, 82H MOV DX, 363H OUT DX, AL MOV DX, 361H IN AL, DX ; 开关全开时应读到 0FFH CMP AL, 0FFH JNE FAIL ; 考 8253:装初值 2,输出应翻转为可测频率 MOV AL, 36H MOV DX, 367H OUT DX, AL MOV AX, 2 MOV DX, 364H OUT DX, AL MOV AL, AH OUT DX, AL ; 考 8259:读在服务寄存器,初始应为全零 MOV AL, 0BH MOV DX, 020H OUT DX, AL IN AL, DX TEST AL, AL JNZ FAIL JMP INIT ; 全部过关,进入主初始化 FAIL: MOV AL, 0AAH ; 约定的故障码:八灯呈跳棋图案 MOV DX, 360H OUT DX, AL HLT ; 停机等人工检修

自检的三条设计原则:每题只考一个芯片、预期值必须是确定值、失败表现必须人眼可辨。这段代码在量产线上每年都能拦下几块虚焊的板子——它换来的底气远超它的二十几条指令。

高频追问两则

问:为什么不把自检塞在主程序里跑? 自检必须发生在任何外设被"正式使用"之前,且失败时系统状态必须可控。混进主程序则失败点难以定位、表现难以约定——独立的自检段是产品与作品的分水岭之一。

问:中断没开,自检里 8259 的在服务寄存器读得出值吗? 读得出。读寄存器是普通端口操作,与中断是否被响应无关;初始状态在服务寄存器全零,有服务未销号才置位——正好用作"上一轮是否干净"的证据。这类寄存器级的小侦探,调试大系统时处处能立功。

本节要点回顾

  • 合龙的次序:先地址地图,再初始化依赖链,最后服务程序上线。
  • 服务程序五步走:保现场、读输入、调参数、发结束、恢复现场。
  • 调试沿证据链:信号、时序、现场,与 5.4 的方法论完全同构。
  • 系统可生长:换外设、加命令,都只是信号链上的增量改造。

下一章把这块小板的视野放大到真实世界:键盘、显示、传感器与人机交互的接口设计。


作者与出处
原作者: 灏天文库
来源:灏天文库
整理: 灏天文库整理
由灏天文库平台收录,内容或由平台用户上传,仅供学习交流
发布者: 作者: 灏天文库 转发
评论区 (0)
U