SHARE
TWEET

Untitled

a guest Jan 22nd, 2020 58 Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. /*
  2.  *        PER ATTINY85
  3.  *
  4.  *
  5.  *        22/01/2020
  6.  */
  7.  
  8. #include <TinyWire.h>
  9. #include "twi.h"
  10. byte own_address = 0x69; //Stabilisco l'indirizzo ( si potrebbe scrivere anche come 0x10)
  11. volatile byte rpmcount = 0;
  12. uint16_t rpm = 0;
  13. unsigned long timeold = 0;
  14. unsigned long timecheck = 0;
  15. unsigned long timenew = 0;
  16. uint8_t buffer[2]={0,0};
  17. bool join=false;
  18. void setup() {
  19.   TinyWire.begin(own_address);//Inizializzo il bus dell'attiny
  20.   TinyWire.onRequest( onI2CRequest );//Decido cosa richiamare quando c'è una richiesta
  21.   cli();  //Blocco gli interrupt
  22.   pinMode(1,INPUT_PULLUP);  //Pulsante o sensore che genera interrupt
  23.   pinMode(3,OUTPUT);
  24.   pinMode(4,OUTPUT);//Led controllo
  25.   GIMSK = (1 << PCIE); //Abilito il pin change
  26.   PCMSK = (1 << PCINT1); //Imposto il PIN1 digitale (pin6 fisico) come pinchange
  27.   sei();//Abilito interrupt e quindi anche comunicazione
  28. }
  29. void loop()
  30.  {
  31.    //Update RPM every second
  32.    // delay(100);
  33.    //Don't process interrupts during calculations
  34.    //Note that this would be 60*1000/(millis() - timeold)*rpmcount if the interrupt
  35.    //happened once per revolution instead of twice. Other multiples could be used
  36.    //for multi-bladed propellers or fans
  37.    if(join){
  38.       cli();// sezione critica
  39.       timenew = micros(); //aggiornamento tempo con i microsecondi
  40.       sei();//fine sezione criticaa
  41.       timecheck=timeold;  //timecheck serve al controllo la inizializzo con il vecchio tempo affinchè possa controllare nel nuovo ciclo
  42.       rpm = (30*1000000)/(timenew - timeold)*8;   //calcolo rpm (dato che stiamo utilizzando micros() che è 10^-6 devo moltiplicare per 1M
  43.     //  rpmcount = 0; //porto il conteggio degli isr a 0
  44.       timeold = timenew;  //prendo il vecchio tempo e lo inizializzo a nuovotempo
  45.       join=false;//permetto di uscire dall'if
  46.       //delay(300);
  47.       digitalWrite(3,LOW);//led di controllo
  48.       if(rpm>=255){//controllo bus i2c per split rpm
  49.         digitalWrite(4,HIGH);//led di controllo i2c
  50.       }
  51.    }  
  52.    if(timecheck+1000000 < micros()){//controllo bloccaggio ruota o errore sensore
  53.       rpm=0;//se dovesse verificarsi io non ho giri
  54.    }
  55.   }
  56. ISR(PCINT0_vect){//Interrupt Service Routine
  57.  
  58.       rpmcount++;//inizio conteggio isr
  59.  
  60.       if(rpmcount == 8){//8 = doppio denti pignone
  61.         rpmcount = 0; //conteggio isr = 0
  62.         digitalWrite(3,HIGH);//Accendo il led di controllo
  63.         digitalWrite(4,LOW);//spengo led i2c
  64.         join=true;//abilito ingresso nell'if
  65.       }
  66. }
  67. void onI2CRequest() {//Request Routine
  68.   split(rpm, buffer);//richiamo la funzione per fare split
  69.   TinyWire.send(buffer[0]);//Invio il valore del nostro conteggio
  70.   TinyWire.send(buffer[1]);
  71. }
  72.  
  73. void split(uint16_t full, uint8_t * buffer){
  74.   //riempie il buffer con due elementi da 8bit
  75.   buffer[0]=full>>8;//byte superiore
  76.   buffer[1]=full & 0x00FF;//byte inferiore
  77. }
RAW Paste Data
We use cookies for various purposes including analytics. By continuing to use Pastebin, you agree to our use of cookies as described in the Cookies Policy. OK, I Understand
Top