Что такое "tws_delay" и как его использовать? (с ATTiny85)

ПРАВКА: Хорошо, я глуп, у меня каким-то образом была установлена библиотека 2012 года, возможно, когда я косвенно загрузил ее с другого старого учебного сайта. Огромное спасибо Питеру Фририку за то, что указал на это! Теперь он наконец-то собран

Поэтому в настоящее время я выполняю небольшой проект, в котором у меня есть ATtiny85, управляющий некоторыми (неопиксельными) RGB-адресуемыми светодиодами, которые управляются через i2c с помощью Arduino UNO Master. Цель состоит в том, чтобы превратить Attiny85 в подчиненное устройство i2c, которое получает простую команду (например, однозначное int) и решает, какую готовую программу светодиодного дисплея использовать.

Я использую библиотеку tinyNeopixel ATTinyCore, TinyWireS и Adafruit для tiny и программирую ее с помощью Arduino UNO в качестве ISP.

Моя проблема заключается в следующем: код светодиода требует задержки для изменения скорости светового шоу. Но я вижу в примере TinyWireS здесь, что я должен использовать tws_delay вместо обычной задержки.

Различные попытки поиска в Google не оставили мне возможности узнать, как использовать tws_delay, что это такое или как его даже объявить. Я получаю ошибку объявления, когда пытаюсь использовать задержку с включенной библиотекой TinyWireS.

Я хотел бы найти ресурс для изучения того, как объявлять и использовать эту задержку. Спасибо, что дочитали до этого

РЕДАКТИРОВАТЬ: Теперь я добавил свой код и ошибку ниже, вы можете найти tws_delay в пустом цикле внизу

// NeoPixel Ring simple sketch (c) 2013 Shae Erisson
// released under the GPLv3 license to match the rest of the AdaFruit NeoPixel library

#if (F_CPU>7370000) //neopixel library required 7.37MHz minimum clock speed; this line is used to skip this sketch in internal testing. It is not needed in your sketches.
#include <tinyNeoPixel.h>
#include <TinyWireS.h>
// Which pin on the Arduino is connected to the NeoPixels?
#define PIN            3

// How many NeoPixels are attached to the Arduino?
#define NUMPIXELS      8

// When we setup the NeoPixel library, we tell it how many pixels, and which pin to use to send signals.
// Note that for older NeoPixel strips you might need to change the third parameter--see the strandtest
// example for more information on possible values.
tinyNeoPixel pixels = tinyNeoPixel(NUMPIXELS, PIN, NEO_RGB + NEO_KHZ800);

int delayval = 500; // delay for half a second

void setup() {

  pixels.begin(); // This initializes the NeoPixel library.
}

void loop() {

  // For a set of NeoPixels the first NeoPixel is 0, second is 1, all the way up to the count of pixels minus one.

  for(int i=0;i<NUMPIXELS;i++){

    // pixels.Color takes RGB values, from 0,0,0 up to 255,255,255
    pixels.setPixelColor(i, pixels.Color(0,150,0)); // Moderately bright green color.

    pixels.show(); // This sends the updated pixel color to the hardware.

    tws_delay(delayval); // Delay for a period of time (in milliseconds).

  }
}
#else //neopixel library required 7.37MHz minimum clock speed; these and following lines are used to skip this sketch in internal testing. It is not needed in your sketches.
#warning "Neopixel control requires F_CPU > 7.37MHz"
void setup() {}
void loop() {}
#endif

И ошибка:

C:\Users\Dean\AppData\Local\Temp\arduino_modified_sketch_145294\simple.ino: In function 'void loop()':

simple:36:5: error: 'tws_delay' was not declared in this scope

     tws_delay(delayval); // Delay for a period of time (in milliseconds).

     ^~~~~~~~~

C:\Users\Dean\AppData\Local\Temp\arduino_modified_sketch_145294\simple.ino:36:5: note: suggested alternative: 'delay'

     tws_delay(delayval); // Delay for a period of time (in milliseconds).

     ^~~~~~~~~

     delay

Multiple libraries were found for "tinyNeoPixel.h"
 Used: C:\Users\Dean\AppData\Local\Arduino15\packages\ATTinyCore\hardware\avr\1.3.2\libraries\tinyNeoPixel
Multiple libraries were found for "TinyWireS.h"
 Used: C:\Users\Dean\Documents\Arduino\libraries\TinyWireS
exit status 1
'tws_delay' was not declared in this scope

, 👍2

Обсуждение

Не могли бы вы, пожалуйста, показать свой код и полное сообщение об ошибке, которое вы получаете? При включении библиотеки вы должны иметь возможность использовать функцию tws_delay (), так же, как она используется в [этом example](https://github.com/rambo/TinyWire/blob/master/TinyWireS/examples/attiny85_i2c_slave/attiny85_i2c_slave.ino) из библиотеки, @chrisl

Хорошо, я добавил код и сообщение об ошибке, просто чтобы отметить, что я также попытался ввести tws_delay(50) и все равно получил ту же ошибку, @tatty fish pickle

"РЕДАКТИРОВАТЬ: Хорошо, я" предполагает, что кто-то ответил на ваш вопрос. Если это так, вы должны отметить, что их ответ принят. Как минимум, вы сочли это полезным, проголосуйте за это. Если вы нашли ответ на свой собственный вопрос, опубликуйте свой собственный ответ и отметьте, что он принят., @timemage


2 ответа


Лучший ответ:

0

Ответ: Убедитесь, что вы установили правильную библиотеку :P

,

Было бы более разумно вывести ваш ответ-материал из вопроса и здесь, в вашем "ответе", чтобы сделать его правильным ответом., @timemage

Извините, я вообще не знаю, как это сделать. Есть ли какая-то кнопка, которую я не вижу?, @tatty fish pickle

У вас есть ссылки для редактирования как под вашим вопросом, так и под ответом, поэтому вы можете эффективно вырезать и вставлять между ними. Также можно отметить свой собственный ответ как принятый, чтобы на вопрос был принят ответ., @timemage


1

tws_delay () - это функция, предоставляемая библиотекой TinyWireS здесь. Как вы можете видеть из объявления - void tws_delay(unsigned long); - он принимает параметр unsigned long, как и функция delay ().

На самом деле, комментарий к строке над этим заявлением гласит...

// Реализуйте цикл задержки, который проверяет наличие стоп-бита (в основном прямая копия стандартной реализации arduino из проводки.c)

... итак, можно с уверенностью сказать, что везде, где вы использовали бы delay (), вы можете использовать tws_delay().

Поэтому не должно быть необходимости объявлять или определять его. Но просто использовать его. Если использование tws_delay() в коде, включающем TinyWireS.h, не работает, я бы проверил, есть ли у вас версия библиотеки, которая объявляет/определяет ее. Что вам и следует сделать, учитывая пример, который вы связали, поскольку это репо выполняет эту функцию с 2012 года!

,

Спасибо за ответ! Поэтому я добавил свой код и ошибку в исходное сообщение. Кажется, я все еще получаю ошибку, хотя библиотека должна была объявить это правильно? Также да, у меня установлена новейшая версия библиотеки. Сейчас я пойду и проверю еще раз, на всякий случай. Редактировать: О черт, у меня действительно каким-то образом есть код с 2012 года!! В этом, должно быть, и проблема! Я собираюсь установить новую библиотеку прямо сейчас и попробовать это., @tatty fish pickle

Ладно, извините за назойливость, но теперь я решил проблему благодаря вам, но сразу же столкнулся с еще одной небольшой проблемой, время для задержек, похоже, не подходит. Например, если я помещу 1000 в скобки, он мигнет на долю секунды. Я хотел спросить вас, так как вы, казалось, знали, как это работает, но при необходимости я открою еще один полный пост с вопросами для этого., @tatty fish pickle

Извините, не могу вам помочь с этим вопросом... функция twi_delay, похоже, должна работать должным образом... если тактовая частота вашего устройства установлена правильно. Это должно в основном привести к задержке "блокировки" в 500 мс (блокировка, поскольку ничто другое, кроме "TinyWireS_stop_check", не может повторяться, но больше ничего не делает, как следует из комментария выше, реализация предполагает, что TinyWireS стала прерываться). Держу пари, что это реальная проблема, и что tinyNeopixel использует прерывание, которое хочет использовать TinyWireS., @Peter Feerick

Ладно, это действительно имеет смысл, я разберусь с этим, спасибо!, @tatty fish pickle

Проголосовав за ваш ответ, потому что они этого не сделали, несмотря на то, что явно сочли его полезным., @timemage