Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <avr/sleep.h> // Sleep Modes
- #include <avr/power.h> // Power management
- #include <avr/wdt.h> // Watchdog timer
- #include <Wire.h>
- #include <CodeLibrary.h>
- volatile unsigned int nbOfBlinks;
- unsigned int nbOfBlinksToBeSent = -1;
- bool dataRequested = false;
- CodeLibrary codeLibrary;
- byte i2cAddress = 47;
- byte CMD_ACKMESSAGE = 44;
- /*
- Pin change interrupts.
- Pin Mask / Flag / Enable
- D0 PCINT16 (PCMSK2 / PCIF2 / PCIE2)
- D1 PCINT17 (PCMSK2 / PCIF2 / PCIE2)
- D2 PCINT18 (PCMSK2 / PCIF2 / PCIE2)
- D3 PCINT19 (PCMSK2 / PCIF2 / PCIE2)
- D4 PCINT20 (PCMSK2 / PCIF2 / PCIE2)
- D5 PCINT21 (PCMSK2 / PCIF2 / PCIE2)
- D6 PCINT22 (PCMSK2 / PCIF2 / PCIE2)
- D7 PCINT23 (PCMSK2 / PCIF2 / PCIE2)
- D8 PCINT0 (PCMSK0 / PCIF0 / PCIE0)
- D9 PCINT1 (PCMSK0 / PCIF0 / PCIE0)
- D10 PCINT2 (PCMSK0 / PCIF0 / PCIE0)
- D11 PCINT3 (PCMSK0 / PCIF0 / PCIE0)
- D12 PCINT4 (PCMSK0 / PCIF0 / PCIE0)
- D13 PCINT5 (PCMSK0 / PCIF0 / PCIE0)
- A0 PCINT8 (PCMSK1 / PCIF1 / PCIE1)
- A1 PCINT9 (PCMSK1 / PCIF1 / PCIE1)
- A2 PCINT10 (PCMSK1 / PCIF1 / PCIE1)
- A3 PCINT11 (PCMSK1 / PCIF1 / PCIE1)
- A4 PCINT12 (PCMSK1 / PCIF1 / PCIE1)
- A5 PCINT13 (PCMSK1 / PCIF1 / PCIE1)
- */
- void setup() {
- Serial.begin(115200);
- Serial.println("Setup.");
- // Read-led change interrupt
- pinMode(8, INPUT);
- PCMSK0 = 0;
- PCMSK0 |= bit(PCINT0); // D8
- PCIFR |= bit(PCIF0); // clear any outstanding interrupts
- PCICR |= bit(PCIE0); // enable pin change interrupts for D0 to D7
- Wire.begin(i2cAddress);
- Wire.onRequest(requestEvent);
- Wire.onReceive(receiveEvent);
- Serial.println("Done Setup.");
- delay(10);
- }
- // Called by interrupt service (master) routine when data is to be recieved
- void receiveEvent(int howMany) {
- byte cmd = Wire.read();
- if (cmd == CMD_ACKMESSAGE) {
- nbOfBlinksToBeSent = -1;
- //nbOfBlinks = 0;
- }
- }
- // Called by interrupt service (master) routine when response is wanted
- void requestEvent() {
- if (-1 == nbOfBlinksToBeSent) {
- nbOfBlinksToBeSent = nbOfBlinks;
- }
- byte buffer[] = { i2cAddress, nbOfBlinksToBeSent >> 8, nbOfBlinksToBeSent, 0 };
- buffer[3] = codeLibrary.crc8(buffer, sizeof(buffer) - 1);
- Wire.write(buffer, sizeof(buffer));
- }
- // Handle pin change interrupt for D8
- ISR(PCINT0_vect) {
- // if (digit alRead(8) == HIGH) {
- nbOfBlinks++;
- // }
- //Serial.println("PCINT0_vect"); //Serial is disabled in registers when this event occurrs
- }
- void waitForExternalWakeup() {
- //byte old_ADCSRA = ADCSRA;
- // disable ADC
- ADCSRA = 0;
- // Set sleep mode and disable those services we don't want
- set_sleep_mode(SLEEP_MODE_PWR_DOWN);
- noInterrupts();
- //power_all_disable();
- power_adc_disable();
- power_spi_disable();
- power_usart0_disable();
- power_timer0_disable();
- power_timer1_disable();
- power_timer2_disable();
- // Let TWI (i2c) be enabled
- //power_twi_disable();
- // Go sleep
- sleep_enable();
- interrupts();
- sleep_cpu();
- // ----------------
- // Wake up again
- sleep_disable();
- power_all_enable();
- //ADCSRA = old_ADCSRA;
- // release TWI bus
- TWCR = bit(TWEN) | bit(TWIE) | bit(TWEA) | bit(TWINT);
- // turn it back on again
- Wire.begin(i2cAddress);
- }
- void loop() {
- while (true) {
- waitForExternalWakeup();
- Serial.print(String(millis()) + " Woke up. ");Serial.println(nbOfBlinks);
- delay(10);
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement