- Messaggi: 128
- Ringraziamenti ricevuti 6
Strano problema con TMR0
7 Anni 11 Mesi fa #1
da Nutshell
Strano problema con TMR0 è stato creato da Nutshell
Salve a tutti, premetto che lavoro con MPLABX su Mac OSX, e programmo con PICKIT3. Sto utilizzando un pic18f4550, su una scheda da me disegnata e costruita professionalmente. Il clock del mcu è generato da un quarzo a 20mHz, in PLL per ottenere 48mHz per il pic e 24mHz come clock della cpu (PLL/4). L'oscilloscopio conferma che il cristallo oscilla a 20,001 MHZ. Ho impostato la porta uart correttamente e dialoga perfettamente, questo conferma dunque che il clock della cpu è 24MHZ.
Veniamo al dunque: Per qualche strano motivo non riesco a impostare correttamente la frequenza del TMR0. In pratica non riesco ad andare oltre i 10khz!
Questo è il codice che ho scritto:
//Imposto il TMR0
T0CONbits.TMR0ON = 0; //Disabilito per ora il TMR0 (verrà attivato dopo la configurazione di tutto nel main)
T0CONbits.T08BIT = 1; //TMR0 è configurato come contatore a 8 bit
T0CONbits.T0CS = 0; //Sorgente del clock di TMR0 è CLKO
T0CONbits.PSA = 0; //La sorgente di clock di TMR0 passa dal prescaler
// prescaler bits a 001 = 1/4 FOSC
T0CONbits.T0PS2 = 0; //Bit 2 del prescaler a 0
T0CONbits.T0PS1 = 0; //Bit 1 del prescaler a 0
T0CONbits.T0PS0 = 1; //Bit 0 del prescaler a 1
Poi l'interrupt routine..
if (T0IF)
{
TMR0L=196; //prescaler 1:4 e reload a 196 per una frequenza di 25Khz
T0IF=0;
}
A questo punto mi aspetterei un TMR0 a 25khz, mentre arriva a stento a 8khz, ma di questa misurazione parleremo dopo.
I dubbi che mi sorgono sono i seguenti:
Per prima cosa non ho ben capito se per FOSC si intende il quarzo a 20MHZ o il clock postscalato della CPU a 24MHZ perchè dal disegno della rete logica non è chiaro. Sono più propenso a credere sia comunque il clock della cpu a 24mhz.
Poi vorrei capire come effettuare una misurazione precisa di tmr0. Io per ora ho inserito all'interno della routine di interrupt T0IF una stringa con la quale metto in stato alto un pin del pic, e al ciclo successivo lo porto a 0... leggo la frequenza con l'oscilloscopio e moltiplico per due il valore. Perchè non riesco ad andare oltre i 12khz circa, nonostante provi a fare un reload anche a 254 e prescaler 1:1 ? Ho provato anche a forzare il reload del registro TMR0H a 255 per essere certo che non ci fosse un errore nella modalità (16bit / 8bit). Non capisco più dov'è l'errore. In passato mai avuto di questi problemi.
Veniamo al dunque: Per qualche strano motivo non riesco a impostare correttamente la frequenza del TMR0. In pratica non riesco ad andare oltre i 10khz!
Questo è il codice che ho scritto:
//Imposto il TMR0
T0CONbits.TMR0ON = 0; //Disabilito per ora il TMR0 (verrà attivato dopo la configurazione di tutto nel main)
T0CONbits.T08BIT = 1; //TMR0 è configurato come contatore a 8 bit
T0CONbits.T0CS = 0; //Sorgente del clock di TMR0 è CLKO
T0CONbits.PSA = 0; //La sorgente di clock di TMR0 passa dal prescaler
// prescaler bits a 001 = 1/4 FOSC
T0CONbits.T0PS2 = 0; //Bit 2 del prescaler a 0
T0CONbits.T0PS1 = 0; //Bit 1 del prescaler a 0
T0CONbits.T0PS0 = 1; //Bit 0 del prescaler a 1
Poi l'interrupt routine..
if (T0IF)
{
TMR0L=196; //prescaler 1:4 e reload a 196 per una frequenza di 25Khz
T0IF=0;
}
A questo punto mi aspetterei un TMR0 a 25khz, mentre arriva a stento a 8khz, ma di questa misurazione parleremo dopo.
I dubbi che mi sorgono sono i seguenti:
Per prima cosa non ho ben capito se per FOSC si intende il quarzo a 20MHZ o il clock postscalato della CPU a 24MHZ perchè dal disegno della rete logica non è chiaro. Sono più propenso a credere sia comunque il clock della cpu a 24mhz.
Poi vorrei capire come effettuare una misurazione precisa di tmr0. Io per ora ho inserito all'interno della routine di interrupt T0IF una stringa con la quale metto in stato alto un pin del pic, e al ciclo successivo lo porto a 0... leggo la frequenza con l'oscilloscopio e moltiplico per due il valore. Perchè non riesco ad andare oltre i 12khz circa, nonostante provi a fare un reload anche a 254 e prescaler 1:1 ? Ho provato anche a forzare il reload del registro TMR0H a 255 per essere certo che non ci fosse un errore nella modalità (16bit / 8bit). Non capisco più dov'è l'errore. In passato mai avuto di questi problemi.
Si prega Accedi o Crea un account a partecipare alla conversazione.
- Nutshell
- Autore della discussione
- Premium Member
Riduci
Di più
7 Anni 11 Mesi fa #2
da ettore
Rendering Error in layout Message/Item: array_keys(): Argument #1 ($array) must be of type array, null given. Please enable debug mode for more information.
Risposta da ettore al topic Strano problema con TMR0
Rendering Error in layout Message/Item: array_keys(): Argument #1 ($array) must be of type array, null given. Please enable debug mode for more information.
Si prega Accedi o Crea un account a partecipare alla conversazione.
- ettore
- New Member
Riduci
Di più
- Messaggi: 14
- Ringraziamenti ricevuti 2
7 Anni 11 Mesi fa #3
da Nutshell
Risposta da Nutshell al topic Strano problema con TMR0
Si la config word é corretta. Nella routine di interrupt c'é solo questo: LATEbits.Late2=LATEbits.Late2^1;
Che uso per verificare la frequenza con l'oscilloscopio leggendo su RE2. Ho scritto a memoria, non ricordo ora se avrei dovuto scrivere latebits.re2 invece di quello che ho scritto, ma sul mio codice é corretto.
Che uso per verificare la frequenza con l'oscilloscopio leggendo su RE2. Ho scritto a memoria, non ricordo ora se avrei dovuto scrivere latebits.re2 invece di quello che ho scritto, ma sul mio codice é corretto.
Si prega Accedi o Crea un account a partecipare alla conversazione.
- Nutshell
- Autore della discussione
- Premium Member
Riduci
Di più
- Messaggi: 128
- Ringraziamenti ricevuti 6
7 Anni 11 Mesi fa #4
da Nutshell
Risposta da Nutshell al topic Strano problema con TMR0
Piccolo aggionamento: demoralizzato dalla mancata risoluzione del problema, ho provato a realizzare la stessa cosa su un altro pic montato su una breadboard con immediato successo. Dunque mi vien da pensare che questo pic sia danneggiato. Purtroppo la scheda che ho realizzato monta un modello smd, per cui non posso sostituirlo al volo ma devo aspettare di tornare in laboratorio dove ho la stazione saldante ad aria calda prima di poter verificare il tutto.
Si prega Accedi o Crea un account a partecipare alla conversazione.
- Nutshell
- Autore della discussione
- Premium Member
Riduci
Di più
- Messaggi: 128
- Ringraziamenti ricevuti 6
Moderatori: Mauro Laurenti, Pinna, StefA, Matteo Garia
Registrati al sito
Accedi a tutte le risorse e articoli non visibili pubblicamente, puoi registrarti con pochi passi.
Login
© LaurTec 2006 - 2024