Advertisement
Guest User

Untitled

a guest
Jan 22nd, 2020
130
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.85 KB | None | 0 0
  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. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement