Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- // Remote Controller fot __AVR_ATtiny85__
- // Alexander Grigoriev 2018
- // Made by GAVS for LEON
- /*
- [x] CKDIV8 = 0
- [x] SUT0 = 0
- [x] CKSEL3 = 0
- [x] CKSEL2 = 0
- [x] CKSEL0 = 0
- [x] SPIEN = 0 CALIBR
- */
- #include "Arduino.h"
- #include <key_header.h>
- #include <avr/io.h>
- #include <avr/interrupt.h>
- #include <util/delay.h>
- #include <avr/sleep.h>
- #include <compat/deprecated.h>
- #include <avr/eeprom.h>
- #define DEBUG 0
- //datasheet attiny 85
- // http : //ww1.microchip.com/downloads/en/DeviceDoc/Atmel-2586-AVR-8-bit-Microcontroller-ATtiny25-ATtiny45-ATtiny85_Datasheet-Summary.pdf
- // pin1, PB5 (PCINT5 / RESET / ADC0 / dW) // pin8, VCC
- // pin2, PB3 (PCINT3/XTAL1/CLKI/OC1B/ADC3) // pin7, PB2 (SCK/USCK/SCL/ADC1/T0/INT0/PCINT2)
- // pin3, PB4 (PCINT4/XTAL2/CLKO/OC1B/ADC2) // pin6, PB1 (MISO/DO/AIN1/OC0B/OC1A/PCINT1)
- // pin4, GND // pin5, PB0 (MOSI/DI/SDA/AIN0/OC0A/OC1A/AREF/PCINT0)
- void
- key1();
- void key2();
- void key3();
- void kkey(int s);
- void keyscan();
- #define TRANS_PIN PB3
- #define INPUT_PIN0 PB0 // open door
- #define INPUT_PIN1 PB1 // close door
- #define INPUT_PIN2 PB2 // open offer
- #include <rc.h>
- volatile char state, keypressed;
- boolean lvl;
- int blc;
- int offDelay = 150;
- int main()
- {
- // Configure TRANS_PIN as output
- DDRB |= (1 << TRANS_PIN);
- // Set INPUT_PIN as Input
- DDRB &= ~(1 << INPUT_PIN0 | 1 << INPUT_PIN1 | 1 << INPUT_PIN2);
- // ADCSRA &= ~_BV(ADEN); //ADC OFF
- // turn on interrupts!
- // GIMSK |= (1 << PCIE);
- while (1)
- {
- // GIMSK |= _BV(PCIE); // Enable Pin Change Interrupts // Включить Pin Change прерывания
- // ADCSRA &= ~_BV(ADEN); // ADC off // отключить ADC; уменьшает энергопотребление
- sbi(GIMSK,PCIE);
- cbi(ADCSRA, ADEN); // switch Analog to Digitalconverter OFF
- // keypressed=LOW;
- // Enable PCINT0 (PB0) and PCINT1 (PB1) interrupt
- PCMSK |= (1 << PCINT0 | 1 << PCINT1 | 1 << PCINT2);
- // PCMSK = 0b00000111; // turn on interrupts on pins PB0, PB1, & PB2
- //MCUCR &= ~(_BV(ISC01) | _BV(ISC00)); //INT0 on low level
- sei();
- digitalWrite(TRANS_PIN, HIGH);
- delayMicroseconds(10);
- digitalWrite(TRANS_PIN, LOW);
- // Set TRANS_PIN low
- //PORTB &= ~(1 << TRANS_PIN);
- cbi(PORTB, TRANS_PIN);
- set_sleep_mode(SLEEP_MODE_PWR_DOWN);
- //set_sleep_mode(SLEEP_MODE_IDLE);
- sleep_mode();
- sleep_enable(); //gavs
- sei();
- sleep_cpu(); //gavs
- delayMicroseconds(200);
- digitalWrite(TRANS_PIN, HIGH);
- delayMicroseconds(50);
- digitalWrite(TRANS_PIN, LOW);
- // корректно просыпаемся
- cli(); // gavs
- sleep_disable(); //gavs
- // ADCSRA |= _BV(ADEN); // ADC on
- sbi(ADCSRA, ADEN); // switch Analog to Digitalconverter ON
- sei();
- if (keypressed) keyscan();
- switch (state)
- {
- case 0: {break;}
- case 1: {key1(); break;}
- case 2: {key2(); break;}
- case 3: {for (int t = 1; t <= 5; t++) key3(); break;}
- }
- // Set TRANS_PIN low
- PORTB &= ~(1 << TRANS_PIN);
- //sei(); //
- }
- }
- void keyscan()
- {
- if ((!PINB & (1 << INPUT_PIN0))) { /* delayMicroseconds(50); if ((!PINB & (1 << INPUT_PIN0))) */ state = 1; }
- else
- if ((!PINB & (1 << INPUT_PIN1))) { /* delayMicroseconds(50); if ((!PINB & (1 << INPUT_PIN1))) */ state = 2; }
- else
- if ((!PINB & (1 << INPUT_PIN2))) { /* delayMicroseconds(50); if ((!PINB & (1 << INPUT_PIN2))) */ state = 3; }
- else state=0;
- keypressed = LOW;
- cli();
- }
- ISR(PCINT0_vect)
- {
- keypressed=HIGH;
- }
- void kkey(int sizeOfArray)
- {
- lvl = LOW;
- for (int t = 0; t < sizeOfArray; t++)
- {
- digitalWrite(TRANS_PIN, HIGH);
- delayMicroseconds(1000);
- digitalWrite(TRANS_PIN, LOW);
- delayMicroseconds(1000);
- }
- }
- void key1()
- {
- lvl = LOW;
- int sizeOfArray = 108;
- for (int t = 0; t < sizeOfArray; t++)
- {
- digitalWrite(TRANS_PIN, lvl);
- delayMicroseconds(pgm_read_word_near(&Key1[t]) - offDelay);
- // delayMicroseconds(Key1[t]-150);
- lvl = !lvl;
- }
- }
- void key2()
- {
- lvl = LOW;
- for (int t = 0; t < 108; t++)
- {
- digitalWrite(TRANS_PIN, lvl);
- delayMicroseconds(pgm_read_word_near(&Key2[t]) - offDelay);
- //delayMicroseconds(Key2[t]-150);
- lvl = !lvl;
- }
- }
- void key3()
- {
- lvl = LOW;
- for (int t = 0; t < 108; t++)
- {
- digitalWrite(TRANS_PIN, lvl);
- delayMicroseconds(pgm_read_word_near(&Key3[t]) - offDelay);
- //delayMicroseconds(Key2[t]-150);
- lvl = !lvl;
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement