Assembly 6502微控制器使用中断的基本编程
我试图掌握在6502微控制器上使用中断作为计时动作方式的诀窍。我已经设法创建了一个计数器,通过触发中断来更快地添加位:Assembly 6502微控制器使用中断的基本编程,assembly,microcontroller,6502,Assembly,Microcontroller,6502,我试图掌握在6502微控制器上使用中断作为计时动作方式的诀窍。我已经设法创建了一个计数器,通过触发中断来更快地添加位: %uasm65 ; v.002 ; Increment port 0A200h at a rate of once increment ; per second. Use the timer based interrupt handler ; to control the time delay. T1LL: equ B006h T1LH: equ B007h IER:
%uasm65
; v.002
; Increment port 0A200h at a rate of once increment
; per second. Use the timer based interrupt handler
; to control the time delay.
T1LL: equ B006h
T1LH: equ B007h
IER: equ B00Eh
ACR: equ B00Bh
COUNTDOWN: equ 500d
IRQVect: equ 0002d
OutChar: equ 0e003h
PrntMess: equ 0e00ch
org 0200h
lda #0d
sta IER ; Disable all interrupts.
lda #11000000b
sta ACR ; Set to T1 free running mode;
lda #COUNTDOWN<
sta T1LL ; Low byte of latch.
lda #COUNTDOWN>
sta T1LH ; High byte of latch.
; Initialize the interrupt vector.
lda #InterruptHandler<
sta IRQVect
lda #InterruptHandler>
sta IRQVect+1d
lda #01000000b
sta IER ; Enable all interrupts
cli ; Enable interrupts
MainLoop:
nop
jmp MainLoop
InterruptHandler:
;Save registers on the stack.
php
pha
txa
pha
tya
pha
inc 0a200h
;Restore registers from the stack.
pla
tay
pla
tax
pla
plp
cli ; Enable interrupts.
rti ; Return from interrupt.
end
%/uasm65
或者我需要通过中断来计时的东西?任何指导都会有帮助。如果6502以1MHz的频率运行,这意味着它在1秒内执行1000000个循环。一条指令可以执行的最小周期数为2,最大周期数为8(实际最大周期数为7,但如果地址跨越一个页面(例如22FF-2300),则某些指令具有惩罚周期) 所以,如果你不想依赖计时器来等待,你可以想出任何创造性的方法来消耗一百万个周期。显然,您将依赖循环。任何好的6502指令参考都将为您提供每个指令的周期计时 如果你控制工厂设备,没有控制任何中断源(包括NMI和复位)的延迟循环是不可能的。但是你在这里很好 因此,你的做法是正确的,但不是在正确的地点 我假设主循环每秒打印一次“Hello”,ISR会打印“There”,所以您不想将延迟循环放入ISR。“延迟”和“中断服务例行程序”这两个词通常不会同时出现 你可能也不想让它像打印一样 因此,您需要构造ISR,以便只设置一个标志,然后主循环将检查该标志。您的主循环可以检查每个循环是否有此标志,并在打印“Hello”(如果已设置)后打印“There”。显然,它应该会清除旗帜
如果您希望它在触发IRQ时作出响应,您可能需要检查延迟循环中的标志,如果设置了标志,则终止循环。如果您这样做,您还必须实现去抖动-您需要一段时间来忽略该标志,或者需要一些编程来仅在检测到按钮按下然后释放时设置该标志-除非您不介意该单元滥发“Hello here”不断按下按钮。我使用的6502没有板载计时器或端口,您必须使用外围IC,如内存映射6522 VIA。如果您正在使用计时器,则必须通过读取来清除IRQ请求。使用软件环路进行延时是一项学生实验练习,它只会浪费宝贵的处理器时间。我正在使用一个控制LED的小型控制器。更有用的是:你能说出有问题的电路板吗?它提供了什么中断?如果是多个中断,您如何区分它们?您可能会设置一个计时器,使其每秒发生一次,并通过检查状态寄存器将其与按钮或其他操作区分开来,或者使用一个固定频率的计时器来计算滴答声,可能会在每个滴答声中轮询按钮,或者只在CPU上使用固定长度的循环计时。@user3050884哪一个?请提供您正在使用的确切零件的链接。我看不到6502,除了一个示例应用程序使用一个运行Linux的小程序为6502做一个逻辑分析器,里面可能有一个模拟器。看起来像是家庭作业。
Delay:
;Save registers on the stack.
pha
txa
pha
tya
pha
;Change the number that is being loaded into the
; 'A' register in order to change the delay time.
lda 0a600h
OutLoop:
ldx #0dfh
InLoop1:
ldy #0ffh
InLoop2:
dey
bne InLoop2
dex
bne InLoop1
sec
sbc #1d
bne OutLoop
;Restore registers from the stack.
pla
tay
pla
tax
pla
rts
end