MECCANICA e DINTORNI
http://meccanicaedintorni.morpel.it/phpbb/

Pimp my ratemeter ovvero svecchiamo il contatore geiger
http://meccanicaedintorni.morpel.it/phpbb/viewtopic.php?f=16&t=30395
Pagina 2 di 2

Autore:  McMax [ lun ott 24, 2022 07:31 ]
Oggetto del messaggio:  Re: Pimp my ratemeter ovvero svecchiamo il contatore geiger

Mauro: "Gli esempi proposti sul manuale dell'Atmel sembrano usare un assembler o codice simile"

non serve utilizzare l'assembler, da Arduino è possibile controllare direttamente i registri dei timer associando i valori che servono. A titolo di esempio, questa è la parte di codice che nel ELS si incarica di configurare il Timer1 in modalità PWM:

Codice:
void SetPWM()    //Sets the PWM and starts Timer1
{
  ICR1 = 65535;                        //(65535)set TOP at maximum value in order to get minumun frequency on the motor with prescaler clk/64
  OCR1A = 3;                           // Set OCR1A register to 3 which means that the CLEAR of the OC1A pin is done after 3 timer1 ticks.
                                       // means 12us with clk/64 prescaler
  TCCR1A = _BV(COM1A1) | _BV(WGM11);   //OC1A (pin 9) set for PWM with SET at BOTTOM and CLEAR at MATCH (non-inverted mode)
  TCCR1B = _BV(WGM13) | _BV(WGM12);    //WGM set for Fast PWM with ICR1 used as TOP value

}



Cioè, in pratica, sul datasheet devi capire come impostare i registri del timer in base alla configurazione che vuoi implementare e poi assegni i valori ai registri semplicemente come fatto qui sopra nel codice.

Autore:  billielliot [ lun nov 07, 2022 11:43 ]
Oggetto del messaggio:  Re: Pimp my ratemeter ovvero svecchiamo il contatore geiger

Ciao,

sono a chiedere lumi.

Consultando il manuale dell'Atmel328 e l'application note AVR130: Setup and Use of AVR Timers* e' emerso quanto segue:

The 16-bit timer1 is a synchronous timer. This means that it is clocked:
- by the system clock;
- by a prescaled system clock;
- by an external clock which is synchronized with the system clock.

Il timer a a 16 bit è un timer sincrono. Ciò significa che è sincronizzato:
- al clock di sistema;
- a un segnale sottomultiplo del clock di sistema;
- segnale esterno sincronizzato con il clock di sistema.

Questo significa che il quarzo riscaldato dovra' essere usato anche per dare il clock al processore?

Grazie :-)

Mauro

* pagina 12, sezione 4.2, Example 2: Timer 1 Input Capture Interrupt

Autore:  Davide Resca [ mer nov 09, 2022 01:09 ]
Oggetto del messaggio:  Re: Pimp my ratemeter ovvero svecchiamo il contatore geiger

Penso proprio di si , se hai necessità della massima precisione possibile tutto dipende dagli impulsi che fornisce il quarzo e per renderlo il più stabile possibile conviene farlo lavorare ad una temperatura che sia il più lontano possibile dalle varie fluttuazioni della temperatura ambiente.
Però nel tuo caso non saprei di preciso ... ci vorrebbe uno pratico ... McMax dove diavolo sei plasticaro maledetto ? :risatina:

Autore:  McMax [ dom nov 13, 2022 10:40 ]
Oggetto del messaggio:  Re: Pimp my ratemeter ovvero svecchiamo il contatore geiger

Scusate ragazzi ultimamente sono abbastanza incasinato.
Il Timer1, come qualsiasi altro timer, può ricevere un clock dall'esterno indipendente da quello del Micro. L'oscillatore riscaldato si può usare come ingresso a parte per il timer1.

Sul datasheet del Atmega328P sezione 15 da pagina 89.

Autore:  McMax [ dom nov 13, 2022 20:20 ]
Oggetto del messaggio:  Re: Pimp my ratemeter ovvero svecchiamo il contatore geiger

Mauro, mi sono andato a leggere per scrupolo l'applicazione note a cui ti riferisci. Credo che la definizione "sincrono al System Clock" si riferisca al fatto che il clock esterno venga letto in modo sincrono al Clock di sistema, ovvero che l'incremento dei registri del timer avvenga, come è ovvio pensare, in sincrono con il Clock di sistema. Di fatto la fase del Clock in ingresso viene persa ma per la tua applicazione non te ne frega nulla. Bisogna capire quant'è la massima frequenza ammessa, anche se, come detto, credo tu debba prevedere un divisore esterno per presentare un Clock nell'ordine del centinaio di kilohertz che basta e avanza a fare quello che vuoi tu con un'ottima precisone.

Questo lo schema del timer:
Allegato:
Schermata 2022-11-13 alle 20.19.00.png


L'ingresso del clock è quello indicato con "Tn", nel caso specifico "T1" visto che il timer in questione è il Timer1. Il pin è in comune con "PD5"

Autore:  billielliot [ mar nov 15, 2022 09:11 ]
Oggetto del messaggio:  Re: Pimp my ratemeter ovvero svecchiamo il contatore geiger

Grazie a entrambi per le risposte e il tempo dedicato.

Tralascio per adesso le questioni relative all'uso di un clock di sistema esterno.
Terro' buono il clock interno dell'Arduino che e' preimpostato a 16Mhz.

Provo a imbastire il programma.
Se non e' un problema lo traccio passo passo, cominciando dalla struttura base di uno sketch di Arduino che è basata principalmente sulla definizione di due funzioni:

Codice:
void setup();

void loop();



La parte di codice contenuta in Void setup(); verra' letta una sola volta all'accensione del microprocessore e serve a impostare le funzioni del microprocessore e l'ambiente di lavoro.
Void loop(); contiene il programma che vogliamo venga eseguito in continuazione dal microprocessore.
Il programma verra' eseguito fino allo spegnimento del micro.

Piccolo passo per un uomo....

Ciao :-)

Mauro

Autore:  billielliot [ mar nov 15, 2022 09:16 ]
Oggetto del messaggio:  Re: Pimp my ratemeter ovvero svecchiamo il contatore geiger

La periferica chiamata contatore 1 puo' eseguire diverse funzioni.
Per la mia applicazione devo scegliere la funzione conteggio di impulsi esterni.
Il microprocessore capisce solo un linguaggio composto da livelli logici zero e uno.
Per spiegare al microprocessore quale funzione voglio usare del contatore 1, scrivo nel void setup(); i comandi opportuni.
Nello specifico devo impostare a livello logico uno i bit 1 e 2 nel Timer/Counter1 Control Register B (abbreviato in TCCR1B)

Codice:
void setup();
/* Timer clock = imposto counter1 per conteggio di impulsi esterni presenti sul digital pin 5 dell'Arduino (T1)# */
TCCR1B = (1<<CS12)|(1<<CS11);

void loop():


/* #Pin fisico sull'Atmel328P Dual in line = 11 (Arduino Uno); Pin fisico sull'Atmel328P TQFP = 9 (Arduino NANO) */


Tutto questo e' documentato:
nel datasheet del micro ATmega328P sezione 15.11.2 pagina 110;
nell'Application note Atmel AVR130: Setup and Use of AVR Timers tabella 3-1 pagina 8.

Ciao :-)

Mauro

Pagina 2 di 2 Tutti gli orari sono UTC +1 ora
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
http://www.phpbb.com/