J'essaie de comprendre les interruptions comme moyen de synchroniser les actions sur un micro-contrôleur Teensy 6502. J'ai réussi à créer un compteur qui ajoute des bits plus rapide en déclenchant l'interruption:Programmation de base d'un microcontrôleur 6502 utilisant des interruptions
%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
Ce que je suis en train de faire est d'imprimer « bonjour » à la console une fois par seconde et « là » lorsque l'IRQ est appuyé, déclenchant l'interruption. Aurais-je utiliser une boucle de retard comme:
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
Ou ai-je besoin de quelque chose qui est chronométré par des interruptions? Toute orientation serait utile.
Le 6502 avec lequel je travaillais n'avait pas de minuteries ou de ports intégrés, vous deviez utiliser un circuit intégré périphérique, tel qu'un 6522 VIA mappé en mémoire. Si vous utilisez une minuterie, vous devez effacer la demande d'IRQ en lisant la [fiche technique] (http://www.princeton.edu/~mae412/HANDOUTS/Datasheets/6522.pdf). L'utilisation d'une boucle logicielle pour un temps de retard est un exercice de laboratoire d'étudiant, il perd juste le temps précieux de processeur. –
Je travaille avec un mincrocontroller teensy qui contrôle des LEDs. – user3050884
Observation de côté mineure: 'RTI' tire le registre d'état de la pile avant de tirer le compteur de programme; vous n'avez pas besoin de 'CLI' avant. – Tommy