; Assembly PIC18 - Versione 0.1 - Aprile 2018 ; Copyright (c) 2016-2018, Vincenzo Villa ; Creative Commons | Attribuzione - Condividi allo stesso modo 4.0 Internazionale (CC BY-SA 4.0) ; Creative Commons | Attribution-Share Alike 4.0 Unported ; https://www.vincenzov.net/tutorial/PIC18/Assembly/timer0.htm ; PIC18F26K20 / MPLAB X 4.15 / MPASM v5.77 ; Motore passo-passo con interruzioni #include "p18f26k20.inc" ; ;Impostazione della velocità del motore (frequenza di passo) ;TIMER0H_D equ 0xFF ; Valore iniziale del conteggio. Esempio 0xFF06 -> 1 ms ;TIMER0L_D equ 0x06 TIMER0H_D equ 0xF6 ; Valore iniziale del conteggio. Esempio 0xF63C -> 10 ms TIMER0L_D equ 0x3C STEP_PIN equ RC4 ; Un impulso su questo pin fa avanzare il motore DIR_PIN equ RC5 ; Determna il verso di rotazione UDATA_ACS step res 1; numero di passi da fare periodo res 2; Valore a cui ricaricare Timer0 ; Valori più grandi -> maggiore velocità del motore (non lineare) passi res 1; Numero di passi da fare RES_VECT CODE 0x0000 ; Vettore di Reset bra Inizio ; Va ll'inizio del programma ; Routine per la gestione delle interruzioni (Interrupt Service Routine) ISR CODE 0x0008 btfsc INTCON, TMR0IF ; Interruzione da Timer0 ? bra GestioneTimer0 ; Esegue il codice corrispondente retfie FAST ; Nessuna interrupt riconosciuta... GestioneTimer0 ; Interrupt da Timer0 bsf LATC, STEP_PIN ; Il motore fa un passo bcf LATC, STEP_PIN movlw TIMER0H_D ; Valore iniziale di Timer0 movwf TMR0H movlw TIMER0L_D movwf TMR0L dcfsnz passi ; Decrementa il numero di passi call spegniTimer0 ; Finito? Se si, spegni Timer0 bcf INTCON, TMR0IF ; Azzera il flag che segnala l'interrupt generato da Timer0 retfie FAST ; Torna ad eseguire il codice principale MAIN_PROG CODE Inizio call configuraIeO ; Configurazione delle porte di I/O movlw TIMER0H_D ; Valore iniziale di Timer0 movwf TMR0H movlw TIMER0L_D movwf TMR0L call ConfiguraTimer0 ; Configura Timer0 bsf INTCON, GIE ; Abilito la CPU a ricevere interruzioni ; Superloop repeat bcf LATC,DIR_PIN ; Imposta il verso di rotazione del motore movlw .100 ; Numero di passi da fare movwf passi call accendiTimer0; Avvio Timer0: il motore inizia a girare stop bra stop ; **************************************************************************** ; Configura I/O configuraIeO clrf TRISC ; PORTC come uscita, tutti gli 8 pin ; Vengono usati solo i seguenti pin: ; STEP_PIN (per esempio RC4) Se viene portato a 1 e poi a 0 in motore fa un passo ; DIR_PIN (per esempio RC5) Il valore 0/1 determina il verso di rotazione return ; **************************************************************************** ; Configura Timer0 ConfiguraTimer0 bcf T0CON, T08BIT ; Configura Timer0 per funzionare a 16 bit bcf T0CON, T0CS ; Configura il clock di Timer0 interno (250 kHz) bsf T0CON, PSA ; Disattivo il prescaler bsf INTCON, TMR0IE ; Abilito Timer0 a generare interruzioni return accendiTimer0 bsf T0CON, TMR0ON ; "Accende" Timer0 return spegniTimer0 bcf T0CON, TMR0ON ; "Spegne" Timer0 return END