l'approccio ai PIC32 continua e visto che il progetto, a prescindere dal micro, funziona abbastanza bene ci accingiamo a realizzare dei prototipi su circuito stampato.
Prima di fare ciò stavo provando un attimo le prestazioni del micro: durante l'esecuzione del programma la CPU sarà sollecitata da una quantità di elaborazione abbastanza pesante o meglio, dovrà rispettare vincoli temporali piuttosto ristretti, e volevo quindi verificare effettivamente di usare il micro al masssimo delle sue potenzialità.
Il clock del sistema è 80 MHz (oscillatore XT 8MHz + PLL x10) quindi il massimo utilizzabile. Ho letto alcune discussioni che discutono del fatto che con C32 di Microchip per ottenere il masssimo delle prestazioni è necessario apporre la magic function:
- Codice: Seleziona tutto
SYSTEMConfigPerformance(80000000);
che permette di settare il valore di "wait states" di flash e ram opportuno per ottenere il top delle prestazioni. Dopo aver cercato invano di replicare la funzione di libreria Microchip con MikroCpic32 sembra che gli sviluppatori MikroElektronika abbian chiarito che i valori sono automaticamente settati dal compilatore per ottenere il massimo delle prestazioni.
Detto questo veniamo al dunque:grazie alle istruzioni atomiche INV SET CLR che permettono di invertire, settare o pulire un registro con una sola istruzione dovrebbe quindi essere possibile ottenere un onda quadra in uscita di frequenza=40 MHz.
Ho trovato questo esempio scritto per C32
- Codice: Seleziona tutto
#include <p32xxxx.h>
#include <plib.h>
// sysclock = 80MHz
#pragma config FPLLMUL = MUL_20, FPLLIDIV = DIV_2, FPLLODIV = DIV_2, FWDTEN = OFF
#pragma config POSCMOD = HS, FNOSC = PRIPLL, FPBDIV = DIV_1
extern void toggle(int *portinv, int mask);
int main(void)
{
// configure cache, wait states, PBDIV
SYSTEMConfigPerformance(80000000UL);
mJTAGPortEnable( 0);
// enable pin RA0 output
TRISA = 0xFFFE;
// call the infinite loop
toggle( &LATAINV, 0x0001); // toggle LED0 continuosly
return 0;
} // main
grazie al quale l'autore sostiene di riuscire ad ottenere in uscita un'onda quadra a 40 MHz.
Ho provato a scrivere qualcosa di simile in MikroC:
- Codice: Seleziona tutto
while(1)
LATGINV=0x2000; // toggle LED0 continuosly
Ottenendo in uscita una onda quadra 10 MHz.
La mia domanda (che ai più sembrerà banale ma ben venga se questo sevirà a fugare ogni mio dubbio) è:
guardando l'equivalente assembly il codice corrisponde a:
- Codice: Seleziona tutto
L_main274:
;Vision Salad.c,1177 :: LATGINV=0x2000; // toggle LED0 continuosly
ORI R2, R0, 8192
SW R2, Offset(LATGINV+0)(GP)
J L_main274
NOP
Qui interviene la mia ignoranza nel rapporto linguaggio macchina-esecuzione del codice: da quante istruzioni è composto ogni ciclo? O meglio:quanto tempo impiega ogni ciclo?
O meglio ancora: sto viaggiando davvero a 80 MHz e quindi con l'acceleratore a manetta?
Grazie mille.

Elettrotecnica e non solo (admin)
Un gatto tra gli elettroni (IsidoroKZ)
Esperienza e simulazioni (g.schgor)
Moleskine di un idraulico (RenzoDF)
Il Blog di ElectroYou (webmaster)
Idee microcontrollate (TardoFreak)
PICcoli grandi PICMicro (Paolino)
Il blog elettrico di carloc (carloc)
DirtEYblooog (dirtydeeds)
Di tutto... un po' (jordan20)
AK47 (lillo)
Esperienze elettroniche (marco438)
Telecomunicazioni musicali (clavicordo)
Automazione ed Elettronica (gustavo)
Direttive per la sicurezza (ErnestoCappelletti)
EYnfo dall'Alaska (mir)
Apriamo il quadro! (attilio)
H7-25 (asdf)
Passione Elettrica (massimob)
Elettroni a spasso (guidob)
Bloguerra (guerra)




]

