circa 20 istruzioni ciascuno per tutti e tre gli interrupt del chopper(10uS a 8mhz o circa 4,5uS a 20 mhz)
circa 30 istruzioni per selezionare i nuovi dati di corrente inhibit e combinazione fasi da quando si riceve un impulso di step
28 istruzioni per cambiare effettivamente il passo (che si ridurrebbero a circa 20 con le resistenze al posto del DAC) ovvero disattivare gli interrupts, spegnere comparatori, impostare il nuovo comando delle fasi,impostare i nuovi valori di corrente, riattivare i comparatori e riattivare gli interrupts... di cui 18 istruzioni (o circa 10 senza DAC) con i comparatori fermi (inhibits a 0)....
..... mi sa che è necessario il quarzo a 20 mhz...
Codice: Seleziona tutto
interrupt_chopper
MOVWF W_TEMP ;push registri
SWAPF STATUS, W
MOVWF STATUS_TEMP
CLRWDT
bcf STATUS,RP1 ;controlla che l'interrupt sia stato
btfss PIR1,TMR2IF ;dell'overflow del timer del chopper o
goto interrupt_uscita_comp ;dell'uscita dei comparatori
bcf PIR1,TMR2IF ;se è l'overflow azzera il flag, riattiva
bsf STATUS,RP1 ;i comparatori e retfie
btfsc inhibit,1
bsf CM1CON0,C1ON
btfsc inhibit,2
bsf CM2CON0,C2ON
swapf STATUS_TEMP,w ;pop registri
movwf STATUS
swapf W_TEMP,f
swapf W_TEMP,w
retfie
interrupt_uscita_comp
bsf STATUS,RP1
btfss CM1CON0,OUT ;controlla quale comparatore ha provocato
goto $+5 ;l'interrupt (valore di corrente raggiunto)
bcf CM1CON0,C1ON ;e lo disattiva fino al prossimo overflow del timer
bcf STATUS,RP1
bcf PIR2,C1IF
bsf STATUS,RP1
btfss CM2CON0,OUT
goto $+4
bcf CM2CON0,ON
bcf STATUS,RP1
bcf PIR2,C1IF
bcf STATUS,RP1
swapf STATUS_TEMP,w ;pop registri
movwf STATUS
swapf W_TEMP,f
swapf W_TEMP,w
retfie
;**********************************************
polling_intf
btfss intcon,intf
goto $-1
goto traslatore
;**********************************************
traslatore
clrf PCLATH
movfw tabella_passi
movwf PCL
org 16
btfsc dir ;parte relativa al 1/2 passo
goto $+5 ;contatore avanti/indietro da 1 a 8
decfsz cont_traslat
goto $+8
bsf cont_traslat,3
goto $+6
incf cont_traslat
movlw 9
subwf cont_traslat,w
skpnz
bcf cont_traslat,3
clrc
rlf cont_traslat,w ;moltiplica x 8 il valore del contatore
movwf salto_riga ;in modo da poter saltare ai dati
rlf salto_riga,f ;di corrente inhibit ecc del passo corrispondente
rlf salto_riga,w
addwf PCL
nop
nop
nop
nop
nop
nop
nop
nop
movlw 255
movwf corrente_avvolgimento_1
movwf corrente_avvolgimento_2
bsf inhibit,1
bsf inhibit,2
movlw 01011100b
goto cambia_passo
nop
clrf corrente_avvolgimento_1
movlw 255
movwf corrente_avvolgimento_2
bcf inhibit,1
bsf inhibit,2
movlw 00011100b
goto cambia_passo
nop
movlw 255
movwf corrente_avvolgimento_1
movwf corrente_avvolgimento_2
bsf inhibit,1
bsf inhibit,2
movlw 10011100b
goto cambia_passo
nop
movlw 255
movwf corrente_avvolgimento_1
clrf corrente_avvolgimento_2
bsf inhibit,1
bcf inhibit,2
movlw 10001100b
goto cambia_passo
nop
movlw 255
movwf corrente_avvolgimento_1
movwf corrente_avvolgimento_2
bsf inhibit,1
bsf inhibit,2
movlw 10101100b
goto cambia_passo
nop
clrf corrente_avvolgimento_1
movlw 255
movwf corrente_avvolgimento_2
bcf inhibit,1
bsf inhibit,2
movlw 00101100b
goto cambia_passo
nop
movlw 255
movwf corrente_avvolgimento_1
movwf corrente_avvolgimento_2
bsf inhibit,1
bsf inhibit,2
movlw 01101100b
goto cambia_passo
nop
movlw 255
movwf corrente_avvolgimento_1
clrf corrente_avvolgimento_2
bsf inhibit,1
bcf inhibit,2
movlw 01001100b
goto cambia_passo
;*********************************************
cambia_passo
bcf INTCON.GIE ;disattiva l'interrupt
bsf STATUS,RP1
bcf CM1CON0,C1ON ;spegne i comparatori
bcf CM2CON0,C2ON
bcf STATUS,RP1
movwf PORTB ;manda al PORTB il comando per le fasi
movfw corrente_avvolgimento_1 ;manda i 2 valori di corrente al DAC
movwf PORTC
bsf canale_dac
bcf write_dac
bsf write_dac
movfw corrente_avvolgimento_2
movwf PORTC
bcf canale_dac
bcf write_dac
bsf write_dac
bsf STATUS,RP1
bsf CM1CON0,C1ON ;riattiva i comparatori
bsf CM2CON0,C2ON
bcf STATUS,RP1
clrf TMR2 ;azzera il timer e ripulisce
bcf PIR1,TMR2IF ;i flags degli interrupt
bcf INTCON,INTF
bcf PIR2,C1IF
bcf PIR2,C2IF
bsf INTCON,GIE ;riattiva l'interrupt e ripassa al ciclo di chopper
goto polling_intf