Foglio di calcolo TIMER + PWM
13 Anni 8 Mesi fa #11
da gcupini
Risposta da gcupini al topic Re: Foglio di calcolo TIMER + PWM
Ciao Spazzoli,
Non ho provato in modo SIM, ma posso farlo poi ti riferisco.
Non ho provato in modo SIM, ma posso farlo poi ti riferisco.
Si prega Accedi o Crea un account a partecipare alla conversazione.
- gcupini
- Visitatori
13 Anni 8 Mesi fa #12
da gcupini
Risposta da gcupini al topic Re: Foglio di calcolo TIMER + PWM
ciao,
ho provato in modo SIm. Tutto funziona normalmente.
ho provato in modo SIm. Tutto funziona normalmente.
Si prega Accedi o Crea un account a partecipare alla conversazione.
- gcupini
- Visitatori
13 Anni 8 Mesi fa #13
da Mauro Laurenti
Risposta da Mauro Laurenti al topic Re: Foglio di calcolo TIMER + PWM
Ciao,
in casi come questi è bene anche vedere il codice assembly generato dalla compilazione e verificare il valore che effettivamente viene caricato nel registro d'interesse.
E' bene vedere il codice assembly direttamente da MPLAB in maniera da avere le istruzioni in C e quelle in assembly messe vicine.
Saluti,
Mauro
in casi come questi è bene anche vedere il codice assembly generato dalla compilazione e verificare il valore che effettivamente viene caricato nel registro d'interesse.
E' bene vedere il codice assembly direttamente da MPLAB in maniera da avere le istruzioni in C e quelle in assembly messe vicine.
Saluti,
Mauro
Si prega Accedi o Crea un account a partecipare alla conversazione.
- Mauro Laurenti
- Moderator
Riduci
Di più
13 Anni 8 Mesi fa #14
da Spazzoli
anto.spax
youtube robot gallery:
www.youtube.com/user/antospax?feature=mhum
Risposta da Spazzoli al topic Re: Foglio di calcolo TIMER + PWM
Quindi nel tuo caso hai un diverso comportamento tra sim e modalità hw...probabilmente l'errore deriva da quest'ultima?
Riguardo al mio caso mi sono messo a fare due calcoli: e ho scoperto quanto segue...nei passaggi ho fatto certe ipotesi, magari quanto dico è totalmente sbagliato, tuttavia se fosse corretto sarebbe estremamente interessante (poichè frutto di coincidenza!)
configurazione timer0: 16bit, no prescaler, no postscaler, Fosc = 10Mhz, intervallo richiesto 0,02 sec.
Ne viene il valore da caricare nei registri: 15536,
corrispondente a:
TMR0H = 00111100; //Valori da caricare in binario nei registri
TMR0L = 10110000;
MA così scrivendo in C18 (ovvero come facevo prima di accorgermi dell'errore), il compilatore interpreta le stringhe come numeri in base 10, e non come binari!!!...però TUTTO FUNZIONAVA.....perchè????
se considero TMR0L scritto 10110000 in base 10, anzichè in binario e lo converto in binario mi viene
1001 1010 0100 0100 0011 0000
ma poichè il regitro è da soli 8 bit mi trovo 00110000 in TMR0L (suppongo che la parte che rimane memorizzata sia la meno significativa, LSB),
ora, poichè il TMR0H rappresenta una sorta di buffer, esso si riempie con il byte successivo, cioè: 01000100 (sempre di TMR0L che notoriamente va caricato per ultimo)
In altre parole mi trovo i registri così riempiti:
TMR0H = 0b01000100; //Ciò che veramente è scritto nei registri!!!
TMR0L = 0b00110000;
i quali, convertendo in base 10, corrispondono a 17456 incrementi.
Calcolo gli scatti all'overflow: 65536 - 17456 = 48080
poichè il periodo del timer = T_timer = 0,0000004 sec
l'intervallo generato è di 0,0000004 * 48080 = 0,01932
ovvero CASUALMENTE viene un valore diverso da quello richiesto di meno di un ms, e io non mi sono mai accorto di questa imprecisione.
Usavo questo timer fino ad ora per generare l'impulso per i servi..solo quando ho cambiato da 20ms a 10ms mi sono accorto che qualcosa non andava!!!
Ricapitolando, fuorviato dal modo con cui sono riempiti i registri nell'esempio di pag. 178 di c18step_by_step, commettevo un errore che casualmente non veniva evidenziato fin tanto che lavoravo a 20ms, ma che poi mi si manifestava appena cambiavo, anche di poco l'intervallo fra i vari interrupt!
Ha senso questa analisi? Oppure ho preso una cantonata...eppure adesso tutto funziona, e a me sembra di avere cambiato solo quella cosina lì, ovvero riempire i registre specificando davanti 0b...
Riguardo al mio caso mi sono messo a fare due calcoli: e ho scoperto quanto segue...nei passaggi ho fatto certe ipotesi, magari quanto dico è totalmente sbagliato, tuttavia se fosse corretto sarebbe estremamente interessante (poichè frutto di coincidenza!)
configurazione timer0: 16bit, no prescaler, no postscaler, Fosc = 10Mhz, intervallo richiesto 0,02 sec.
Ne viene il valore da caricare nei registri: 15536,
corrispondente a:
TMR0H = 00111100; //Valori da caricare in binario nei registri
TMR0L = 10110000;
MA così scrivendo in C18 (ovvero come facevo prima di accorgermi dell'errore), il compilatore interpreta le stringhe come numeri in base 10, e non come binari!!!...però TUTTO FUNZIONAVA.....perchè????
se considero TMR0L scritto 10110000 in base 10, anzichè in binario e lo converto in binario mi viene
1001 1010 0100 0100 0011 0000
ma poichè il regitro è da soli 8 bit mi trovo 00110000 in TMR0L (suppongo che la parte che rimane memorizzata sia la meno significativa, LSB),
ora, poichè il TMR0H rappresenta una sorta di buffer, esso si riempie con il byte successivo, cioè: 01000100 (sempre di TMR0L che notoriamente va caricato per ultimo)
In altre parole mi trovo i registri così riempiti:
TMR0H = 0b01000100; //Ciò che veramente è scritto nei registri!!!
TMR0L = 0b00110000;
i quali, convertendo in base 10, corrispondono a 17456 incrementi.
Calcolo gli scatti all'overflow: 65536 - 17456 = 48080
poichè il periodo del timer = T_timer = 0,0000004 sec
l'intervallo generato è di 0,0000004 * 48080 = 0,01932
ovvero CASUALMENTE viene un valore diverso da quello richiesto di meno di un ms, e io non mi sono mai accorto di questa imprecisione.
Usavo questo timer fino ad ora per generare l'impulso per i servi..solo quando ho cambiato da 20ms a 10ms mi sono accorto che qualcosa non andava!!!
Ricapitolando, fuorviato dal modo con cui sono riempiti i registri nell'esempio di pag. 178 di c18step_by_step, commettevo un errore che casualmente non veniva evidenziato fin tanto che lavoravo a 20ms, ma che poi mi si manifestava appena cambiavo, anche di poco l'intervallo fra i vari interrupt!
Ha senso questa analisi? Oppure ho preso una cantonata...eppure adesso tutto funziona, e a me sembra di avere cambiato solo quella cosina lì, ovvero riempire i registre specificando davanti 0b...
anto.spax
youtube robot gallery:
www.youtube.com/user/antospax?feature=mhum
Si prega Accedi o Crea un account a partecipare alla conversazione.
13 Anni 8 Mesi fa #15
da Mauro Laurenti
Risposta da Mauro Laurenti al topic Re: Foglio di calcolo TIMER + PWM
Ciao Spazzoli,
la cosina del mettere 0b prima del numero è in realtà una cosa sostanziale!
Effettivamente se cosi non si facesse, il numero verrebbe interpretato come decimale.
La spiegazione che hai dato effettivamente giustifica il fatto che pur avendo caricato un numero decimale il codice funzionava.
Ciononostante caricare un valore non a 8 bit in un registro a 8 bit potrebbe anche dare comportamenti diversi visto che comunque non si è in specifica e il compilatore potrebbe partire dal byte più significativo del numero da caricare.
Quanto a pagina 178 del testo C18 Step by Step, hai messo in evidenza un errore sul testo. Infatti i numeri scritti devono essere preceduti da 0b. A breve apporterò la correzione.
Saluti,
Mauro
la cosina del mettere 0b prima del numero è in realtà una cosa sostanziale!
Effettivamente se cosi non si facesse, il numero verrebbe interpretato come decimale.
La spiegazione che hai dato effettivamente giustifica il fatto che pur avendo caricato un numero decimale il codice funzionava.
Ciononostante caricare un valore non a 8 bit in un registro a 8 bit potrebbe anche dare comportamenti diversi visto che comunque non si è in specifica e il compilatore potrebbe partire dal byte più significativo del numero da caricare.
Quanto a pagina 178 del testo C18 Step by Step, hai messo in evidenza un errore sul testo. Infatti i numeri scritti devono essere preceduti da 0b. A breve apporterò la correzione.
Saluti,
Mauro
Si prega Accedi o Crea un account a partecipare alla conversazione.
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.