Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /*
- * PER ATTINY85
- *
- *
- * 22/01/2020
- */
- #include <TinyWire.h>
- #include "twi.h"
- byte own_address = 0x69; //Stabilisco l'indirizzo ( si potrebbe scrivere anche come 0x10)
- volatile byte rpmcount = 0;
- uint16_t rpm = 0;
- unsigned long timeold = 0;
- unsigned long timecheck = 0;
- unsigned long timenew = 0;
- uint8_t buffer[2]={0,0};
- bool join=false;
- void setup() {
- TinyWire.begin(own_address);//Inizializzo il bus dell'attiny
- TinyWire.onRequest( onI2CRequest );//Decido cosa richiamare quando c'è una richiesta
- cli(); //Blocco gli interrupt
- pinMode(1,INPUT_PULLUP); //Pulsante o sensore che genera interrupt
- pinMode(3,OUTPUT);
- pinMode(4,OUTPUT);//Led controllo
- GIMSK = (1 << PCIE); //Abilito il pin change
- PCMSK = (1 << PCINT1); //Imposto il PIN1 digitale (pin6 fisico) come pinchange
- sei();//Abilito interrupt e quindi anche comunicazione
- }
- void loop()
- {
- //Update RPM every second
- // delay(100);
- //Don't process interrupts during calculations
- //Note that this would be 60*1000/(millis() - timeold)*rpmcount if the interrupt
- //happened once per revolution instead of twice. Other multiples could be used
- //for multi-bladed propellers or fans
- if(join){
- cli();// sezione critica
- timenew = micros(); //aggiornamento tempo con i microsecondi
- sei();//fine sezione criticaa
- timecheck=timeold; //timecheck serve al controllo la inizializzo con il vecchio tempo affinchè possa controllare nel nuovo ciclo
- rpm = (30*1000000)/(timenew - timeold)*8; //calcolo rpm (dato che stiamo utilizzando micros() che è 10^-6 devo moltiplicare per 1M
- // rpmcount = 0; //porto il conteggio degli isr a 0
- timeold = timenew; //prendo il vecchio tempo e lo inizializzo a nuovotempo
- join=false;//permetto di uscire dall'if
- //delay(300);
- digitalWrite(3,LOW);//led di controllo
- if(rpm>=255){//controllo bus i2c per split rpm
- digitalWrite(4,HIGH);//led di controllo i2c
- }
- }
- if(timecheck+1000000 < micros()){//controllo bloccaggio ruota o errore sensore
- rpm=0;//se dovesse verificarsi io non ho giri
- }
- }
- ISR(PCINT0_vect){//Interrupt Service Routine
- rpmcount++;//inizio conteggio isr
- if(rpmcount == 8){//8 = doppio denti pignone
- rpmcount = 0; //conteggio isr = 0
- digitalWrite(3,HIGH);//Accendo il led di controllo
- digitalWrite(4,LOW);//spengo led i2c
- join=true;//abilito ingresso nell'if
- }
- }
- void onI2CRequest() {//Request Routine
- split(rpm, buffer);//richiamo la funzione per fare split
- TinyWire.send(buffer[0]);//Invio il valore del nostro conteggio
- TinyWire.send(buffer[1]);
- }
- void split(uint16_t full, uint8_t * buffer){
- //riempie il buffer con due elementi da 8bit
- buffer[0]=full>>8;//byte superiore
- buffer[1]=full & 0x00FF;//byte inferiore
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement