先决条件– 8254可编程间隔计时器
上电后,8254的状态不确定。未定义所有计数器的模式,计数值和输出。在编程时确定每个计数器的工作方式。必须对每个计数器进行编程,然后才能使用它。未使用的计数器无需编程。通过写一个控制字,然后写一个初始计数来对计数器进行编程。
控制字8254 –
8254的控制字格式为:
在这里,通过使用SC1和SC0的值,我们选择了一个特定的计数器:
SC1 | SC0 | SELECTION |
---|---|---|
0 | 0 | C0 |
0 | 1 | C1 |
1 | 0 | C2 |
1 | 1 | Read back status |
RW1和RW0的值用于确定读–写操作:
RW1 | RW0 | SELECTION |
---|---|---|
0 | 0 | Counter Latch Command |
0 | 1 | Read/Write lower byte |
1 | 0 | Read/Write higher byte |
1 | 1 | Read/Write lower byte followed by higher byte |
M2,M1,M0的值用于确定8254的工作模式:
M2 | M1 | M0 | OPERATING MODE |
---|---|---|---|
0 | 0 | 0 | MODE 0 |
0 | 0 | 1 | MODE 1 |
X (0/1) | 1 | 0 | MODE 2 |
X (0/1) | 1 | 1 | MODE 3 |
1 | 0 | 0 | MODE 4 |
1 | 0 | 1 | MODE 5 |
控制字的LSB用于选择计数器是二进制还是BCD。如果该位为0,则用作二进制计数器;如果其值为1,则用作BCD库。
8254的操作模式:
- 模式0(终端计数中断)–模式0通常用于事件计数。写入控制字后,OUT最初为低电平,并将一直保持低电平,直到计数器达到零为止,然后在每个时钟周期后将其递减1。然后OUT变为高电平并保持高电平,直到将新的计数或新的模式0控制字写入计数器为止。 GATE = 1启用计数,GATE = 0禁用计数。
- 模式1(硬件可一次触发)– OUT最初为高电平。在触发开始单触发脉冲后,OUT将在CLK脉冲上变为低电平,并且将保持低电平直到计数器达到零为止。
- 模式2(速率发生器)–最初的OUT值很低。启用计数后,它会变高,并且此过程会定期重复。计数值=输入频率/输出频率。此模式用作分频器。
- 模式3(方波发生器)–当GATE = 1时启用计数,而当GATE = 0时禁用计数。此模式用于生成方波,并生成时间段(等于计数)。
如果N是计数并且是偶数,则波的开启时间= N / 2,关闭时间= N / 2
如果N为奇数,则导通时间=(N + 1)/ 2,关闭时间=(N – 1)/ 2 - 模式4(软件触发的选通)–在此模式下,通过使用GATE = 1启用计数,并通过GATE = 0禁用计数。最初,OUT的值较高,而当计数值处于最后阶段时,其值为低电平。计数将重新加载,以供随后的时钟脉冲使用。
- 模式5(硬件触发的选通)– OUT最初将为高电平。计数由GATE的上升沿触发。当初始计数到期时,OUT将在一个时钟脉冲后变为低电平,然后再次变为高电平。写入控制字和初始计数后,直到触发后的时钟脉冲才加载计数器。