Cos'è ElectroYou | Login Iscriviti

ElectroYou - la comunità dei professionisti del mondo elettrico

Pierin PIc18 e interrupt vector

Raccolta di codici sorgenti

Moderatore: Foto UtentePaolino

0
voti

[11] Re: Pierin PIc18 e interrupt vector

Messaggioda Foto Utentericello9 » 14 set 2013, 23:21

Trovato, nella file configurazione.h, penultima riga.

Codice: Seleziona tutto
// Opzioni di configurazione.
// Qui di seguto ci sono le opzioni di configurazione del microcontrollore.
// Per conoscerne il significato consulatre il datasheet del PIC18F47J53
// alla sezione "SPECIAL FEATURES OF THE CPU" che fa riferimento ai
// registri di configurazione.


// Configurazione del tipo di oscillatore
// Oscillatore HS, PLL abilitato e HSPLL utilizzato dalla USB
#pragma config OSC = HSPLL

// Divisiore del PLL.
// Divide per 3 (Quarzo da 12 MHz)
#pragma config PLLDIV = 3

// Postscaler per il clock della CPU.
// Alla CPU viene mandato il clock senza divisioni
#pragma config CPUDIV = OSC1
       
// RESET in caso di stack overflow/underflow abilitato.
#pragma config STVREN = ON       

// Watchdog disabilitato al RESET- Sarà poi possibile abilitarlo
// all' interno del programma tramite il bit SWDTEN
#pragma config WDTEN = OFF

// Divisore per il clock fornito al watchdog
// Clock di sistema diviso per 32768
#pragma config WDTPS = 32768

// Set di istruzioni esteso disabilitato
#pragma config XINST = OFF       

// Protezione della memoria di programma.
// La memoria di programma non è protetta.
#pragma config CP0 = OFF

// Fail-Safe Clock Monitor disabilitato
#pragma config FCMEN = OFF

// Partenza a doppia velocità disabilitata
#pragma config IESO = OFF

// Clock per il Deep Sleep Watchdog Timer.
// Viene fornito il clock INTOSC/INTRC
#pragma config DSWDTOSC = INTOSCREF

// Clock per il Real Time Clock Calendar
// Il clock proviene dall' oscillatore del Timer 1
#pragma config RTCOSC = T1OSCREF

// BOR nello stato di Deep Sleep disabilitato
#pragma config DSBOREN = OFF

// Deep Sleep watchdog disabilitato       
#pragma config DSWDTEN = OFF

// Deep Sleep watchdog postscaler impostato a 8192 (8,5 secondi)
#pragma config DSWDTPS = 8192

// Il bit di sicurezza IOL1WAY può essere attivato e disattivato
#pragma config IOL1WAY = OFF

// MSSP address masking a 7 bit (indirizzi I2C in funzionamento slave)
#pragma config MSSP7B_EN = MSK7

// Protizione delle pagine della FLASH abilitata
#pragma config WPDIS = OFF          //WPFP[5:0], WPEND, and WPCFG bits ignored

// La protezione va dalla pagina 0 alla 1 per proteggere il bootloader
#pragma config WPFP = PAGE_1        //Write Protect Program Flash Page 0
#pragma config WPEND = PAGE_0       //Start protection at page 0
#pragma config WPCFG = OFF          //Write/Erase last page protect Disabled


// Define che indica che verrà utilizzato il bootloader. Il PIERIN utilizza
// il bootloader quindi non è da modificiare
#define USE_HID_BOOTLOADER

// Definizione della frequenza di clock del sistema
#define CLOCK_FREQ 48000000
#define GetSystemClock() CLOCK_FREQ



In pratica inserendo quella riga "#define USE_HID_BOOTLOADER" avverto il compilatore che uso il bootloader e quindi mi rimappa i vettori di interrupt, giusto?
Avatar utente
Foto Utentericello9
195 1 3 7
Stabilizzato
Stabilizzato
 
Messaggi: 360
Iscritto il: 16 mar 2009, 0:13

0
voti

[12] Re: Pierin PIc18 e interrupt vector

Messaggioda Foto UtenteShockwaver » 15 set 2013, 0:14

Ecco mi sembrava strano! :D
In pratica sì ma per farla breve visto quella define gli ifdef che passavano in mappa_int.h generavano un'altra direttiva pragma code che non si chiudeva facendo ripresentare il problema.
O_/
Anyone who has never made a mistake has never tried anything new
Two things are infinite: universe and human stupidity, and I'm not sure about the former
You did not really understand something unless you can explain it to your grandmother
A. Einstein
Avatar utente
Foto UtenteShockwaver
770 1 5 11
Expert
Expert
 
Messaggi: 859
Iscritto il: 3 mar 2010, 18:56

0
voti

[13] Re: Pierin PIc18 e interrupt vector

Messaggioda Foto UtenteShockwaver » 15 set 2013, 11:51

Per non farla breve, invece, tenendo conto di quella define e con i condizionali per il preprocessore, il file di mappatura diventa così:
Codice: Seleziona tutto
    void highPriorityInterrupt();
    void lowPriorityInterrupt();

       
       #define REMAPPED_RESET_VECTOR_ADDRESS         0x1000
       #define REMAPPED_HIGH_INT_VECTOR_ADDRESS   0x1008
       #define REMAPPED_LOW_INT_VECTOR_ADDRESS   0x1018

      extern void _startup (void);        // See c018i.c in your C18 compiler dir
      #pragma code REMAPPED_RESET_VECTOR = REMAPPED_RESET_VECTOR_ADDRESS
      void _reset (void)
      {
        _asm goto _startup _endasm
      }

    #pragma code REMAPPED_HIGH_INT_VECTOR = REMAPPED_HIGH_INT_VECTOR_ADDRESS
    void Remapped_High_ISR (void)
    {
      _asm goto highPriorityInterrupt _endasm
    }

    #pragma code REMAPPED_LOW_INT_VECTOR = REMAPPED_LOW_INT_VECTOR_ADDRESS
    void Remapped_Low_ISR (void)
    {
       _asm goto lowPriorityInterrupt _endasm
    }

    #pragma code HIGH_INTERRUPT_VECTOR = 0x08
    void High_ISR (void)
    {
      _asm goto REMAPPED_HIGH_INT_VECTOR_ADDRESS _endasm
    }
    #pragma code LOW_INTERRUPT_VECTOR = 0x18
    void Low_ISR (void)
    {
      _asm goto REMAPPED_LOW_INT_VECTOR_ADDRESS _endasm
    }

Anche qui l'ultimo #pragma code non si concude e quindi ti si ripresenta l'errore.
Se vuoi provare a mantenere il progetto originale con il bootloader abilitato (o anche solo il mappa_int.h originale, senza usare il bootloader commentando la #define USE_HID_BOOTLOADER) ti basterà chiudere OGNI direttiva pragma code.
O_/
Anyone who has never made a mistake has never tried anything new
Two things are infinite: universe and human stupidity, and I'm not sure about the former
You did not really understand something unless you can explain it to your grandmother
A. Einstein
Avatar utente
Foto UtenteShockwaver
770 1 5 11
Expert
Expert
 
Messaggi: 859
Iscritto il: 3 mar 2010, 18:56

0
voti

[14] Re: Pierin PIc18 e interrupt vector

Messaggioda Foto UtenteTardoFreak » 15 set 2013, 12:47

La direttiva #pragma code non si chiude!
Serve ad impostare il segmento su cui il compilatore inserisce il codice o le variabili.
Il fatto è che bisogna fare attenzione dove metterle e non dimenticarle.
"La follia sta nel fare sempre la stessa cosa aspettandosi risultati diversi".
"Parla soltanto quando sei sicuro che quello che dirai è più bello del silenzio".
Rispondere è cortesia, ma lasciare l'ultima parola ai cretini è arte.
Avatar utente
Foto UtenteTardoFreak
73,9k 8 12 13
-EY Legend-
-EY Legend-
 
Messaggi: 15754
Iscritto il: 16 dic 2009, 11:10
Località: Torino - 3° pianeta del Sistema Solare

0
voti

[15] Re: Pierin PIc18 e interrupt vector

Messaggioda Foto UtenteShockwaver » 15 set 2013, 13:01

#pragma code senza indirizzo può essere intesa come una chiusura di una precedente direttiva pragma con un indirizzamento del codice.

Se non la si usa il linker continua a indirizzare a partire dall'ultimo indirizzo specificato in un pragma code.
Pag 30 dello user guide del c18.
Tra l'altro, in ogni esempio riportato nella guide c'è sempre un #pragma code che resetta l'allocazione del codice da parte del linking alla sezione standard per il modulo in questione.

Io uso il termine "chiude" o "conclude" perché IMHO rende più l'idea di per una buona abitudine che è quella di rinchiudere tra due direttive pragma code un indirizzamento specifico che vogliamo fare.
Così non bisogna avere troppi patemi d'animo (aggiuntivi) sull'ordne da dare alle #include dove usiamo le varie direttive, come nel caso specifico. :ok:
Anyone who has never made a mistake has never tried anything new
Two things are infinite: universe and human stupidity, and I'm not sure about the former
You did not really understand something unless you can explain it to your grandmother
A. Einstein
Avatar utente
Foto UtenteShockwaver
770 1 5 11
Expert
Expert
 
Messaggi: 859
Iscritto il: 3 mar 2010, 18:56

0
voti

[16] Re: Pierin PIc18 e interrupt vector

Messaggioda Foto Utentericello9 » 16 set 2013, 12:48

Ho provato a modificare il file mappa_int.h come mi hai suggerito e a chiudere ogni #pragma code, tutto sembra funzionare.

Questo è il file corretto:
Codice: Seleziona tutto
void highPriorityInterrupt();
void lowPriorityInterrupt();

#define REMAPPED_RESET_VECTOR_ADDRESS         0x1000
#define REMAPPED_HIGH_INT_VECTOR_ADDRESS   0x1008
#define REMAPPED_LOW_INT_VECTOR_ADDRESS   0x1018

extern void _startup (void);        // See c018i.c in your C18 compiler dir
#pragma code REMAPPED_RESET_VECTOR = REMAPPED_RESET_VECTOR_ADDRESS
void _reset (void)
{
  _asm goto _startup _endasm
}
#pragma code

#pragma code REMAPPED_HIGH_INT_VECTOR = REMAPPED_HIGH_INT_VECTOR_ADDRESS
void Remapped_High_ISR (void)
{
  _asm goto highPriorityInterrupt _endasm
}
#pragma code

#pragma code REMAPPED_LOW_INT_VECTOR = REMAPPED_LOW_INT_VECTOR_ADDRESS
void Remapped_Low_ISR (void)
{
   _asm goto lowPriorityInterrupt _endasm
}
#pragma code

#pragma code HIGH_INTERRUPT_VECTOR = 0x08
void High_ISR (void)
{
  _asm goto REMAPPED_HIGH_INT_VECTOR_ADDRESS _endasm
}
#pragma code

#pragma code LOW_INTERRUPT_VECTOR = 0x18
void Low_ISR (void)
{
  _asm goto REMAPPED_LOW_INT_VECTOR_ADDRESS _endasm
}
#pragma code


Visto la tua esperienza ne approfittavo per chiederti un consiglio; il programma compilato mi occupa il 42% della memoria RAM disponibile.
Cattura.JPG
Cattura.JPG (38.05 KiB) Osservato 3707 volte

Penso che la lo spazio venga occupato dai due array di 768 e 500 caratteri che utilizzo per i font del diplay.
Ci sarebbe un'altra soluzione per non occuparare tutte la ram.

Grazie per l'aiuto
Marcello
Avatar utente
Foto Utentericello9
195 1 3 7
Stabilizzato
Stabilizzato
 
Messaggi: 360
Iscritto il: 16 mar 2009, 0:13

0
voti

[17] Re: Pierin PIc18 e interrupt vector

Messaggioda Foto UtenteTardoFreak » 16 set 2013, 13:02

La soluzione si chiama RAM esterna SPI o I2C.
"La follia sta nel fare sempre la stessa cosa aspettandosi risultati diversi".
"Parla soltanto quando sei sicuro che quello che dirai è più bello del silenzio".
Rispondere è cortesia, ma lasciare l'ultima parola ai cretini è arte.
Avatar utente
Foto UtenteTardoFreak
73,9k 8 12 13
-EY Legend-
-EY Legend-
 
Messaggi: 15754
Iscritto il: 16 dic 2009, 11:10
Località: Torino - 3° pianeta del Sistema Solare

0
voti

[18] Re: Pierin PIc18 e interrupt vector

Messaggioda Foto UtenteShockwaver » 16 set 2013, 13:05

Quoto Foto UtenteTardoFreak
Ad ogni modo se fai un riassunto sull'uso di questi due vettori, si può vedere se un ottimizzazione è possibile...

Inoltre comincia a ragionare su queste domande:
Hanno bisogno di coesistere?
Possono essere serializzati (il loro contenuto può essere creato/letto/esaminato byte per byte)?
Se no, possono essere spezzati in sotto-vettori riutilizzabili?
Hai progetti sulla RAM restante?
Anyone who has never made a mistake has never tried anything new
Two things are infinite: universe and human stupidity, and I'm not sure about the former
You did not really understand something unless you can explain it to your grandmother
A. Einstein
Avatar utente
Foto UtenteShockwaver
770 1 5 11
Expert
Expert
 
Messaggi: 859
Iscritto il: 3 mar 2010, 18:56

0
voti

[19] Re: Pierin PIc18 e interrupt vector

Messaggioda Foto UtenteShockwaver » 16 set 2013, 14:02

[OT]
A proposito della visualizzazione della RAM nella GUI di mplab... Bisogna fare attenzione alle varie malloc (in tutte le sue versioni) lo spazio che riserviamo con queste funzioni NON è conteggiato nella GUI.
Così, un'informazione di contorno e OT visto che nelle librerie standard C18 non sono neanche definite le varie *alloc.
[/OT]

Edit:
ricello9 ha scritto:Ho provato a modificare il file mappa_int.h come mi hai suggerito

Il mappa_int.h che avevo postato non era esattamente un qualcosa da sostituire a quello originale: era solo un modo per renderlo più leggibile mentre lo esaminiamo.
Il file mappa_int.h puoi tranquillamente lasciarlo come nell'originale (con tutte le sue #ifdef e #if defined) solo chiudendo tutte le direttive pragma code (soprattutto l'ultima)
Ultima modifica di Foto UtenteShockwaver il 16 set 2013, 14:17, modificato 1 volta in totale.
Anyone who has never made a mistake has never tried anything new
Two things are infinite: universe and human stupidity, and I'm not sure about the former
You did not really understand something unless you can explain it to your grandmother
A. Einstein
Avatar utente
Foto UtenteShockwaver
770 1 5 11
Expert
Expert
 
Messaggi: 859
Iscritto il: 3 mar 2010, 18:56

0
voti

[20] Re: Pierin PIc18 e interrupt vector

Messaggioda Foto UtenteTardoFreak » 16 set 2013, 14:05

Io ho usato con piacere QUESTA RAM SPI
Costa pochissimo ed hai 32KB a disposizione e la puoi far funzionare alla massima velocità visto che accetta un clock di 20 MHz.
"La follia sta nel fare sempre la stessa cosa aspettandosi risultati diversi".
"Parla soltanto quando sei sicuro che quello che dirai è più bello del silenzio".
Rispondere è cortesia, ma lasciare l'ultima parola ai cretini è arte.
Avatar utente
Foto UtenteTardoFreak
73,9k 8 12 13
-EY Legend-
-EY Legend-
 
Messaggi: 15754
Iscritto il: 16 dic 2009, 11:10
Località: Torino - 3° pianeta del Sistema Solare

PrecedenteProssimo

Torna a Firmware e programmazione

Chi c’è in linea

Visitano il forum: Nessuno e 3 ospiti