Vai al contenuto
PLC Forum


Mplab C18 Problema Esecuzione.


RESNIC

Messaggi consigliati

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


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 bigdata

volatile unsigned int TABELLAL[1601];

#pragma idata

unsigned 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 interrupt

unsigned char Preset_High=0; // Preset high timer per interrupt

unsigned char Perc_errore=0; // 1=1%, 2=2% , 100 =10%

unsigned char Errore_assoluto=0; // 1/1024 del Fondo scala

unsigned char Set_N_errori=0;

unsigned char Set_delay_Rele=0;

//-- GESTIONE INTERRUPT

void Acquisisci (void); /* prototype needed for 'goto' below */

void Azzera (void); /* prototype needed for 'goto' below */

#pragma code HIGH_INTERRUPT_VECTOR = 0x8

void high_ISR (void)

{

Acquisisci ();

}

#pragma code LOW_INTERRUPT_VECTOR = 0x18

void Med_ISR (void)

{

Azzera ();

}

#pragma code /* allow the linker to locate the remaining code */

//#pragma Acquisisci

void Acquisisci(void)

{

unsigned int valore;

unsigned int Lim_inf;

unsigned int Lim_sup;

unsigned int Val_campionato;

unsigned int err_ass;

LATCbits.LATC2=1; // TEST

if (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 Timer

INTCON3bits.INT2IF = 0; // Resetta interrupt

INTCONbits.GIEL = 1; // Abilita interrup Low priority

return;

}

//-- DICHIARAZIONE FUNZIONI --

//------ PROCEDURA INIZIALIZZAZIONE --------------------

void Init (void)

{

unsigned int n;

// Inizializza porte

PORTA=0; // init Porta A

TRISA=0xFF; // RA=Input

PORTB=0; //init Porta B

TRISB=0xFF; //RB0:RB7 =input

PORTC=0; //init Porta C

TRISC=0xA0; //RC0:RC5=Output, RC6:RC7=Input

// Inizializzazione ADC

ADCON0=0x01; //Analogica canale 0

ADCON1=0x0E;

ADCON2=0x8C;

// Inizializzazione seriale

SER_INIT();

//abilita interrupt

INTCON2=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 contatore

INTCONbits.TMR0IE =0; // Abilita interrupt del Timer

INTCONbits.TMR0IF = 0; //resetta interrupt

INTCON2bits.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 prossimiti

INTCON3bits.INT2IP = 0;

INTCON3bits.INT2IE = 1; // enable low priority interrupts per INT 1

INTCON3bits.INT2IF = 0; // resetta interrupt

T0CON=0x88; // Settaggio Timer 0 come contatore

INTCONbits.TMR0IE =0; // Abilita interrupt del Timer

INTCONbits.TMR0IF = 0; //resetta interrupt

INTCON2bits.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 variabili

Status_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 PRINCIPALE

void 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

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

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

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...