Vai al contenuto
PLC Forum


Interrupt 16f876 Problema Anomalo - per tornare da dove ha interrotto 2 min


Omarro

Messaggi consigliati

Ciao,

nell'usare gl'interrupt riscontro il seguente problema....

quando si scatena l'interrupt al cambiamanto logico di Rb0 esegue la subroutine d'interrupt e quando deve ritornare al programma principale ci mette due minuti ed è molto strano.

come mai mi fa questo scherzo?

questo è il codice...

char BYTEORE,BYTEMINUTI,BYTEGIORNI,BYTEMESE,BYTEANNO;

char NCARATTERI,CURSORE,DECINE,UNITA,DECINELCD,UNITALCD;

char ORE,MINUTI,GIORNO,MESE,ANNI,AM,GIORNI_IND,MESI_I,MONTH;

char STEP,i,NUM_MENU,N_GIORNO,BINARY,NUMERO_BCD,setting,provetta;

/* Dichiarazione delle etichette */

bit LED_DISPLAY [at] PORTA.5;

bit TMENU [at] PORTB.0;

bit TDOWN [at] PORTB.1;

bit TUP [at] PORTB.2;

bit TOK [at] PORTB.3;

bit RBPU [at] OPTION.7;

bit RS [at] PORTC.5;

bit RW [at] PORTC.6;

bit E [at] PORTC.7;

void INVIA_COMANDO (char COMANDO, char CURSORE);

void INVIA_CARATTERE (char CARATTERE);

void EEPROM_TO_LCD (char INDIRIZZO, char NCARATTERI);

void CONVERSIONE_BCD (char NUMERO);

void INVIA_NUM_BCD (void);

void MENU (void);

void ORARIO (void);

void delay_ms (uns16 millisec);

void CONTROLLO_TOK(void);

void VISUALIZZA_VOCE_MENU(void);

void INIT_LCD (void);

void prova (char a);

void DATARIO (void);

void GIORNO_S (char DAY);

void MESE_S (char MONTH);

void ERROR_MSG(void);

#include <int16cxx.h>

#pragma origin 4

interrupt menu (void) {

int_save_registers

GIE = 0;/*disabilito gl'interrupt in modo da utilizzare i pulsanti normalmente*/

/*gestische l'illuminazione del display*/

if (LED_DISPLAY == 0) {

LED_DISPLAY = 1;

} else {

LED_DISPLAY = 0;

}

STEP = 0;

for (i=0; i < 4; i++) {

if(TMENU == 0) {

delay_ms(250);

STEP++;

} else {

i = 5;

}

}

if (STEP == 4) {

LED_DISPLAY = 1;

INVIA_COMANDO(0x01,0);

EEPROM_TO_LCD(0x70,5);

MENU();

INVIA_COMANDO(0x01,0);

EEPROM_TO_LCD(0xE0,32);

}

INTCON.1 = 0;

int_restore_registers

}

#pragma origin 950

#pragma sharedAllocation

#include <delay.c>

#include <menu.c>

//#include <orario.c>

#include <routine_bcd.c>

#include <routine_varie.c>

#include <display.c>

void main (void) {

//#define MESE_S(char MONTH);

//inizializzazione del PIC e del display

delay_ms(500); //Ritardo per la stabilizzazione della tensione del display

//ADCON0 = 0; //ferma il convertitore A/D

ADCON1 = 0x06; // tutti dati digitali

INTCON = 0x90; //abilitazione interrupt RB0

TRISA = 0x00; // Impostazione del PORTA

TRISB = 0x0F; // Impostazione del PORTB

TRISC = 0x18; // Impostazione del PORTC

RBPU = 0; // PULL-UP interno attivo su RBO RB1 RB2 RB3 ingressi

//setting = 0; // Variabile di controllo del menu

INIT_LCD(); //funzionamento per il setting del display

while (1){

EEPROM_TO_LCD(provetta,3);

provetta++;

}

/*CODICE*/

}

Link al commento
Condividi su altri siti


Crea un account o accedi per commentare

Devi essere un utente per poter lasciare un commento

Crea un account

Registrati per un nuovo account nella nostra comunità. è facile!

Registra un nuovo account

Accedi

Hai già un account? Accedi qui.

Accedi ora
×
×
  • Crea nuovo/a...