
![]() | #1 (permalink) Top |
User Data registr.: 06-08-2007 Residenza: Empoli
Messaggi: 1.813
| problema su int2 pic18f
Sarà che sono nel divano con la febbre da un paio di giorni e quindi non proprio lucidissimo ![]() ![]() 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??????? ![]() PS: per sicurezza, ho fatto una cosa simile con l'int0 e la frequenza è corretta...
__________________ ....... |
![]() | ![]() |
![]() | #2 (permalink) Top |
User |
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. ![]()
__________________ Peace & Love Fate le cose nel modo più semplice possibile, ma senza semplificare. (A. Einstein) ![]() |
![]() | ![]() |
![]() | #4 (permalink) Top |
User Data registr.: 06-08-2007 Residenza: Empoli
Messaggi: 1.813
|
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.
__________________ ....... |
![]() | ![]() |
![]() | #6 (permalink) Top |
User Data registr.: 06-08-2007 Residenza: Empoli
Messaggi: 1.813
|
Come sempre, aveva ragione lui ![]() 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 ![]() 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 ![]() ![]() Grazie a tutti!
__________________ ....... |
![]() | ![]() |
![]() | #8 (permalink) Top |
User |
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. ![]()
__________________ Peace & Love Fate le cose nel modo più semplice possibile, ma senza semplificare. (A. Einstein) ![]() |
![]() | ![]() |
![]() | #9 (permalink) Top |
User Data registr.: 06-08-2007 Residenza: Empoli
Messaggi: 1.813
|
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 ![]()
__________________ ....... |
![]() | ![]() |
![]() | #10 (permalink) Top |
User Data registr.: 10-06-2007 Residenza: Sansepolcro (Ar)
Messaggi: 1.948
|
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.
|
![]() | ![]() |
![]() |
Bookmarks |
| |
![]() | ||||
Discussione | Autore discussione | Forum | Commenti | Ultimo Commento |
problema!!!!!!! | gaetanux | Elimodellismo Principianti | 5 | 17 dicembre 09 09:05 |
problema | erapox | Aeromodellismo Principianti | 0 | 21 aprile 08 19:10 |
Problema O.S 15 | daltanius85 | Aeromodellismo Principianti | 3 | 26 marzo 08 11:28 |
problema os 32 | marcolo | Elimodellismo in Generale | 6 | 22 ottobre 07 16:44 |
problema li-po | alex92005 | Batterie e Caricabatterie | 0 | 04 dicembre 06 19:03 |