RESNIC Inserito: 27 dicembre 2005 Segnala 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
ifachsoftware Inserita: 27 dicembre 2005 Segnala Inserita: 27 dicembre 2005 Prova a rispiegare il problema magari dopo tre ore dall'ultimo spumante Ciao
RESNIC Inserita: 28 dicembre 2005 Autore Segnala Inserita: 28 dicembre 2005 Eh....hai pure ragione!!!!Vediamo se oggi riesco a salvare un'immagine della situazione!!!!Ciao e Buone feste IF
RESNIC Inserita: 28 dicembre 2005 Autore Segnala 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; } } }
ifachsoftware Inserita: 28 dicembre 2005 Segnala 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
RESNIC Inserita: 29 dicembre 2005 Autore Segnala 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...
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