// BUS teller voor Attiny 85 V1.0 // By P. de Heij 2015#include <SoftwareSerial.h>#define StartTimer TCCR1 = 0B10001111 // Zet prescaller, teller gaat nu lopen#define StopTimer TCCR1 = 0B10000000 // Zet prescaller op 0 teller stopt#define TX 3 // Zend pin voor bus#define RX 4 // Ontvang pin voor bus#define DataDir 1 // Sturing pin om MAX485 in zend of ontvangst mode te zettenSoftwareSerial RS485(TX,RX); // Attiny 85 heeft geen Uart dus deze lib nodig voor serieel data verkeerint Teller = 0;int Bus = 0;void setup(){ pinMode(DataDir, OUTPUT); RS485.begin(9600); // Omdat Attiny registers afwijken van de in de UNO gebruikte 328 kan ik geen standaard lib gebruiken // dus moet interrupt en timer registers zelf goed zettenA // Setting Timer Interrupt TCCR1 = 0; TCNT1 = 0; GTCCR = _BV(PSR1); OCR1A=243; OCR1C=243; TIMSK =(1<<OCIE1A); // Setting External Interrupt MCUCR |= (1 << ISC01)|(1 << ISC00); GIMSK |= (1 << INT0); sei(); }void loop(){ // Als de Bus variabelen iets bevat zet dit getal op de RS485 bus if (Bus > 0 ){ SendBus(Bus); Bus=0; } }// Als er iets wordt waargenomen op pootje int0(PB2) roept de controller deze interrupt routine aanISR(INT0_vect){ if (Teller == 0){ StartTimer;} // Start de timer Teller++;}// Als timer register OCR1A en OCR1C gelijk zijn aan elkaar roept de controller deze interrupt routine aanISR(TIMER1_COMPA_vect){ StopTimer; //Stop de timer Bus = Teller; // Aantal getelde pulsen binnen de timer tijd worden in Bus gezet Teller = 0; }// Routine om juiste datastring de bus op te sturenvoid SendBus(int BusNummer){ digitalWrite(DataDir,HIGH); RS485.print("#1TB"); RS485.println(Bus); digitalWrite(DataDir,LOW);}