home | area personale         schemi | tutorial | robotica | pic micro | recensioni         forum | chat irc         faq | contatti         store | Ordina PCB
username
password
cerca

 
FORUM: Pic Micro
Tutto quanto riguarda questi microprocessori... progetti, suggerimenti, aiuti, discussioni...ecc


TIMER1 e MikroC - numeri decimali e numeri binari
     
Autore Messaggio opzioni
mpeino





postato il:
08.12.2025, alle ore 20:13
TIMER1 e MikroC - numeri decimali e numeri binari 

Buonasera
Utilizzando il linguaggio c e mikroc possiamo lavorare con i numeri decimali.
Il mio problema nasce nel momento in cui voglio caricare un numero decimale nei registri del TIMER1 :
TMR1H
TMR1L.
Qualcuno potrebbe dirmi che basterebbe convertire il numero decimale in un numero binario.
Ok .... ma in fase di programmazione come si fa???
Grazie.
Massimo.
lucio2





postato il:
11.12.2025, alle ore 01:53
Se ho capito bene la domanda, ad esempio con TMR1L,H a 8 bit e 'int' a 16 bit.
un modo potrebbe essere:
int Timer_Val = 1000;
TMR1H = (unsigned char) (0xFF & (Timer_Val >> 8));
TMR1L = (unsigned char) (0xFF & (Timer_Val ));
lucio2





postato il:
15.12.2025, alle ore 09:06
Per chi e' piu' principiante di me aggiungo delle precisazioni. Sperando che siano corrette...
Per i valori delle 'costanti' il compilatore 'C' fa automaticamente una conversione in base a cosa c'e' 'davanti' al numero. Ad esempio, 0x...=esadecimale, 0b...=binario, numero senza davanti uno zero=decimale, numero con davanti uno zero=ottale, ...
Le 'variabili' il compilatore le tratta a seconda come sono state definite:
int, unsigned int, float, double, etc... ci sono molti tipi.
Per cui a riguardo della domanda sulla scrittura nei registri TMR1L,TMR1H il codice deve solo 'spezzare' il valore del timer nella parte alta e parte bassa; utilizzando degli shift, come nel commento precedente; oppure per chi e' piu' softwarista definendo opportune strutture, union, etc... e poi sara' il compilatore a generare le operazioni logiche necessarie (shift, and, ...)
harpefalcata





postato il:
07.01.2026, alle ore 15:06
Non sò se hai già risolto, io comunque faccio le mie considerazioni.
Ipotizzando che il controller abbia ad esempio un quarzo a 20 MHz, allora potrò ipotizzare che ogni tick del quarzo durerà: 1 / (20*10^6) = 50 nano secondi (ns). Se non ricordo male, il PIC eseguirà un'istruzione ogni quattro cicli di clock: read, fetch, decode, execute. Questo significa che un'istruzione durerà 50 nS * 4 = 200 ns = 0.2 ms (milli secondi).
Ipotizzo ora che tu voglia usare un timer a sedici bit, perché, da quello che scrivi, hai due registri ad otto bit l'uno. Ipotizzo anche che tu decida, in maniera completamente arbitraria, di impostare il prescaler a 4.
A questo punto, ipotizziamo che tu voglia configurare il timer in modo da far generare un evento di interrupt ogni, ad esempio, venti milli secondi, per far lampeggiare un led.
Se il timer è a sedici bit, allora, potrà contare fino a 2^16 = 65.536 iterazioni, che corrisponderanno a: 0.2 milli secondi * 65.536 (iterazioni) * 4 (prescaler) = 52.4 secondi. Quindi il fondoscala del tuo timer, con queste impostazioni è poco meno di un minuto: (52.4 secondi).
Noi vogliamo un overflow ogni 20 milli secondi, quindi:
20 milli secondi / (0.2 millisecondi * 4) = 20 milli secondi / 0.8 millisecondi = 25 iterazioni
Ipotizzando che calcoli ed unità di misura siano corretti, sui quali mi riservo il beneficio del dubbio, a questo punto la domanda è: Come posso impostare il timer in modo che vada in overflow, dopo 25 iterazioni?
Facile, io sò che il timer che hai scelto è a sedici bit, cioè, come detto poco sopra: 2^16 = 65.536 iterazioni. Qui, sottrarrò le mie 25 iterazioni richieste per l'overflow: 65.536 - 25 = 65511 .
Convertirò quest'ultimo in esadecimale: 65.511 = 0x0FFE7.
A questo punto sò, come devo configurare i due registri:
TMR1H = 0x0FF e TMR1L = 0x0E7
Convertito in codice, dovrebbe essere qualcosa del genere:
 BANKSEL TMR1H
MOVLW 0x0FF
MOVWF TMR1H

BANKSEL TMR!L
MOVLW 0x0E7
MOVWF TMR1L



Il tempo è il miglior maestro, purtroppo uccide tutti i suoi allievi
segui questo thread con grixFC, per questa funzione devi aver installato il software grixFC

torna su
     

Come utente anonimo puoi leggere il contenuto di questo forum ma per aprire una discussione
o per partecipare ad una discussione esistente devi essere registrato ed accedere al sito




 







 
 
indietro | homepage | torna su copyright © 2004/2026 GRIX.IT - La community dell'elettronica Amatoriale