- Messaggi: 45
- Ringraziamenti ricevuti 0
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
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
- Autore della discussione
- Senior Member
Riduci
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
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.
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....
Guido
non escludo di aver commesso gravi errori nel main.
Non saprei come verificare l'ISR durante il debug....
Guido
Si prega Accedi o Crea un account a partecipare alla conversazione.
- Guido72
- Autore della discussione
- Senior Member
Riduci
Di più
- Messaggi: 45
- Ringraziamenti ricevuti 0
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
Metti un breakpoint nell'ISR...
Saluti,
Mauro
Si prega Accedi o Crea un account a partecipare alla conversazione.
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;
}
}
#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
- Autore della discussione
- Senior Member
Riduci
Di più
- Messaggi: 45
- Ringraziamenti ricevuti 0
Moderatori: Mauro Laurenti, Pinna, StefA, Matteo Garia
Registrati al sito
Accedi a tutte le risorse e articoli non visibili pubblicamente, puoi registrarti con pochi passi.