Так что в последнее время я работал над Attiny85 uC, чтобы выполнить некоторые конкретные задачи.Теперь моя задача - управлять ADXL362 с помощью интерфейса SPI.Я уже использовал attiny для управления сопротивлением стеклоочистителя digiPOT через интерфейс I2C.На данный момент attiny прекрасно работает для управления digiPOT с помощью I2C comm.Когда я добавляю ADXL 362 с этим, он генерирует ошибку, говоря, что некоторые GIMSK и PCMSK не объявлены.
Я углубился в детали этого и обнаружил, что SPIE в библиотеке создает некоторые проблемы.Я не уверен, в правильном ли я направлении или нет.
ADXL362 отлично работает на плате Arduino Uno с установленными базовыми библиотеками.Для attiny я добавил прерывание смены контактов, чтобы система перешла в спящий режим для экономии энергии.
Моя общая цель состояла в том, чтобы контролировать ADXL362 и MAX5479 digiPOT, используя SPI и интерфейс I2C соответственно, используя attiny85 длясоздайте систему с ультранизким энергопотреблением для моих нужд, которая использует прерывания для экономии энергии.
Если кто-нибудь может мне помочь, как заставить его работать как на I2c, так и на SPI одновременно, используя Attiny85, поскольку они оба прекрасно работают отдельно.
Для справки, прерывания Attiny хорошо объяснены здесь [1]: https://bigdanzblog.wordpress.com/2014/08/10/attiny85-wake-from-sleep-on-pin-state-change-code-example/
И библиотеки, которые я использую для своего проекта:
#include <avr/io.h>
#include <avr/sleep.h>
#include <TinyWireM.h>
#include <LowPower.h>
#include <SPI.h>
#include <ADXL362.h>
и ошибкаЯ получаю очень долго, фрагмент прикреплен.
In file included from c:\program files (x86)\arduino\hardware\tools\avr\avr\include\avr\io.h:99:0,
from c:\program files (x86)\arduino\hardware\tools\avr\avr\include\avr\pgmspace.h:90,
from C:\Program Files (x86)\Arduino\hardware\arduino\avr\cores\arduino/Arduino.h:28,
from sketch\Revision-01.ino.cpp:1:
C:\Program Files (x86)\Arduino\hardware\arduino\avr\libraries\SPI\src/SPI.h:310:55: error: 'SPIE' was not declared in this scope
inline static void detachInterrupt() { SPCR &= ~_BV(SPIE); }
^
exit status 1
Error compiling for board ATtiny25/45/85.
Ожидание некоторого полезного ответа, предложения или некоторого полезного направления ссылки.
Если вы ищете код, надеюсь, что этофрагмент может помочь.
#define I2C_SLAVE_ADDRESS1 0x28
#define I2C_SLAVE_ADDRESS2 0xD0
#define C_BYTEWA 0X11
#define C_BYTEWB 0X12
#define M_Byte 0x02
#define ST_P PB3
#define LED PB4
#define BODS 7 //BOD Sleep bit in MCUCR
#define BODSE 2 //BOD Sleep enable bit in MCUCR
#define KEEP_RUNNING 60000 //milliseconds
#include <avr/io.h>
#include <avr/sleep.h>
#include <TinyWireM.h>
#include <LowPower.h> // Optional
#include <SPI.h>
#include <ADXL362.h>
ADXL362 xl;
const unsigned long starttime=0;
void setup()
{
xl.begin();
delay(1000);
TinyWireM.begin(); // Initialize the i2c master library
i2c(); // I2C communication mode initialization function calls
for (byte i=0; i<5; i++)
{
pinMode(i, INPUT);
}
GIMSK |= _BV(PCIE); // Enable Pin Change Interrupts
PCMSK |= _BV(PCINT1); // Use PB0 as interupt pin
pinMode(LED, OUTPUT);
digitalWrite(LED, HIGH); // Drive it low so it doesn't source current
delay(10);
digitalWrite(LED, LOW);
pinMode(ST_P, OUTPUT);
digitalWrite(ST_P, HIGH); // Make ST_P high all time
}
void loop()
{
Sleep(); // Sleep function calls
do
{
digitalWrite(LED, HIGH);
delay(KEEP_RUNNING);
}
while(millis()-starttime<KEEP_RUNNING); // keep system awake for 'Preset time' before it goes back to sleep
digitalWrite(LED, LOW);
}
void Sleep(void)
{
GIMSK |= _BV(PCIE); // Enable Pin Change Interrupts
PCMSK |= _BV(PCINT1); // Use PB0 as interrupt pin
ADCSRA &= ~_BV(ADEN); // ADC off
set_sleep_mode(SLEEP_MODE_PWR_DOWN);
sleep_enable(); // Sets the Sleep Enable bit in MCUCR Register
sei(); // Enable interrupts
sleep_cpu(); // sleep
sleep_disable(); // Clearthe Sleep Enable bit in MCUCR Register
ADCSRA |= _BV(ADEN); // ADC on
sei();
}
ISR(PCINT0_vect) // Interrupt service routine to execute specific task during interrupt
{
//GIMSK = 0; // disable external interrupts (only need one to wake up)
}
void i2c(void)
{
// MAX digiPOT initialization
TinyWireM.begin();
TinyWireM.beginTransmission(I2C_SLAVE_ADDRESS1);
TinyWireM.send(C_BYTEWA);
TinyWireM.send(0xff); // send max resistance value (max tap)
int Byte1 = TinyWireM.endTransmission();
TinyWireM.begin();
TinyWireM.beginTransmission(I2C_SLAVE_ADDRESS1);
TinyWireM.send(C_BYTEWB);
TinyWireM.send(0xff); // send max resistance value (max tap)
int Byte2 = TinyWireM.endTransmission();
}
Спасибо