Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Assembly 6502微控制器使用中断的基本编程_Assembly_Microcontroller_6502 - Fatal编程技术网

Assembly 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:

我试图掌握在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:   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