Interrupts

8 Anni 1 Mese fa #1 da Guido72
Interrupts è stato creato da Guido72
Salve a tutti,

ho un problema nell'utilizzare gli interrupts col pic 18F4550.

Spiego meglio.

Ho collegato il pic ad un display lcd.

Il display per ora deve solo incrementare il conteggio alla pressione di un pulsante e fin qui tutto ok.

Dato che devo sostituire il pulsante con una serie di impulsi (quadri) provenienti da un'altro circuito e che il conteggio , o meglio l'incremento, deve avvenire solo al passaggio di stato "rising edge" dell'impulso, ho pensato
di utilizzare la funzione interrupts che , appunto, consente di identificare il fronte di salita.

Ho inserito la funzione interrupts come indicato nel libro XC8 step by step ossia prima della funzione main.

Al verificarsi dell'evento una variabile deve incrementare di 1 il proprio valore.

Il problema è che questa variabile , anche se dichiarata volatile unsigned int sembra non essere letta dal successivo blocco main.

Qualche consiglio ?

Se riesco inserisco parte del prog.

Grazie
Guido

Si prega Accedi o Crea un account a partecipare alla conversazione.

  • Guido72
  • Senior Member
  • Senior Member
Di più
8 Anni 1 Mese fa #2 da Mauro Laurenti
Risposta da Mauro Laurenti al topic Interrupts
Probabilmente e' meglio se posti il programma minimo.

In fase di Debug hai modo di verificare se la routine ISR viene effettivamente chiamata e avviene l'incremento?
Se durante il Debug ti accorgi che l'ISR non viene chiamato, probabilmente vuol dire che le impostazioni per l'interrupt non sono forse corrette.

Saluti,

Mauro

Si prega Accedi o Crea un account a partecipare alla conversazione.

  • Mauro Laurenti
  • Avatar di Mauro Laurenti
  • Moderator
  • Moderator
Di più
8 Anni 1 Mese fa #3 da Guido72
Risposta da Guido72 al topic Interrupts
Salve Mauro,

non escludo di aver commesso gravi errori nel main.

Non saprei come verificare l'ISR durante il debug.... :oops:

Guido

Si prega Accedi o Crea un account a partecipare alla conversazione.

  • Guido72
  • Senior Member
  • Senior Member
Di più
8 Anni 1 Mese fa #4 da Mauro Laurenti
Risposta da Mauro Laurenti al topic Interrupts
Controlla il capitolo sul Debug...

Metti un breakpoint nell'ISR...

Saluti,

Mauro

Si prega Accedi o Crea un account a partecipare alla conversazione.

  • Mauro Laurenti
  • Avatar di Mauro Laurenti
  • Moderator
  • Moderator
Di più
8 Anni 1 Mese fa #5 da Guido72
Risposta da Guido72 al topic Interrupts
#include <xc.h>
#include "PIC18F4550_config.h"
#define LCD_DEFAULT
#include "LCD_44780.h"
#include "LCD_44780.c"


#pragma config PBADEN = OFF
volatile unsigned int pulses; // Variabile inpulsi


__interrupt (high_priority) void ISR_alta (void) {

if (INTCONbits.RBIF == 1)
if (PORTBbits.RB4 == 1 & PORTCbits.RC4 == 0) {

pulses++ ;
}

if (INTCONbits.RBIF == 1)
if (PORTBbits.RB4 == 1 & PORTCbits.RC4 == 1) {
pulses--;

INTCONbits.RBIF = 0;
}

}


void main(void) {


TRISA = 0b11111111; // Imposto pin A come input
PORTA = 0b00000000; // Imposto pin A a zero

TRISB = 0b11111111; // Imposto pin B come input
PORTB = 0b00000000; // Imposto pin B a zero

TRISC = 0b11111111; // idem
PORTC = 0b00000000; // idem

TRISD = 0b00000001; // Imposto PORTD tutti output,RD0 input
PORTD = 0b00000000; // Imposto pin D a zero

TRISE = 0b11111111; // Imposto pin E come input
PORTE = 0b00000000; // Imposto pin E a zero

UCONbits.USBEN = 0; // Per poter usare RC4-RC5 come input digitali - Pag 119 Datasheet pic
UCFGbits.UTRDIS = 1; // Per poter usare RC4-RC5 come input digitali

INTCON2bits.INTEDG0 = 1; // Abilito gli interrupts su rising edge

INTCON2bits.RBPU = 1; // Disabilito pull-ups su tutte porte B

INTCONbits.RBIE = 1; // Abilito interrupts su PORTB

RCONbits.IPEN = 0; // Abilito modalità compatibile con pic16 (già di default)- solo alta priorità

INTCONbits.RBIF = 0; // Resetto il flag (avviso) d'interrupt prima di attivare le interruzioni

INTCONbits.GIE = 1; // Abilito le interruzioni globali

INTCONbits.PEIE = 1; // Abilito l'interrupt sulle periferiche



LCD_initialize (20); // Inizializzo LCD


LCD_write_message ("Pulses: ");

LCD_shift_cursor (LCD_LEFT,3);


while (1) {

LCD_write_integer (pulses,3, LCD_ZERO_CLEANING_ON);

LCD_shift_cursor (LEFT,3);


return;
}
}

Si prega Accedi o Crea un account a partecipare alla conversazione.

  • Guido72
  • Senior Member
  • Senior Member
Di più
Moderatori: Mauro LaurentiPinnaStefAMatteo Garia

Registrati al sito

Accedi a tutte le risorse e articoli non visibili pubblicamente, puoi registrarti con pochi passi.

Registrati al sito LaurTec.

Login