leo72:
Nel datasheet ci sono tutte le info sui vari registri, che sono poi quelli che ho usato per manipolare i timer nella swRTC. Ovviamente devi leggerti un bel po' di volte quelle pagine prima di capirci qualcosa...
TIMER2_OVF_vect non lo trovi, è un nome dell'IDE di Arduino, ma trovi la tabella dei vettori degli interrupt (vect), cercando TIMER2_OVF mi pare. Cmq è tutto nella sezione relativa agli interrupt.
Lo si trova ma senza l'underscore.
Comunque darò una bella lettura a tutta la sezione degli interrupt e dei timer! Grazie ancora! Sei stato davvero gentile!
Etti:
Ho trovato le funzioni....errore del browser
A cosa ti riferisci?
Comunque leo potresti spiegarmi perchè hai creato due file per l'swRTC, uno ".cpp" ed uno ".h".
Quando uso la tua libreria che file devo includere nello sketch?
Essendo una libreria, c'è il file header (.h) ed il file del codice (.cpp).
Il file header specifica al compilatore come trattare le funzioni della libreria, indica cioè quali funzioni sono visibili e dove, i parametri ecc...
Devi includere il file .h, come in tutte le librerie.
Sto cominciando dagli interrupt hardware che forse è meglio per cominciare a gestire i registri.
Voglio realizzare un interrupt su un pin che con l'evento falling mi fa il toggle di un led.
Ho capito che ci sono tre interrupt harware, PCINT0, PCINT1 e PCINT2.
Come faccio a stabilire quale voglio usare per l'interrupt su un piedino?
Invece per l'evento faling ho capito che bisogna andare a modificare i bit ISC11 e ISC10 (per il PCINT1) e ISC01 e ISC00 (per il PCINT0), (e per il PCINT2?)
Correggimi se sbaglio qualcosa.
Dopo ciò cosa devo fare?
PCINTx è diverso da INTx
Gli interrupt INTx sono legati a 6 specifici piedini e non puoi cambiarli. GLi interrupt di cambio di stato PCINTx sono 3 ed ognuno gestisce 8 piedini (1 registro da 1 byte = 8 bit = 8 piedini).
Per attivare un interrupt, attivi il relativo bit nella maschera e poi usi ISCx0 e ISCx1 per stabilire il tipo di evento.
Il PCINT2 mi pare sia particolare perché non puoi stabilire il tipo di evento, se non ricordo male infatti non ci sono i flag ISCx0 e ISCx1 (come hai notato tu), ma sto andando a memoria. Non ricordo bene. Dovrei rileggere il datasheet.
Allora, intanto ho una domanda.
I bis ISCx0 e ISCx1 sono bit del registro EICRA, giusto?
Come faccio a modificarli?
A scuola, in assembly per modificare il bit di un registro si mettere nomeregistro.nomebit = valore.
Dunque dovrei fare EICRA.ISCxx = 0b0;
Oppure basta semplicemente il nome del bit?
ISCxx = 0b0;
Altra domanda, a cosa servono le librerie WHprogram.h e Intterrupt.h?
Procedendo per abilitare gli interrupt hardware la prima cosa da fare è stabilire se voglio utilizzare un PCINTx oppure un INTx. Nel datasheet dove noto le differenze?
Mettendo caso io voglia utilizzare gli interrupt PCINTx la prima cosa da fare è stabilire l'evento configurando i bit ISCx0 e ISCx1 giusto?
Arrivato a questo punto come procedo?
Seguendo il datasheet dovrei configurare il registro EIMSK - External IOnterrupt Mask Register e poi il registro EIFR - External Intterupt Flag Register.
A cosa servono questi registri?
(Insomma mi servirebbe capire a cosa servono tutti i registri degli interrupt ma prima ancora sapere se è necessario conoscerli tutti)
lesto:
tu non npuoi modificare direttamente un bit, ma solo il registro intero.
Mica è vero, in assembly c'è sbi e cbi che permettono di settare/azzerare a piacere i singoli bit di un qualunque registro, le puoi usare direttamente anche in C.
Imposta ad 1 il flag SCxx e poi fa una somma logica (OR) con il contenuto del registro EICRA. In questo modo alteri SOLO il flag lasciando inalterato tutto il resto del registro. Si fa sempre così piuttusto che dire EICRA= 0bxxxxx dando un valore fisso perché ogni registro ha diversi flag che controllano diverse cose: assegnando un valore preimpostato potresti alterare anche altre funzioni.
ma questo no: EICRA &= ~(1<<SCxx);
A cosa serve il carattere "~"?
"~" significa di fare l'opposto, NOT. Quindi imposti a 0 il flag. E poi fai l'AND logico così sei sicuro che il flag assumerà per forza lo stato 0 dato che qualunque valore esso abbia con "AND 0" assumerà sempre lo stato 0.
P.S.
E' un errore tuo (leo) che hai messo SCxx oppure non c'entra nulla con ISCxx?
E' un nome a caso. Potevo scrivere 00 come 01 al posto di xx.
Dai, ora impegnati e leggi il datasheet: altrimenti vengo a casa tua (con fattura!) e ti faccio un po' di lezioni private
A parte gli scherzi, quello che ti sto dicendo è tutto scritto lì.
P.S.
E' un errore tuo (leo) che hai messo SCxx oppure non c'entra nulla con ISCxx?
E' un nome a caso. Potevo scrivere 00 come 01 al posto di xx.
Dai, ora impegnati e leggi il datasheet: altrimenti vengo a casa tua (con fattura!) e ti faccio un po' di lezioni private
A parte gli scherzi, quello che ti sto dicendo è tutto scritto lì.