Ошибка компиляции для attiny 85
- Войдите на сайт для отправки комментариев
Сб, 09/02/2019 - 10:38
Здравствуйте подскажите собрал код в ардуино термометра на ds18b20, проверил на Arduino Nano все работает, хотел залить в Digispark attiny 85 и Arduino IDE выдало ошибку компиляции для платы
#include <OneWire.h> #include <SPI.h> // провод CS подсоединяем к 8-му пину Arduino enum { reg = 8 }; OneWire ds(7); // Объект OneWire int temperature = 0; // Глобальная переменная для хранения значение температуры с датчика DS18B20 long lastUpdateTime = 0; // Переменная для хранения времени последнего считывания с датчика const int TEMP_UPDATE_TIME = 400; // Определяем периодичность проверок void setup() { // инициализируем SPI SPI.begin(); // определяем 8-й пин Arduino как выход pinMode(reg, OUTPUT); //Serial.begin(9600); } //мы разобъем число на сотни, десятки и единицы, объявляем их здесь int hundreds=0, tens=0, ones=0; //время отображения каждой цифры int delayTime=5; //коды цифр на семисегментнике (0-9 и пустота) static uint8_t digit[31] = {0x08,0x18,0x88,0x98,0x48,0x58,0xC8,0xD8,0x28,0x38,0xFF, 0x04,0x14,0x84,0x94,0x44,0x54,0xC4,0xD4,0x24,0x34,0x02,0x12,0x82,0x92,0x42,0x52,0xC2,0xD2,0x22,0x32}; // коды позиций зажигаемого семисегментника (левый, центральный, правый) //static uint8_t pos[3]= {0xE7,0xEB,0xF3}; void loop() { detectTemperature(); // Определяем температуру от датчика DS18b20 //Serial.println(temperature); // Выводим полученное значение температуры // Т.к. переменная temperature имеет тип int, дробная часть будет просто отбрасываться } int detectTemperature(){ byte data[2]; ds.reset(); ds.write(0xCC); ds.write(0x44); if (millis() - lastUpdateTime > TEMP_UPDATE_TIME) { lastUpdateTime = millis(); ds.reset(); ds.write(0xCC); ds.write(0xBE); data[0] = ds.read(); data[1] = ds.read(); // Формируем значение temperature = (data[1] << 8) + data[0]; temperature = temperature >> 4; } //число, которое будем выводить int f = temperature; //выделяем сотни hundreds=(f/100) ; //выделяем десятки tens=((f-hundreds*100)/10); //выделяем единицы ones=f-hundreds*100-tens*10; //если сотен нет, не отображаем ничего в 3м разряде if (hundreds==0) hundreds=10; //если сотен и десятков нет, не отображаем ничего во 2м разряде if (hundreds==10 && tens==0)tens=10; //начинаем передачу по SPI digitalWrite(reg, LOW); //передаем код цифры, соответствующей разряду сотен SPI.transfer(digit[hundreds+21]); //выбираем левый 7-сегментник //SPI.transfer(pos[0]); //заканчиваем передачу digitalWrite(reg, HIGH); //пауза, равная delayTime delay(delayTime); //передаем код цифры, соответствующей разряду десятков digitalWrite(reg, LOW); SPI.transfer(digit[tens+11]); //выбираем центральный 7-сегментник //SPI.transfer(pos[1]); digitalWrite(reg, HIGH); delay(delayTime); //передаем код цифры, соответствующей разряду единиц digitalWrite(reg, LOW); SPI.transfer(digit[ones]); //выбираем правый 7-сегментник //SPI.transfer(pos[2]); digitalWrite(reg, HIGH); delay(delayTime); }
сам то можешь прочитать что на сриншоте ?
Скопипастить текст сообщения об ошибке никак?
По коду могу сказать:
1. в tiny85 нет SPI, а в программе он используется.
2. функция detectTemperature описана как int, но не содержит никакого return
ой да не заметил
а тогда, возможноли сделать spi в attiny85
а со 2 пунктом я не понял ?
Избавьтесь от SPI в скетче и проблема будет решена.
SPI возможно сделать двумя способами - программно или поверх имеющегося USI. Гуглите по словам "программный SPI" и "SPI поверх USI"
А со вторым пунктом - читайте Кернигана и Ритчи
а подскажите пожалуйста как, а то я совсем не програмист для меня этот код слепить было крайне трудно, а теперь еще и както заменьть spi?
"Подскажите, как удалить аппендицит, а то я не хирург" - так что ли?
а подскажите пожалуйста как
Так я же уже подсказао с чего начать.
Гуглите по словам "программный SPI" и "SPI поверх USI"
Вы это сделали? Что-то нашли, прочитали и Вам непонятно? Тогда задавайте конкретные вопросы по непонятному.
Тему верхнюю про тиньку13 изучите и будет вам счастье. Только не плачте что читать много а информации мало.
нашел некоторую информацию по usi и 74hc595 которая очень билзка к тому что мне надо (http://greenoakst.blogspot.com/2012/08/usi-spi.html) там же есть пример для перемигивания светодиодами, но я признаюсь туповат, и не могу понять где здесь операторы для передачи даных если в первом коде алгоритм такой - "дергаем в низ защелку; передаем данные через SPI.transfer; далее дергаем верх защелку и пауза..." здесь в примере ниже PORTB управляет защелко это впринципе в коментариях написано, а кто прередает данные ?, возможео эта строка "while((USISR&(1<<USIOIF))==0)" но как она работае ни че не понял, поясните пожалуйста.
Строка №14 - записываем в USIDR байт для передачи (что туда запихаете, то и передастся)
Строки №№ 20-26 собственно передача.
Кстати, пример реализации SPI (гораздо более короткий и понятный) есть в даташите Attiny85 в разделе 15.3.2
Но если Вам пока такие примеры тяжелы, воспользуйтесь программным SPI. Прямо на этом сайте отличный простой пример - http://arduino.ru/Reference/ShiftOut Ну или наберите в гугле "SPI shiftout"
а случаем не подскажите что за библиотки подключил автор, а то ни где не нахожу упоминания и еще подскажите, автор кода в 11 посте прошивает микроконтролер через asp програматор, у меняже диги спарк через узб нужнали первая библиотека io для digispark? (и первые движения работы с attiny 85 digispark, светодиод моргает)
Он это делает не для ардуино, а в авр-студии или ещё в чём-то, Вам эти библиотеки не нужны, их среда ародуино сама подключит.
ааааа я смог запустиь этот пример и залитть она работает моему счастью нет придела
подскажите еще пожалуста вот эту строчку while((USISR&(1<<USIOIF))==0) не нуж-но ли заменить на void loop((USISR&(1<<USIOIF))==0)
Звчем чинить то, что не сломано?
т.к конечная цель должна быть вывод данных на сдвиговый регистр, то я попытался соединить с кодом из первого поста (упрощеным для вывода чисел)
Пример2
Можете подсказать как сделать так чтобы через програмный spi заработал вывод единиц десятков и сотен, собственно чтобы работал также как первый код расчитаный под аппаратный спи
в коде КАПСом написано что и где я хотел
Это не софтверный SPI. Софтверный описан по ссылке по shiftOut, что я Вам давал. Это реализация поверх USI.
Пример Вы выбрали неудачный, он написан под нужды того, кто писал, а вовсе не универсальноЮ потому Вам трудно его под себя переделывать.
Если Вы уж так хотите сделать именно на USI, Так, посмотрели бы даташит, там всё делается в несколько строчек. Вот смотрите.
1.
Предварительно нужно приинициализировать SPI. В данном слечае это сводится к переводу пинов CLK, MOSI и SS в OUTPUT и установке CLK и MOSI в LOW, а SS - в HIGH. Т.е. Вы пишете вот такую функцию и вызываете её один раз из setup.
2.
Далее, перед началом передачи данных необходимо перевести SS в LOW, а после завершения передачи - обратно в HIGH. Пишете две функции для этого:
3.
ну, и собственно передача. Функцию передачи можно совершенно тупо скопипастить из даташите (я давал Вам номер раздела). Вот она.
Собственно, всё. Можете называть эти несколько строчек "библиотекой", если Вам так нравится.
Теперь, когда бы Вам не нужно было передать какие-то данные, Вы просто пишете: spiBeforeSend(); .. собственно передача ... spiAfterSend(); и всё. Вот примеры (я их не запускал, так что опечатки возможны, но идею они показывают)
УРА. ЗАРАБОТАЛО СПАСИБО вам огромное ЕВГЕНИЙ,без вашей третей подсказки ну ваще ни че не получилось, правда первая подсказка не заработала совсем, но я решил совсем слегка подмешать из примера с usi который не заработал и все ок термометр живет. Еще раз спасибо огромное вам от души, от сердца!
итоговый
код привожу
УРА. ЗАРАБОТАЛО СПАСИБО вам огромное ЕВГЕНИЙ. Еще раз спасибо огромное вам от души, от сердца!
Лучше пивом, или монетами
А возможно ли это перенести на Attiny13?
Там нет USI но она же тоже программируется через SPI, как то это возможно реализовать?
А возможно ли это перенести на Attiny13?
Не знаю. Никогда этим не интересовался, т.к. никогда не держал в руках 13-ую.
У тини13 SPI только для программирования. Поэтому ногодрыгом.
У тини13 SPI только для программирования. Поэтому ногодрыгом.
С помощью shiftOut?
Я хотел ногодрыгом, но кроме как через micros() я не представляю как это реализовать, но micros это 4 мкс, а у SPI 8 бит должны в 2мкс уложиться.