BaroneRosso.it - Forum Modellismo

BaroneRosso.it - Forum Modellismo (https://www.baronerosso.it/forum/)
-   Circuiti Elettronici (https://www.baronerosso.it/forum/circuiti-elettronici/)
-   -   problema su int2 pic18f (https://www.baronerosso.it/forum/circuiti-elettronici/159373-problema-su-int2-pic18f.html)

illez 13 gennaio 10 19:22

problema su int2 pic18f
 
Sarà che sono nel divano con la febbre da un paio di giorni e quindi non proprio lucidissimo :D ma non mi riesce di far andare questo benedetto interrupt come dico io (e come dice il datasheet, credo :rolleyes:).
Come da manuale (il pic in oggetto è il pic18f2455) :
l'int2 è un registro a 8 bit e viene incrementato alla frequenza di Fosc:4

Avendo io un quarzo a 4Mhz con PLL attivato ho un clock interno a 96Mhz che con la divisione minima per 2 porta ad un clock per il pic di 48Mhz.
Il timer2 viene quindi incrementato alla frequenza di 12Mhz (48:4, appunto), cioè ogni 0,0833 uSec.
Se imposto il prescaler a 16 si incrementa ogni 1,333 uSec

Il timer2 viene ad ogni ciclo confrontato con un registro di periodo: se sono uguali viene resettato il timer2 e generato un output di match verso il postscaler. Il postscaler non è altro che un contatore che ad una soglia prefissata (da 1 a 16) genera (finalmente!) l'interrupt.
Sembra complicato, ma non lo è.

Bene, detto tutto ciò e tornando alle mie impostazioni: l'incremento avviene ogni 1,333 uSec. Se imposto il registro di periodo a 124 ottengo un match ogni 166,6 uSec.
Se setto il postscaler a 6, ottengo finalmente un INT ogni millisecondo circa.

Giusto?

Sbagliato; facendo un semplice bip ogni 1000 interruzioni la frequenza ottenuta è molto più bassa, di circa 1/3.
PORCACCIA LA MISERIA, PERCHE???????:angry:

PS: per sicurezza, ho fatto una cosa simile con l'int0 e la frequenza è corretta...

ElNonino 13 gennaio 10 20:17

Forse mi sfugge qualcosa ma come fai con un quarzo a 4 MHz avere un clock a 96 MHz ?

Vado a rivedermi i data-sheet del PIC ma mi pare che il PLL moltiplichi per 4 la frequenza dell' oscillatore, se sbaglio perdonami.

:yeah:

marcosinatti 13 gennaio 10 20:21

E' la stessa cosa che ho pensato io, la frequenza massima raggiungibile è 48mhz, ma adesso guardo meglio perchè non mi è molto chiaro.

illez 13 gennaio 10 20:28

Il discorso degli oscillatori è piuttosto complicato e non è detto che non mi sbagli.
Ma guardando a pag.26 del datasheet (la fig.2.1) si vede che il PLL genera 96Mhz obbligatoriamente con un input di 4 Mhz (fornito o con un quarzo da 4Mhz o con multipli e settando poi il PLL prescaler).
Da qui passa in due direzioni: obbligatoriamente attraverso un divisore per 2 per la parte USB e attraverso un PLL Postscaler (CPUDIV) che divide minimo per 2 il clock.

marcosinatti 13 gennaio 10 20:33

Si in effetti i tuoi calcoli mi sembrano corretti, quindi a questo punto sembra dipendere da qualcosa sul timer.

illez 14 gennaio 10 09:28

Come sempre, aveva ragione lui :rolleyes:

Vi spiego qual'erano le cause perché potreste cascarci anche voi.
Usando il PLL, per impostare il clock di sistema dovete impostare anche CPUDIV, 2 bit che dividono il clock per 2, 3, 4 oppure 6.
Nel CCS C la definizione, o meglio, i #fuses legati al CPUDIV possono trarre in inganno.
Trattandosi di fuses e non di define, non vedete immediatamente cosa state facendo :wink:.
Infatti il fuses CPUDIV2 non divide per 2 il clock come potrebbe sembrare. E analogamente CPUDIV4 non divide per 4.
Al contrario delle #define solite dove, per esempio, i prescaler vengono definiti con un nome che indica il valore della divisione, i fuses CPUDIVx indicano nella cifra il valore dei 2 bit che verranno impostati.
Quindi CPUDIV1 divide per 2, CPUDIV2 divide per 3 (e NON per 2), CPUDIV3 divide per 4 e CPUDIV4 divide per 6.
Dopo essere impazzito per qualche giorno ho scoperto questa cosa e risolto molti dei problemi; dopo le mille prove fatte per capire cosa succedeva, chiarita la causa mi son scordato nel codice un CPUDIV2 che, appunto, mi divideva il clock per 3, da cui l'errore del timer :rolleyes::rolleyes:
Grazie a tutti!

marcosinatti 14 gennaio 10 09:32

Son quelle cose che fanno inc...are come iene!
Grande! e grazie della spiegazione...

ElNonino 14 gennaio 10 14:26

Sono andato pure io a rivedermi il data-sheet, Illez hai ragione, ottima spiegazione la tua; controllerò come viene gestito nel C originale MC, se mi servirà mi avrai sicuramente fatto risparmiare tempo nel debug.

:yeah:

illez 14 gennaio 10 14:50

Dopo tanto divertimento con i PIC16, son passato a questo pic18f2455 perché voglio poterlo collegare via USB.
Ancora non ho provato, finora ho gestito la parte ricezione infrarossi e pilotaggio dei display (sto provando a realizzare un cronometro per automodelli con l'emettitore a infrarossi nella macchina). L'idea è quella di scaricare i tempi via USB sul PC e leggendo qua e la mi sembra di capire che la cosa migliore sia avere un quarzo a 4Mhz; con quello ho il clock per la USB e un notevole clock (48Mhz!) per la parte pic.
Vediamo se ci riesco :wink:

marcosinatti 14 gennaio 10 21:55

La usb l'avevo usata con un pic18f2550, mi pare con un quarzo a 12Mhz, però in picbasic, usando microcodestudio c'è un tool che crea in automatico tutta la parte pic e Vb6 per farli comunicare.


Tutti gli orari sono GMT +2. Adesso sono le 21:45.

Basato su: vBulletin versione 3.8.11
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
E' vietata la riproduzione, anche solo in parte, di contenuti e grafica. Copyright 1998/2019 - K-Bits P.I. 09395831002