Vai al contenuto
PLC Forum


Mplab C18 Problema Esecuzione.


Messaggi consigliati

Inserito:

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


Inserita:

Prova a rispiegare il problema magari dopo tre ore dall'ultimo spumante :blink::D

Ciao :)

Inserita:

Eh....hai pure ragione!!!!

Vediamo se oggi riesco a salvare un'immagine della situazione!!!!

Ciao e Buone feste IF

Inserita:

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;

}

}

}

Inserita:

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 :)

Inserita:

Grazie per la risposta...

Per tua informazione, ho abilitato il PRAGMA prima della routine di interrupt... sembra funzionare!!! Grazie e ciaoooooooooo...

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