Pages: [1] 2   Go Down
Author Topic: Registri di sistema  (Read 2547 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Newbie
*
Karma: 1
Posts: 29
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Logged

Cagliari, Italy
Offline Offline
Tesla Member
***
Karma: 112
Posts: 7079
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Code fast. Code easy. Codebender --> http://codebender.cc/?referrer=PaoloP

Global Moderator
Italy
Offline Offline
Brattain Member
*****
Karma: 327
Posts: 22651
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Ah ah ah, dai non prendermi in giro  smiley-sweat

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
Logged


Offline Offline
Newbie
*
Karma: 1
Posts: 29
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

Global Moderator
Italy
Offline Offline
Brattain Member
*****
Karma: 327
Posts: 22651
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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"  smiley-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:

Code:
//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:
Code:
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  smiley-yell

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


Offline Offline
Newbie
*
Karma: 1
Posts: 29
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

Cagliari, Italy
Offline Offline
Tesla Member
***
Karma: 112
Posts: 7079
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Code fast. Code easy. Codebender --> http://codebender.cc/?referrer=PaoloP

Parma
Offline Offline
Edison Member
*
Karma: 21
Posts: 2385
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Hai già visto http://www.arduino.cc/en/Reference/PortManipulation ? Anche qui http://hekilledmywire.wordpress.com/category/avr/avr-tutorials/ c'è diverso materiale.
Logged

Offline Offline
Newbie
*
Karma: 1
Posts: 29
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

Parma
Offline Offline
Edison Member
*
Karma: 21
Posts: 2385
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Offline Offline
Newbie
*
Karma: 1
Posts: 29
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

Parma
Offline Offline
Edison Member
*
Karma: 21
Posts: 2385
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

Global Moderator
Italy
Offline Offline
Brattain Member
*****
Karma: 327
Posts: 22651
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

sopratutto utilizza AVR Studio
Sarebbe giusto specificare che questo programma esiste solo per Windows.
Logged


Rome (Italy)
Offline Offline
Tesla Member
***
Karma: 124
Posts: 9329
"Il Vero Programmatore ha imparato il C sul K&R, qualunque altro testo è inutile e deviante."
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Global Moderator
Italy
Offline Offline
Brattain Member
*****
Karma: 327
Posts: 22651
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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  smiley-wink

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


Pages: [1] 2   Go Up
Jump to: