Pimp my ratemeter ovvero svecchiamo il contatore geiger

Moderatore: Junior Admin

Avatar utente
McMax
CAPO OFFICINA
Messaggi: 9023
Iscritto il: dom gen 31, 2010 21:46
Località: Bussero (MI)

Re: Pimp my ratemeter ovvero svecchiamo il contatore geiger

Messaggio da McMax »

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: Seleziona tutto

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.
McMax

“None of us can change the things we’ve done. But we can all change what we do next.” – Fred Johnson

fulminato in tenera età
billielliot
FINALMENTE USO IL TORNIO
Messaggi: 417
Iscritto il: mer giu 20, 2012 12:55
Località: Trezzo sull'Adda

Re: Pimp my ratemeter ovvero svecchiamo il contatore geiger

Messaggio da billielliot »

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
Avatar utente
Davide Resca
CAPO OFFICINA
Messaggi: 13863
Iscritto il: lun feb 29, 2016 11:29
Località: Ustica & Dintorni saltuariamente Bologna o Pesaro
Contatta:

Re: Pimp my ratemeter ovvero svecchiamo il contatore geiger

Messaggio da Davide Resca »

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:
Gli errori sono per i principianti, noi esperti puntiamo al disastro !!!
Le conoscenze acquisite, sono proporzionali al DANNO PRODOTTO !!! ( esperienza personale...)
youtube



Immagine 2°socio TIRATOSAURO CLUB ITALIAN
Avatar utente
McMax
CAPO OFFICINA
Messaggi: 9023
Iscritto il: dom gen 31, 2010 21:46
Località: Bussero (MI)

Re: Pimp my ratemeter ovvero svecchiamo il contatore geiger

Messaggio da McMax »

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.
McMax

“None of us can change the things we’ve done. But we can all change what we do next.” – Fred Johnson

fulminato in tenera età
Avatar utente
McMax
CAPO OFFICINA
Messaggi: 9023
Iscritto il: dom gen 31, 2010 21:46
Località: Bussero (MI)

Re: Pimp my ratemeter ovvero svecchiamo il contatore geiger

Messaggio da McMax »

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:
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"
Non hai i permessi necessari per visualizzare i file allegati in questo messaggio.
McMax

“None of us can change the things we’ve done. But we can all change what we do next.” – Fred Johnson

fulminato in tenera età
billielliot
FINALMENTE USO IL TORNIO
Messaggi: 417
Iscritto il: mer giu 20, 2012 12:55
Località: Trezzo sull'Adda

Re: Pimp my ratemeter ovvero svecchiamo il contatore geiger

Messaggio da billielliot »

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: Seleziona tutto

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
billielliot
FINALMENTE USO IL TORNIO
Messaggi: 417
Iscritto il: mer giu 20, 2012 12:55
Località: Trezzo sull'Adda

Re: Pimp my ratemeter ovvero svecchiamo il contatore geiger

Messaggio da billielliot »

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: Seleziona tutto

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
Rispondi

Torna a “Elettronica ed elettrotecnica”