RESNIC Inserito: 27 dicembre 2005 Segnala Share Inserito: 27 dicembre 2005 Buongiorno....Ho un problema che mi affligge enon riesco a trovarci il dritto.... vediamo se riesco a spiegarlo semplicemente!!! Ho una routine di ineterrupt abbastanza sostanziona... non riesco a fare altrimenti... però la riabilita alla fine .... quindi non può andare in colisione. Esiste inoltre una variabile all'esterno... e quello che capita è la seguente cosa... la variabile a quanto pare assume un valore diverso da 0... sebbene che nello Watch viene visualizzato 0... poi se vado a vedere il File register è ancora a 0... ma non c'è il commento giusto.... c'è il commentio di una variabile interna alla routin di ineterrupt..... qualche dritta????Buona gioornata Link al commento Condividi su altri siti More sharing options...
ifachsoftware Inserita: 27 dicembre 2005 Segnala Share Inserita: 27 dicembre 2005 Prova a rispiegare il problema magari dopo tre ore dall'ultimo spumante Ciao Link al commento Condividi su altri siti More sharing options...
RESNIC Inserita: 28 dicembre 2005 Autore Segnala Share Inserita: 28 dicembre 2005 Eh....hai pure ragione!!!!Vediamo se oggi riesco a salvare un'immagine della situazione!!!!Ciao e Buone feste IF Link al commento Condividi su altri siti More sharing options...
RESNIC Inserita: 28 dicembre 2005 Autore Segnala Share Inserita: 28 dicembre 2005 Ciao IF,Come puoi vedere nel file allegato, i valori delle variabili N_errori e Set_N_errori sono visualizzate in Watch, peròcome vedi dalla freccia verde mi è entrato il programma in un punto che non doveva entrare (guarda IF). Proverò ad ingannare il programma.... però non riesco a capire questo tipo di errore, ed è già successo con un'altra variabile....DI SEGUITO IL PROGRAMMA (SIMILE a quello che sto usando.... ma cui struttura è identica)./ PROGETTO "TPR01 // Progetto scheda acquisizione dati// ////=============================================================================// Filename: MAIN.C//=============================================================================// Autore: // Company: // Version: 1.00// Date: 11/2005//=============================================================================// Compiled using MPLAB-C18 V1.00.xx// Include Files: P18F2620.H V1.xx.xx//=============================================================================//// // // ////===========================================================================//-- CONFIGURAZIONE PIC --//File da includere per dichiarazioni e funzioni:#include <p18f2620.h> //Include file #include <ser_prot.h> // Include file gestione seriale#include <proc.h> //Include file procedure create// Configurazione fuses PIC per utilizzo + utilizzo ICD2#pragma config OSC = HS //Oscillatore HS#pragma config WDT = OFF //WatchDog Timer OFF#pragma config LVP = OFF //Low Voltage Programing OFF#pragma config DEBUG = ON //Debug ON#pragma config XINST = ON //Debug ON#pragma idata bigdatavolatile unsigned int TABELLAL[1601];#pragma idataunsigned int * TABL_ptr = &TABELLAL[0];unsigned int ERRORI[10][2];unsigned int DATI[10];unsigned int kampioni=0;unsigned int n;int c=0;char campiona=0;unsigned char N_errori=0;char t1=0;unsigned int Valore_Max=0;unsigned int Kampione_ValMax=0;unsigned char Preset_Low=0; // Preset low timer per interruptunsigned char Preset_High=0; // Preset high timer per interruptunsigned char Perc_errore=0; // 1=1%, 2=2% , 100 =10%unsigned char Errore_assoluto=0; // 1/1024 del Fondo scalaunsigned char Set_N_errori=0;unsigned char Set_delay_Rele=0;//-- GESTIONE INTERRUPTvoid Acquisisci (void); /* prototype needed for 'goto' below */void Azzera (void); /* prototype needed for 'goto' below */#pragma code HIGH_INTERRUPT_VECTOR = 0x8void high_ISR (void) {Acquisisci ();}#pragma code LOW_INTERRUPT_VECTOR = 0x18void Med_ISR (void) {Azzera ();}#pragma code /* allow the linker to locate the remaining code *///#pragma Acquisiscivoid Acquisisci(void){unsigned int valore;unsigned int Lim_inf;unsigned int Lim_sup;unsigned int Val_campionato;unsigned int err_ass; LATCbits.LATC2=1; // TESTif (INTCONbits.TMR0IF = 1) { ADCON0bits.GO=1; // Inizia con l'analogica while (ADCON0bits.GO==1) { } valore=ADRESH; valore=valore<<8; valore=valore|ADRESL; if (STATUS_CAMPIONATO==0) { STATUS_CAMPIONAMENTO=1; TABL_ptr[kampioni]=valore; } if (STATUS_CAMPIONATO==1) { err_ass=valore/100*Perc_errore; if (err_ass<Errore_assoluto) { err_ass=Errore_assoluto; } Lim_inf=valore-err_ass; Lim_sup=valore+err_ass; Val_campionato=TABL_ptr[kampioni]; if ((Val_campionato<Lim_inf) ||(Val_campionato>Lim_sup)) { N_errori++; ERRORI[N_errori][0]=kampioni; ERRORI[N_errori][1]=valore; } if (Valore_Max<valore) { Valore_Max=valore; Kampione_ValMax=kampioni; } } kampioni++; if (kampioni>1600) { INTCONbits.TMR0IE =0; // Disabilita interrupt del Timer STATUS_CAMPIONATO=1; DATI[0]=Valore_Max; DATI[1]=Kampione_ValMax; } TMR0L=Preset_Low; TMR0H=Preset_High; INTCONbits.TMR0IF = 0; }LATCbits.LATC2=0;INTCONbits.GIEH = 1; // Abilita interrupt High level.return;}void Azzera(void){kampioni=0;INTCONbits.TMR0IE =1; // Abilita interrupt del TimerINTCON3bits.INT2IF = 0; // Resetta interruptINTCONbits.GIEL = 1; // Abilita interrup Low priorityreturn;}//-- DICHIARAZIONE FUNZIONI --//------ PROCEDURA INIZIALIZZAZIONE --------------------void Init (void){unsigned int n; // Inizializza porte PORTA=0; // init Porta ATRISA=0xFF; // RA=InputPORTB=0; //init Porta BTRISB=0xFF; //RB0:RB7 =inputPORTC=0; //init Porta CTRISC=0xA0; //RC0:RC5=Output, RC6:RC7=Input// Inizializzazione ADC ADCON0=0x01; //Analogica canale 0ADCON1=0x0E;ADCON2=0x8C;// Inizializzazione serialeSER_INIT();//abilita interruptINTCON2=0x40;RCONbits.IPEN = 1; /* enable interrupt priority levels *//*INTCON3bits.INT1IP = 0;INTCON3bits.INT1IE = 1; // enable low priority interrupts per INT 1 INTCON3bits.INT1IF = 0; // resetta interrupt T0CON=0x88; // Settaggio Timer 0 come contatoreINTCONbits.TMR0IE =0; // Abilita interrupt del TimerINTCONbits.TMR0IF = 0; //resetta interruptINTCON2bits.TMR0IP = 1;INTCONbits.GIEH = 1; // enable all high priority interrupts INTCONbits.PEIE = 1; // enable all low priority interrupts TMR0L=0x00;TMR0H=0x00;*/// Abilita INT2 = interupt da prossimitiINTCON3bits.INT2IP = 0;INTCON3bits.INT2IE = 1; // enable low priority interrupts per INT 1 INTCON3bits.INT2IF = 0; // resetta interrupt T0CON=0x88; // Settaggio Timer 0 come contatoreINTCONbits.TMR0IE =0; // Abilita interrupt del TimerINTCONbits.TMR0IF = 0; //resetta interruptINTCON2bits.TMR0IP = 1;INTCON2bits.INTEDG2 = 1;INTCONbits.GIEH = 1; // enable all high priority interrupts INTCONbits.PEIE = 1; // enable all low priority interrupts Preset_Low=EEPROM_lettura (0x0001);Preset_High=EEPROM_lettura (0x0000);Perc_errore=EEPROM_lettura (0x0002);Errore_assoluto=EEPROM_lettura (0x0003);Set_N_errori=EEPROM_lettura (0x0004);Set_delay_Rele=EEPROM_lettura (0x0005);// Inizializza variabiliStatus_Tasti.byte=0; kampioni=0;STATUS_CAMPIONATO=0;//valore=0;for (n=0;n<1600;n++) { TABL_ptr[n]=0; } for (n=0;n<10;n++) { DATI[n]=0; } DELAY_MS(255);}void TEST_CICLO(void){if (N_errori > Set_N_errori) if (PORTBbits.RB2==0) { LATCbits.LATC3=1; DELAY_MS(Set_delay_Rele); LATCbits.LATC3=0; STATUS_CAMPIONATO=0; N_errori=0; }if (STATUS_CAMPIONATO==1) { LATCbits.LATC1=1; } else { LATCbits.LATC1=0; } }// PROGRAMMA PRINCIPALEvoid main (void){ Init(); //chiamata ad inizializzazione. while (1) //ciclo continuo { TEST_CICLO(); // CONTINUA ELABORAZIONE SERIALE. SERIALE(TABL_ptr); //CALCOLO TEMPO CICLO PROGRAMMA if (LATCbits.LATC0==0) { LATCbits.LATC0=1; } else { LATCbits.LATC0=0; } } } Link al commento Condividi su altri siti More sharing options...
ifachsoftware Inserita: 28 dicembre 2005 Segnala Share Inserita: 28 dicembre 2005 Ho provato a dare un'occhiata VELOCE al codice e mi sembra di capire che hai un interrupt sul fronte di salita e uno sul fronte di discesa dove da una parte acquisisci dei dati da dentro all'interrupt e dall'altra resetti i dati.Nella routine di acquisizione stai in loop a leggere un dato analogico.La mia sensazione e' che hai dei casini con gli interrupt e le loro priorita'.Probabilmente se devi acquisire un dato setti un flag globale e fai partire l'ADC , che ti richiamera' un interrupt al completamento della lettura e li lo processi.Ripetoi , e' una mia sensazione , bisognerebbe approfondire con il data-sheet del micro e sapere esattamente cosa vuoi fare.Spero di esserti stato utile...Ciao Link al commento Condividi su altri siti More sharing options...
RESNIC Inserita: 29 dicembre 2005 Autore Segnala Share Inserita: 29 dicembre 2005 Grazie per la risposta...Per tua informazione, ho abilitato il PRAGMA prima della routine di interrupt... sembra funzionare!!! Grazie e ciaoooooooooo... Link al commento Condividi su altri siti More sharing options...
Messaggi consigliati
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 accountAccedi
Hai già un account? Accedi qui.
Accedi ora