Registri di sistema

ciao
qualcuno sa come accedere ai registri di sistema dell' atmega328 e utilizzare il segnale di clock di uno dei timer per fare incrementare delle variabili?

Vorrei appunto utilizzare il segnale di clock per fare incrementare delle variabili che voglio usare per per creare un cronometro digitale con dei display a 7 segmenti!!

Grazie

Chiedi a Leo72, in questo campo è un espertissimo :grin: --> http://www.leonardomiliani.com/
Puoi studiarti i codici delle sue librerie per iniziare.

Ah ah ah, dai non prendermi in giro :sweat_smile:

Comunque se ti scarichi le mie librerie swRTC e leOS vedi come si manipolano i timer.
Se ti serve poi solo un cronometro, potresti semplicemente usare il leOS e fartelo, con risoluzione di 1 ms. Giorni fa ho proprio realizzato un RTC software usando il leOS con risoluzione di 1s (essendo un orologio), ma tu puoi aggiungere anche la variabile millisecondi e farla aggiornare in automatico ogni 1 ms.
http://www.leonardomiliani.com/?p=561

Grazie per le risposte,

quello che mi piacerebbe però, è essere in grado di modificare e accedere io stesso direttamente a queste cose per creare io stesso librerie od hoc per quello che devo fare; comunque darò sicuramente un'occhiata alle librerie di Leo per prendere spunto.

Grazie

zinim:
Grazie per le risposte,

quello che mi piacerebbe però, è essere in grado di modificare e accedere io stesso direttamente a queste cose per creare io stesso librerie od hoc per quello che devo fare; comunque darò sicuramente un'occhiata alle librerie di Leo per prendere spunto.

Grazie

Non ti ho infatti detto: "scarica e copia", ti ho detto "scarica e vedi" :wink:
Intanto ti devi armare di datasheet, lì ci sono riportati tutti i registri relativi ai timer e come impostarli.
Una volta che hai queste cose, guardi ai settaggi che ti servono per regolare una certa cosa e ti muovi di conseguenza.
Ad esempio, se vuoi usare un timer come semplice contatore, lo attiverai in modalità CTR, se invece vuoi generare un segnale su un pin dovrai scegliere la modalità: Fast PWM, Phase Correct PWM, Phase and Frequency Correct PWM ecc..
Dopo dovrai stabilire prescaler, valore iniziale del contatore, eventuale valore per registro OCRxA/B, che tipo di interrupt generare ecc...

Per incrementare una variabile, attivi il timer in modalità contatore (così non altera i segnali sui pin esterni), poi imposti il prescaler in base alla frequenza con cui vuoi che la tua variabile sia aggiornata, e poi attacchi una routine ISR per fare materialmente il lavoro di incremento.

Ti estraggo il codice relativo alla manipolazione del timer 2 del leOS per un Atmega328 che imposta il timer in modo che generi 1 overflow ogni millisecondo:

//halt all the interrupts
SREG &= ~(1<<SREG_I);
//during setup, disable all the interrupts based on timer
TIMSK2 &= ~((1<<TOIE2) | (1<<OCIE2A) | (1<<OCIE2B));
//prescaler source clock set to internal Atmega clock (asynch mode)
ASSR &= ~(1<<AS2);
//this sets the timer to increment the counter until overflow
TCCR2A &= ~((1<<WGM21) | (1<<WGM20)); 
TCCR2B &= ~(1<<WGM22);
//prescaler set to /64
TCCR2B |= (1<<CS22);
TCCR2B &= ~((1<<CS21) | (1<<CS20));
prescaler = 64.0;
//set the initial value of the counter depending on the prescaler
_starter = 256 - (int)((float)F_CPU * 0.001 / prescaler); //for 16 MHz: 6
TCNT2 = _starter;
TIMSK2 |= (1<<TOIE2);

E poi crei la ISR per gestire l'interrupt:

ISR(TIMER2_OVF_vect) {
  TCNT2 = _starter;
  .....
}

Qui ci sono tante cose che magari puoi non capire ma i commenti sono esplicativi.
Devi però (ripeto: "DEVI") lavorare col datasheet alla mano altrimenti non vai da nessuna parte, non puoi ricordarti tutti i registri a mente :stuck_out_tongue_closed_eyes:

PS:
l'ultima formula che vedi serve per ottenere un incremento preciso al millisecondo. Diversamente, l'incremento del contatore sarebbe stato leggermente più lento perché avrebbe eseguito 256 overflow ogni millisecondo invece di 250.
La formula per ottenere la frequenza di aggiornamento è:
Freq/Prescaler/(max_valore_registro)
Ora, avendo Freq = 16 MHz, Prescaler = 64 e max_valore_registro = 256 (dato che è il timer 2 è ad 8 bit), si avrebbe
16000000/64/256=976,5625 Hz

Ma così ho 976 overflow ogni millisecondo.
Se risolvo solo la prima divisione della formula precedente ottengo:
16000000/64=250000
Capisci che per ottenere 1000 overflow al secondo devo avere un contatore che abbia un valore massimo di:
250000/1000=250
Questo lo si ottiene semplicemente mettendo come valore di partenza del contatore (256-250)=6.

Ok
innanzitutto ti ringrazio per la spiegazione che mi hai fornito, che mi sarà sicuramente molto utile; Volevo inoltre chiederti se conosci una guida, un libro o qualcosa, che spieghi in dettaglio tutte queste procedure necessarie per molte operazioni con questo microcontrollore ma che fin adesso non ho trovato spiegate su nessun libro o guida di arduino, essendo il linguaggio usato dall'IDE di arduino molto semplificato per una facile comprensione.

Grazie

Il datasheet!! --> http://www.atmel.com/Images/doc8271.pdf

Hai già visto Arduino Reference - Arduino Reference ? Anche qui AVR Tutorials | HeKilledMyWire c'è diverso materiale.

I link che mia avete riportato sono molto interessanti, e spiegano parecchie cose; quello che cercavo io però era un qualcosa di completo, ovvero che tratta l'argomento n tutte le sue parti, sia teoriche che pratiche. comunque per il momento quei link mi potranno essere molto utili!

Grazie

Esistono diversi libri ma partono dal presupposto che sai già qualcosa di architettura dei processori, come sei messo con l'argomento?

Diciamo che una buona parte di concetti la conosco anche se non nel dettaglio perchè non ho ancora affrontato a scuola lo studio dei microcontrollori; comunque credo di cavarmela abbastanza decentemente.
Cosa mi consigli?

Grazie

Ti do alcuni titoli:
-Atmel AVR Microcontroller Primer
-Programming and Customizing the AVR Microcontroller
-Robotics with AVR

La fonte principale è il datasheet ma prima ti consiglio di leggere qualcuno di questi libri, sopratutto utilizza AVR Studio

Ciao

flz47655:
sopratutto utilizza AVR Studio

Sarebbe giusto specificare che questo programma esiste solo per Windows.

leo72:
Sarebbe giusto specificare che questo programma esiste solo per Windows.

Vero, però vale per la maggior parte del software ad uso tecnico, sono pochi quelli che realizzano versioni native per Linux e ancora meno per MAC.
AvrStudio 4 (solo AVR a 8 bit), non vale per le versioni superiori, gira senza problemi sotto Wine, però non è possibile utilizzare direttamente i programmatori hardware Atmel per via dei driver USB, per programmare tocca passare per Avrdude, basta uno script che si può invocare direttamente da AvrStudio, che supporta quasi tutti i programmatori AVR.

Per scelta ho smesso di usare WINE da molto tempo (se volevo usare software per Windows, continuavo a tenermi Windows). Comunque AvrStudio non è indispensabile per scrivere uno sketch che usa i timer. Basta un editor, se si sa cosa fare :wink:

Ad esempio le mie librerie io le ho scritte usando un semplice editor multilinguaggio, Geany (per capirsi, equivale a Notepad++ su Windows).

A scopo didattico con AVR Studio puoi simulare il programma e vedere come cambiano i registri, lo trovo molto utile.
Certo il programma ha dei requisiti minimi che bisogna avere, se non ha Windows deve procurarselo.

Ciao

Sapete indicarmi dove poter scaricare le librerie AVR
avr/io.h
avr/interrupt.h
avr/pgmspace.h

Grazie

Sono header che fanno parte di avr-libc puoi utilizzarli senza problemi anche dall'IDE di Arduino con l'istruzione

#include <avr/io.h>

Ciao

Ok
ma dove le trovo queste librerie??

l'IDE le pesca da \arduino-1.0.1\hardware\tools\avr\avr\include\avr

Ciao