Newsgroup: it.hobby.elettronica.digitale
Titolo: Periferiche PIC32

Buongiorno a tutti,
Volevo chiedere una cosa circa le periferiche del PIC32.
Sto cercando tramite l'interrupt esterno INT_1 di catturare un segnale
di 1 MHz, ma non ci riesco.
In pratica questo segnale e' un clock di un adc e vorrei fare delle
brevissime operazioni quando catturo un fronte di salita.
L'interrupt funziona, ma sembra che il segnale del pin sia filtrato
perche' il pic si perde dei fronti.
Non ho molta esperienza con i PIC32, ma credo che il problema dipenda
dal clock delle periferiche che e' settato a 40 MHz(almeno cosi'
credo).
Mi sapete dire se e' effettivamente possibile catturare fenomeni della
durata di 1 microsecondo oppure se sto sbagliando approccio?
uso il compilatore c della microchip in lite-mode e non voglio usare
la periferica spi per dialogare con l'adc.
Grazie anticipatamente
Saluti


La prima cosa che mi viene in mente č che il tuo micro non sia 
abbastanza veloce.
Se la ISR dura piů di 1us ovviamente perderai degli eventi.
Dovresti cercare di descrivere meglio cosa devi fare e soprattutto 
perché, magari possiamo trovare una soluzione alternativa.

 perch , magari possiamo trovare una soluzione alternativa.
Devo leggere l'uscita di un adc audio stereo a 32 bit con un pic32.
L'adc e' cloccato in modo che il frame di un singolo canale duri 32
microsecondi, quindi un singolo impulso di clock dura 1 microsecondo
(ho controllato con l'oscilloscopio ed e' tutto ok).
Ho provato gia' con la periferica SPI e non sono riuscita a farla
funzionare, addirittura su un forum in inglese (di cui ho perso il
link) si accennava ad un bug dello SPI nella configurazione a 32 BIT e
allora per
non perdere ulteriore tempo ho abbandonato questa strada.
In pratica il pic deve comportarsi come uno slave e deve essere in
grado di intercettare i cambiamenti dello stato del clock (che e' la
linea piu' veloce da gestire).
Poi ,una volta ricevuto i dati, devo far passare l'audio in due filtri
FIR e rimandarli in uscita al DAC..
Spero di essere stato chiaro.
Ciao

 Il pic funziona a 80 MHz  e le periferiche a 40 MHz
Dimenticavo che sto usando un PIC32MX340F512H.
Tra l'altro uno dei problemi che ho avuto con la SPI era il fatto che
l'ingresso SS/SYNCRO (RF6) sembra rimanere configurato come uscita,
mentre a me serve come ingresso,
e non c'e' verso di poterlo riconfigurare.
Ciao

 non perdere ulteriore tempo ho abbandonato questa strada.
Capisco, tieni presente perň che se lo fai a mano avrai pochissimo tempo 
di CPU per il filtraggio. A livello architetturale sarebbe meglio usare 
la SPI/I2S che sono fatte apposta per questo scopo, magari con il DMA.
In ogni caso, descritta cosě dovrebbe funzionare. Non conosco 
direttamente il micro in questione, quindi posso solo darti un aiuto 
generico:
- Verifica di aver programmato bene la periferica e l'IRQ (sul fronte e 
non sul livello, etc...)
- Assicurati, dentro l'ISR, che tutto sia devvero velocissimo e che 
l'IRQ sia gestito correttamente (acknoledge dell'IRQ e cose simili)
- Assicurati che in foreground, nel main, non vengano disabilitati gli 
interrupt per troppo tempo
Spero di esserti stato di aiuto,
Ciao!
-- 
  _|/ Francesco Sacchi - Develer S.r.l., R&D dept.
   |\ 
http://www.develer.com/
 - 
http://www.bertos.org

 Spero di esserti stato di aiuto,
Se non lo sei stato per il caso specifico, lo sei stato sicuramente
per farmi capire che
ho preso troppe cose per scontate
Grazie mille, provo a vedere se tante volte l'interrupts non si
generasse sui livelli invece che sul fronte e ti (vi) faro' sapere
Ciao

 incrementare e shiftare due-tre variabili
Se la CPU va ad 80MHz, un ciclo di clock è pari a 12.5ns. Supponiamo che 
il micro esegua tutte le istruzioni in un solo ciclo
e che tra entrare nell'ISR, fare le operazioni che devi e poi riuscire 
si perdano 20 istruzioni. Ciò corrisponde a 250ns. Questi 250ns vengono 
spesi una volta al microsecondo, ovvero la tua CPU è già occupata per il 
25% della sua potenza di calcolo, senza aver fatto ancora nulla!
Senza contare che non potrai praticamente mai disabilitare gli 
interrupt. Ciò rende più difficile accedere ai dati che ricevi dall'ADC 
senza problemi di concorrenza. Quantomeno devi stare molto attento ed 
assicurarti di usare istruzioni atomiche per regolarne l'accesso.
Se i tempi indicati sopra sono corretti, dovrai inoltre assicurarti che 
il filtraggio non prenda più di 750ns per campione, altrimenti non ce la 
farai a filtrare in tempo reale.
Ogni cosa che aggiungerai all'ISR impatterà pesantemente sul tempo a 
disposizione per il resto.
Spero di non aver detto cose a te ovvie,
Ciao!
Francesco

 25% della sua potenza di calcolo, senza aver fatto ancora nulla!
Mi sembri molto ottimista. Non ricordo di aver mai visto un push o un pop,
o una CALL o RETI durare meno di due cicli. ;-)
Francamente non vedo come si possa fare senza una SPI funzionante.
Certo che quelli di Microchip non riescano manco a fare una SPI è bella...
:D

 o una CALL o RETI durare meno di due cicli. ;-)
Sì, sono stato un po' ottimista :-)
Ora non conosco i PIC32, ma per esempio, alcune CPU concorrenti, a 
80MHz, richiedono 2 wait states per leggere dalla flash. Questo 
significa che i tempi sono raddoppiati, ovvero che la CPU sarebbe 
occupata per più del 50% del suo tempo senza aver ancora fatto nessun 
calcolo.
Ciao!

:D
Qui uno dice che è riuscito ad usare la SPI:
http://www.pctuner.net/forum/programmazione-pic/130373-spi-con-pic32.html
--
ciao
  Stefano

 disposizione per il resto.
Pensa, che poi mi sono accorto che devo lavorare anche sul fronte di
discesa.
Niente..... lascio fare tutto alla CPLD e alle ram esterne per il
momento, pensavo di poter risparmiare
qualche eurotto facendolo fare al pic.....desolazione..... :(
Con la CPLD inoltre posso tranquillamente processare 512 tappi a
canale e pure a 44KHz invece che a 15,625 KHz che avevo scelto per il
PIC.

> Qui uno dice che riuscito ad usare la SPI:
Non riferisce l'esito della prova pero'......

Non riferisce l'esito della prova pero'......
Se leggi fino in fondo dice 'soluzione trovata':
"purtroppo uChip non ha risposto al mio ticket.. comunque soluzione trovata.
consiglio di fare tutti i settaggi dell'SPI con l'SPI disabilitato
SPI2CONbits.ON = 0; // C-C32 compiler
poi fate i vostri settaggi, e solo alla fine lo riabilitate riportando il bit
<ON> = 1"
Non so se è il tuo caso, ma un controlllo fossi in te lo farei.
--
ciao
  Stefano

> Non so se il tuo caso, ma un controlllo fossi in te lo farei.
certo che si, se la moglie mi lascia un'altra notte libera e non mi
spedisce in Siberia......

 :D
A proposito, domanda per te che sei uno storico allergico alla
microchip....
Che usi come micro a 32 bit? Come ti trovi? Tools gratuiti?

 Che usi come micro a 32 bit? Come ti trovi? Tools gratuiti?
ARM, GNUCC e BertOS. Forse un giorno. ;-)

 ARM, GNUCC e BertOS. Forse un giorno. ;-)
;-P