Чт ноя 21, 2019 15:40:32
Чт ноя 21, 2019 19:35:18
Пт дек 06, 2019 13:22:22
Сб янв 30, 2021 23:10:50
/* ATtiny85 hardware SPI master + 74HC595 */
#define F_CPU 128000UL // 128/8 kHz clock speed
#include <avr/io.h>
#include <avr/sleep.h>
#include <avr/interrupt.h>
#include "tinySPI.h"
#define BUTTON PB4
const uint16_t inhibitor1(3);
const uint16_t inhibitor2(4);
const uint8_t led_pattern[9] = {
0b00000000,
0b10000000,
0b11000000,
0b11100000,
0b11110000,
0b11111000,
0b11111100,
0b11111110,
0b11111111 };
ISR( PCINT0_vect ){
sleep_disable();// Проснуться
if( !(PINB & (1<<BUTTON)) ){// Кнопка нажата
for(int8_t i=0; i<9; i++){
PORTB &= ~(1<<DI_DD_PIN);
for(uint16_t n=0; n<inhibitor2; n++){ SPI.transfer(led_pattern[i]); }
PORTB |= (1<<DI_DD_PIN); }
}
if( PINB & (1<<BUTTON) ){// Кнопка отпущена
for(int8_t i=8; i!=-1; i--){
PORTB &= ~(1<<DI_DD_PIN);
for(uint16_t n=0; n<inhibitor1; n++){ SPI.transfer(led_pattern[i]); }
PORTB |= (1<<DI_DD_PIN); }
}
sleep_cpu();// Спать!
}
int main(void){
PORTB|= (1 << BUTTON); //Устанавливаем pull-up режим ножки BUTTON
DDRB &= ~(1 << BUTTON); //Настраиваем ножку BUTTON в режим входа
/* Не настраиваемое прерывание PCINT0 по любому фронту */
GIMSK |= (1<<PCIE); // Разрешаем внешние прерывания PCINT0.
PCMSK |= (1<<BUTTON); // Разрешаем по маске прерывания.
SPI.begin(); // запустить аппаратный SPI (библиотека настраивает контакты часов и данных)
DDRB |= (1<<DI_DD_PIN); // OUTPUT LATCH_PIN
PORTB |= (1<<DI_DD_PIN); //Устанавливаем pull-up режим ножки LATCH_PIN
/* Подготовка ко сну */
set_sleep_mode(SLEEP_MODE_PWR_DOWN); // Set Sleep Mode: Power Down
sleep_enable();
sei(); // разрешаем прерывания
sleep_cpu();// Спать!
while (1) {/* гараж пустой, делать нечего */}
}
// Arduino tinySPI Library Copyright (C) 2018 by Jack Christensen and
// licensed under GNU GPL v3.0, https://www.gnu.org/licenses/gpl.html
//
// Arduino hardware SPI master library for
// ATtiny24/44/84, ATtiny25/45/85, ATtiny261/461/861, ATtiny2313/4313.
//
// https://github.com/JChristensen/tinySPI
// Jack Christensen 24Oct2013
#include "tinySPI.h"
void tinySPI::begin() {
USICR &= ~(1<<(USISIE) | (1<<USIOIE) | (1<<USIWM1));
USICR |= (1<<(USIWM0) | (1<<USICS1) | (1<<USICLK));
SPI_DDR_PORT |= (1<<USCK_DD_PIN); // set the USCK pin as output
SPI_DDR_PORT |= (1<<DO_DD_PIN); // set the DO pin as output
SPI_DDR_PORT &= ~(1<<DI_DD_PIN); // set the DI pin as input
}
void tinySPI::setDataMode(uint8_t spiDataMode) {
if (spiDataMode == SPI_MODE1){ USICR |= (1<<USICS0); }
else{ USICR &= ~(1<<USICS0); }
}
uint8_t tinySPI::transfer(uint8_t spiData) {
USIDR = spiData;
USISR = (1<<USIOIF); // clear counter and counter overflow interrupt flag
ATOMIC_BLOCK(ATOMIC_RESTORESTATE) { // ensure a consistent clock period
while ( !(USISR & (1<<USIOIF)) ) { USICR |= (1<<USITC); }
}
return USIDR;
}
void tinySPI::end() {
USICR &= ~((1<<USIWM1) | (1<<USIWM0));
}
tinySPI SPI;
// Arduino tinySPI Library Copyright (C) 2018 by Jack Christensen and
// licensed under GNU GPL v3.0, https://www.gnu.org/licenses/gpl.html
//
// Arduino hardware SPI master library for
// ATtiny24/44/84, ATtiny25/45/85, ATtiny261/461/861, ATtiny2313/4313.
//
// https://github.com/JChristensen/tinySPI
// Jack Christensen 24Oct2013
#ifndef TINYSPI_H_INCLUDED
#define TINYSPI_H_INCLUDED
#include <util/atomic.h>
// USI ports and pins
// (Thanks to nopnop2002 for adding the definitions for ATtiny461/861 and 2313/4313.)
#if defined(__AVR_ATtiny24__) || defined(__AVR_ATtiny44__) || defined(__AVR_ATtiny84__)
#define SPI_DDR_PORT DDRA
#define USCK_DD_PIN DDA4
#define DO_DD_PIN DDA5
#define DI_DD_PIN DDA6
#elif defined(__AVR_ATtiny25__) || defined(__AVR_ATtiny45__) || defined(__AVR_ATtiny85__)
#define SPI_DDR_PORT DDRB
#define USCK_DD_PIN DDB2 // //PB2
#define DO_DD_PIN DDB1 // //PB1
#define DI_DD_PIN DDB0 // //PB0
#elif defined(__AVR_ATtiny261__) || defined(__AVR_ATtiny461__) || defined(__AVR_ATtiny861__)
#define SPI_DDR_PORT DDRB
#define USCK_DD_PIN DDB2
#define DO_DD_PIN DDB1
#define DI_DD_PIN DDB0
#elif defined(__AVR_ATtiny2313__) || defined(__AVR_ATtiny4313__)
#define SPI_DDR_PORT DDRB
#define USCK_DD_PIN DDB7
#define DO_DD_PIN DDB6
#define DI_DD_PIN DDB5
#else
#error "tinySPI does not support this microcontroller."
#endif
// SPI data modes
#define SPI_MODE0 0 //0x00
#define SPI_MODE1 4 //0x04
class tinySPI {
public:
static void begin();
static void setDataMode(uint8_t spiDataMode);//
static uint8_t transfer(uint8_t spiData);//
static void end();
};
extern tinySPI SPI;
#endif
Сб янв 30, 2021 23:53:57
Вс янв 31, 2021 00:50:48
Пн фев 01, 2021 23:48:09