Utilizzo degli interruzioni del compilatore di PIC C

Quali sono le interruzioni?

Immagina di cucinare, hai posizionato l’acqua per far bollire tutto bisogno e improvvisamente tocca il campanello della tua casa, ti stanno interrompendo, allora la tua funzione in quel momento sarà quella di aprire la porta, frequentare la persona e chiudere la porta, quando finisci, torna a cucinare, ma non tornare a Inizia, ma continui a cucinare da dove sei rimasto.

È attivata un’interruzione, il microcontrollore smette di fare ciò che sta facendo per eseguire la funzione di interruzione precedentemente dichiarata, e quindi tornare a dove era stato Sinistra.

Un’interruzione può essere vista come avviso che può essere attivato sia da un processo specifico del microcontrollore (fine della conversione dell’ADC, della ricezione dei dati del modulo EUSART, EVORDE DE TIMER, ecc.) o da un cambiamento esterno ad esso (cambia in alcuni Porta specifica, cambio di pin, ecc.).

PIC C Interruzioni del compilatore

Nella scheda Visualizzazione del compilatore PIC C, possiamo trovare una scatola che dice “interrupt”, In lei avrà l’informazione delle interruzioni che il nostro microcontrollore dice. Ad esempio, per il caso di Miuva (Pic 18F4550) troveremo il seguente elenco:

  • AD: ADC CONVERSION ADC
  • BUSCOL: BUS COLLISION
  • ccp1: cattura o confronto in unità 1
  • ccp2: acquisizione o confronto nell’unità 2
  • Comp: confronto evento
  • EEPROM: scrittura completa
  • ext: interruzione esterna (RB0)
  • ext1: interruzione esterna (RB1)
  • ext2: interruzione esterna (RB2)
  • Lowvolt: bassa tensione rilevato
  • OSCF: fallimento nel sistema di oscillatore
  • rb: Modifiche alla porta B (RB4: RB7)
  • RDA: Dati ricevuti disponibili RS232
  • RTCC: Timer0 Overflow (RTCC)
  • SPP: Porta di ritrasmissione Scrittura parallela / lettura
  • ssp: SPI / I2C Attività
  • Tbe: buffer di trasmissione vuoto RS232
  • timer0: Timer0 overflow
  • timer1: flip da timer1
  • timer2: timer2 overflow
  • timer3: evorde de timer 3
  • USB: attività USB

Il modo per attivare le interruzioni è molto simile in tutti i casi, dobbiamo “avvertire” il compilatore che la funzione da descrivere sarà Interruzione e successivamente aggiungere la funzione come se fosse altre. Come segue:

La “xxxx” deve essere sostituita dal nome dell’interruzione da utilizzare (possiamo trovarlo nella sezione di visualizzazione – > interrupt), ad esempio, per attivare la funzione di interruzione esterna (RB0), dovremo sostituire “ext”. Seguendo come segue:

#int_EXTvoid ext_isr(){ //Función de interrupción externa (RB0) }}

All’interno della nostra funzione principale, dobbiamo attivare le interruzioni con le seguenti righe:

enable_interrupts(GLOBAL); //Habilita interrupcionesenable_interrupts(int_XXXX); //Habilita interrupción deseada

A seguito del caso di interruzione esterna:

enable_interrupts(GLOBAL); //Habilita interrupcionesenable_interrupts(int_EXT); //Habilita interrupción externa (RB0)

Ad esempio, il seguente codice, nella sua funzione principale aumenterà un 16- Contatore di bit e mostrando il suo valore nel display LCD, ma al momento viene attivata l’interruzione esterna (RB0), investirà il valore di un LED situato sul PIN E0. Dopo aver invertito il valore del LED tornerà al programma principale e continuerà a contare sul numero in cui è stato.

#include <18f4550.h> // la librería del PIC#Fuses HSPLL, NOWDT, NOPROTECT, NOLVP, NODEBUG, USBDIV, PLL2, CPUDIV1, VREGEN#use delay (clock=48M) //Seleccionamos la frecuencia de reloj de 48MHz#use standard_io(b)#use standard_io(e)#include "MLCD.c"int16 contador = 0; #int_EXTvoid ext_isr(){ output_toggle(PIN_E0);}void main(){ lcd_init(); set_tris_b(0xFF); //Puerto b como entrada set_tris_e(0x00); //Puerto e como salida output_e(0x07); //Apaga led rgb enable_interrupts(GLOBAL); //Habilita interrupciones enable_interrupts(int_EXT); //Habilita interrupcion externa while(true){ contador++; printf(lcd_putc, "Cont = %5lu", contador); }}

Per ulteriori informazioni a che ora attiva Ciascuna delle diverse interruzioni è importante leggere la scheda tecnica.

Livelli di interruzione

In molte occasioni I nostri programmi devono eseguire diversi compiti e alcuni potrebbero essere più importanti di altri è il motivo per cui lavoriamo con interruzioni possiamo dichiarare diverse priorità per loro, maggiore è la loro priorità più importante è il compito da fare, quindi se è attivata un’interruzione prioritaria, indipendentemente dal fatto che il nostro programma sta facendo (anche se Un’altra funzione di interruzione prioritaria bassa) salterà alla funzione corrispondente e quindi tornerà a dove si trovava.

Per attivare i livelli di priorità nel compilatore PIC C è necessario aggiungere la seguente riga all’inizio del nostro codice:

#device HIGH_INTS=TRUE //Activamos niveles de prioridad

successivamente È necessario specificare quale delle interruzioni vorremo configurare come una priorità elevata, per questo dovremo aggiungere “alto” dopo aver dichiarato di utilizzare una funzione di interrupt, come segue:

#int_EXT1 HIGHvoid ext_isr(){ //Función de interrupción de alta prioridad }}

Nel seguente codice di esempio, definiremo due interruzioni, sia esterne, uno abilitato dal PIN RB1 e dall’altro dal PIN RB2, poiché in base alla scheda tecnica del microcontrollore, Entrambi possono essere configurati sia ad alta che bassa priorità. Il nostro codice avrà tre contabili indipendenti, uno sarà aumentato nella funzione principale, un altro quando viene attivata un’interruzione prioritaria a bassa priorità e l’interruzione prioritaria è attivata. Questo servirà per che l’utente corrobora il funzionamento del Livelli, dal momento che il valore dei 3 contatori verrà visualizzato nel display LCD.

Quando le interruzioni non sono attivate, il valore di, se l’interruzione della priorità bassa è attivata (RB2) smetterà di aumentare il valore del valore del valore del contagiri principale e aumenterà il valore del contatore della funzione di priorità bassa fino al raggiungimento di 10000 o fino a quando non si attiva l’interruzione di alta priorità che avvierà il proprio contatore fino a raggiungere 10000.

Potrebbe essere notato che non c’è nulla Ciò può interrompere la funzione ad alta priorità, quindi, sarà possibile lasciare tale funzione fino a quando il contatore non raggiunge il valore definito (10000). A differenza della funzione della bassa priorità che può essere messa in pausa dall’alto. E a differenza della funzione principale che può essere messa in pausa mediante priorità bassa o alta.

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *