Ошибка компиляции для attiny 85

non programmer
Offline
Зарегистрирован: 09.02.2019

Здравствуйте подскажите собрал код в ардуино термометра на 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); 
  
}

xDriver
xDriver аватар
Offline
Зарегистрирован: 14.08.2015

сам то можешь прочитать что на сриншоте ?

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Скопипастить текст сообщения об ошибке никак?

По коду могу сказать:

1. в tiny85 нет SPI, а в программе он используется.

2. функция detectTemperature описана как int, но не содержит никакого return

non programmer
Offline
Зарегистрирован: 09.02.2019

ой да не заметил

In file included from c:\users\zalman-h110k\documents\arduinodata\packages\arduino\tools\avr-gcc\4.8.1-arduino5\avr\include\avr\io.h:99:0,
 
                 from c:\users\zalman-h110k\documents\arduinodata\packages\arduino\tools\avr-gcc\4.8.1-arduino5\avr\include\avr\interrupt.h:38,
 
                 from C:\Users\ZALMAN-H110K\Documents\ArduinoData\packages\digistump\hardware\avr\1.6.7\cores\tiny/WProgram.h:8,
 
                 from C:\Users\ZALMAN-H110K\Documents\ArduinoData\packages\digistump\hardware\avr\1.6.7\cores\tiny/Arduino.h:4,
 
                 from sketch\sketch_sep09b.ino.cpp:1:
 
C:\Users\ZALMAN-H110K\Documents\Arduino\libraries\SPI/SPI.h: In member function 'void SPISettings::init_AlwaysInline(uint32_t, uint8_t, uint8_t)':
 
C:\Users\ZALMAN-H110K\Documents\Arduino\libraries\SPI/SPI.h:146:16: error: 'SPE' was not declared in this scope
 
     spcr = _BV(SPE) | _BV(MSTR) | ((bitOrder == LSBFIRST) ? _BV(DORD) : 0) |
 
                ^
 
C:\Users\ZALMAN-H110K\Documents\Arduino\libraries\SPI/SPI.h:146:27: error: 'MSTR' was not declared in this scope
 
     spcr = _BV(SPE) | _BV(MSTR) | ((bitOrder == LSBFIRST) ? _BV(DORD) : 0) |
 
                           ^
 
C:\Users\ZALMAN-H110K\Documents\Arduino\libraries\SPI/SPI.h:146:65: error: 'DORD' was not declared in this scope
 
     spcr = _BV(SPE) | _BV(MSTR) | ((bitOrder == LSBFIRST) ? _BV(DORD) : 0) |
 
                                                                 ^
 
In file included from C:\Users\ZALMAN~1\AppData\Local\Temp\arduino_modified_sketch_509466\sketch_sep09b.ino:2:0:
 
C:\Users\ZALMAN-H110K\Documents\Arduino\libraries\SPI/SPI.h: In static member function 'static void SPIClass::beginTransaction(SPISettings)':
 
C:\Users\ZALMAN-H110K\Documents\Arduino\libraries\SPI/SPI.h:203:5: error: 'SPCR' was not declared in this scope
 
     SPCR = settings.spcr;
 
     ^
 
C:\Users\ZALMAN-H110K\Documents\Arduino\libraries\SPI/SPI.h:204:5: error: 'SPSR' was not declared in this scope
 
     SPSR = settings.spsr;
 
     ^
 
C:\Users\ZALMAN-H110K\Documents\Arduino\libraries\SPI/SPI.h: In static member function 'static uint8_t SPIClass::transfer(uint8_t)':
 
C:\Users\ZALMAN-H110K\Documents\Arduino\libraries\SPI/SPI.h:209:5: error: 'SPDR' was not declared in this scope
 
     SPDR = data;
 
     ^
 
C:\Users\ZALMAN-H110K\Documents\Arduino\libraries\SPI/SPI.h:217:14: error: 'SPSR' was not declared in this scope
 
     while (!(SPSR & _BV(SPIF))) ; // wait
 
              ^
 
In file included from c:\users\zalman-h110k\documents\arduinodata\packages\arduino\tools\avr-gcc\4.8.1-arduino5\avr\include\avr\io.h:99:0,
 
                 from c:\users\zalman-h110k\documents\arduinodata\packages\arduino\tools\avr-gcc\4.8.1-arduino5\avr\include\avr\interrupt.h:38,
 
                 from C:\Users\ZALMAN-H110K\Documents\ArduinoData\packages\digistump\hardware\avr\1.6.7\cores\tiny/WProgram.h:8,
 
                 from C:\Users\ZALMAN-H110K\Documents\ArduinoData\packages\digistump\hardware\avr\1.6.7\cores\tiny/Arduino.h:4,
 
                 from sketch\sketch_sep09b.ino.cpp:1:
 
C:\Users\ZALMAN-H110K\Documents\Arduino\libraries\SPI/SPI.h:217:25: error: 'SPIF' was not declared in this scope
 
     while (!(SPSR & _BV(SPIF))) ; // wait
 
                         ^
 
In file included from C:\Users\ZALMAN~1\AppData\Local\Temp\arduino_modified_sketch_509466\sketch_sep09b.ino:2:0:
 
C:\Users\ZALMAN-H110K\Documents\Arduino\libraries\SPI/SPI.h: In static member function 'static uint16_t SPIClass::transfer16(uint16_t)':
 
C:\Users\ZALMAN-H110K\Documents\Arduino\libraries\SPI/SPI.h:223:11: error: 'SPCR' was not declared in this scope
 
     if (!(SPCR & _BV(DORD))) {
 
           ^
 
In file included from c:\users\zalman-h110k\documents\arduinodata\packages\arduino\tools\avr-gcc\4.8.1-arduino5\avr\include\avr\io.h:99:0,
 
                 from c:\users\zalman-h110k\documents\arduinodata\packages\arduino\tools\avr-gcc\4.8.1-arduino5\avr\include\avr\interrupt.h:38,
 
                 from C:\Users\ZALMAN-H110K\Documents\ArduinoData\packages\digistump\hardware\avr\1.6.7\cores\tiny/WProgram.h:8,
 
                 from C:\Users\ZALMAN-H110K\Documents\ArduinoData\packages\digistump\hardware\avr\1.6.7\cores\tiny/Arduino.h:4,
 
                 from sketch\sketch_sep09b.ino.cpp:1:
 
C:\Users\ZALMAN-H110K\Documents\Arduino\libraries\SPI/SPI.h:223:22: error: 'DORD' was not declared in this scope
 
     if (!(SPCR & _BV(DORD))) {
 
                      ^
 
In file included from C:\Users\ZALMAN~1\AppData\Local\Temp\arduino_modified_sketch_509466\sketch_sep09b.ino:2:0:
 
C:\Users\ZALMAN-H110K\Documents\Arduino\libraries\SPI/SPI.h:224:7: error: 'SPDR' was not declared in this scope
 
       SPDR = in.msb;
 
       ^
 
C:\Users\ZALMAN-H110K\Documents\Arduino\libraries\SPI/SPI.h:226:16: error: 'SPSR' was not declared in this scope
 
       while (!(SPSR & _BV(SPIF))) ;
 
                ^
 
In file included from c:\users\zalman-h110k\documents\arduinodata\packages\arduino\tools\avr-gcc\4.8.1-arduino5\avr\include\avr\io.h:99:0,
 
                 from c:\users\zalman-h110k\documents\arduinodata\packages\arduino\tools\avr-gcc\4.8.1-arduino5\avr\include\avr\interrupt.h:38,
 
                 from C:\Users\ZALMAN-H110K\Documents\ArduinoData\packages\digistump\hardware\avr\1.6.7\cores\tiny/WProgram.h:8,
 
                 from C:\Users\ZALMAN-H110K\Documents\ArduinoData\packages\digistump\hardware\avr\1.6.7\cores\tiny/Arduino.h:4,
 
                 from sketch\sketch_sep09b.ino.cpp:1:
 
C:\Users\ZALMAN-H110K\Documents\Arduino\libraries\SPI/SPI.h:226:27: error: 'SPIF' was not declared in this scope
 
       while (!(SPSR & _BV(SPIF))) ;
 
                           ^
 
In file included from C:\Users\ZALMAN~1\AppData\Local\Temp\arduino_modified_sketch_509466\sketch_sep09b.ino:2:0:
 
C:\Users\ZALMAN-H110K\Documents\Arduino\libraries\SPI/SPI.h:230:16: error: 'SPSR' was not declared in this scope
 
       while (!(SPSR & _BV(SPIF))) ;
 
                ^
 
In file included from c:\users\zalman-h110k\documents\arduinodata\packages\arduino\tools\avr-gcc\4.8.1-arduino5\avr\include\avr\io.h:99:0,
 
                 from c:\users\zalman-h110k\documents\arduinodata\packages\arduino\tools\avr-gcc\4.8.1-arduino5\avr\include\avr\interrupt.h:38,
 
                 from C:\Users\ZALMAN-H110K\Documents\ArduinoData\packages\digistump\hardware\avr\1.6.7\cores\tiny/WProgram.h:8,
 
                 from C:\Users\ZALMAN-H110K\Documents\ArduinoData\packages\digistump\hardware\avr\1.6.7\cores\tiny/Arduino.h:4,
 
                 from sketch\sketch_sep09b.ino.cpp:1:
 
C:\Users\ZALMAN-H110K\Documents\Arduino\libraries\SPI/SPI.h:230:27: error: 'SPIF' was not declared in this scope
 
       while (!(SPSR & _BV(SPIF))) ;
 
                           ^
 
In file included from C:\Users\ZALMAN~1\AppData\Local\Temp\arduino_modified_sketch_509466\sketch_sep09b.ino:2:0:
 
C:\Users\ZALMAN-H110K\Documents\Arduino\libraries\SPI/SPI.h:233:7: error: 'SPDR' was not declared in this scope
 
       SPDR = in.lsb;
 
       ^
 
C:\Users\ZALMAN-H110K\Documents\Arduino\libraries\SPI/SPI.h:235:16: error: 'SPSR' was not declared in this scope
 
       while (!(SPSR & _BV(SPIF))) ;
 
                ^
 
In file included from c:\users\zalman-h110k\documents\arduinodata\packages\arduino\tools\avr-gcc\4.8.1-arduino5\avr\include\avr\io.h:99:0,
 
                 from c:\users\zalman-h110k\documents\arduinodata\packages\arduino\tools\avr-gcc\4.8.1-arduino5\avr\include\avr\interrupt.h:38,
 
                 from C:\Users\ZALMAN-H110K\Documents\ArduinoData\packages\digistump\hardware\avr\1.6.7\cores\tiny/WProgram.h:8,
 
                 from C:\Users\ZALMAN-H110K\Documents\ArduinoData\packages\digistump\hardware\avr\1.6.7\cores\tiny/Arduino.h:4,
 
                 from sketch\sketch_sep09b.ino.cpp:1:
 
C:\Users\ZALMAN-H110K\Documents\Arduino\libraries\SPI/SPI.h:235:27: error: 'SPIF' was not declared in this scope
 
       while (!(SPSR & _BV(SPIF))) ;
 
                           ^
 
In file included from C:\Users\ZALMAN~1\AppData\Local\Temp\arduino_modified_sketch_509466\sketch_sep09b.ino:2:0:
 
C:\Users\ZALMAN-H110K\Documents\Arduino\libraries\SPI/SPI.h:239:16: error: 'SPSR' was not declared in this scope
 
       while (!(SPSR & _BV(SPIF))) ;
 
                ^
 
In file included from c:\users\zalman-h110k\documents\arduinodata\packages\arduino\tools\avr-gcc\4.8.1-arduino5\avr\include\avr\io.h:99:0,
 
                 from c:\users\zalman-h110k\documents\arduinodata\packages\arduino\tools\avr-gcc\4.8.1-arduino5\avr\include\avr\interrupt.h:38,
 
                 from C:\Users\ZALMAN-H110K\Documents\ArduinoData\packages\digistump\hardware\avr\1.6.7\cores\tiny/WProgram.h:8,
 
                 from C:\Users\ZALMAN-H110K\Documents\ArduinoData\packages\digistump\hardware\avr\1.6.7\cores\tiny/Arduino.h:4,
 
                 from sketch\sketch_sep09b.ino.cpp:1:
 
C:\Users\ZALMAN-H110K\Documents\Arduino\libraries\SPI/SPI.h:239:27: error: 'SPIF' was not declared in this scope
 
       while (!(SPSR & _BV(SPIF))) ;
 
                           ^
 
In file included from C:\Users\ZALMAN~1\AppData\Local\Temp\arduino_modified_sketch_509466\sketch_sep09b.ino:2:0:
 
C:\Users\ZALMAN-H110K\Documents\Arduino\libraries\SPI/SPI.h: In static member function 'static void SPIClass::transfer(void*, size_t)':
 
C:\Users\ZALMAN-H110K\Documents\Arduino\libraries\SPI/SPI.h:247:5: error: 'SPDR' was not declared in this scope
 
     SPDR = *p;
 
     ^
 
C:\Users\ZALMAN-H110K\Documents\Arduino\libraries\SPI/SPI.h:250:16: error: 'SPSR' was not declared in this scope
 
       while (!(SPSR & _BV(SPIF))) ;
 
                ^
 
In file included from c:\users\zalman-h110k\documents\arduinodata\packages\arduino\tools\avr-gcc\4.8.1-arduino5\avr\include\avr\io.h:99:0,
 
                 from c:\users\zalman-h110k\documents\arduinodata\packages\arduino\tools\avr-gcc\4.8.1-arduino5\avr\include\avr\interrupt.h:38,
 
                 from C:\Users\ZALMAN-H110K\Documents\ArduinoData\packages\digistump\hardware\avr\1.6.7\cores\tiny/WProgram.h:8,
 
                 from C:\Users\ZALMAN-H110K\Documents\ArduinoData\packages\digistump\hardware\avr\1.6.7\cores\tiny/Arduino.h:4,
 
                 from sketch\sketch_sep09b.ino.cpp:1:
 
C:\Users\ZALMAN-H110K\Documents\Arduino\libraries\SPI/SPI.h:250:27: error: 'SPIF' was not declared in this scope
 
       while (!(SPSR & _BV(SPIF))) ;
 
                           ^
 
In file included from C:\Users\ZALMAN~1\AppData\Local\Temp\arduino_modified_sketch_509466\sketch_sep09b.ino:2:0:
 
C:\Users\ZALMAN-H110K\Documents\Arduino\libraries\SPI/SPI.h:255:14: error: 'SPSR' was not declared in this scope
 
     while (!(SPSR & _BV(SPIF))) ;
 
              ^
 
In file included from c:\users\zalman-h110k\documents\arduinodata\packages\arduino\tools\avr-gcc\4.8.1-arduino5\avr\include\avr\io.h:99:0,
 
                 from c:\users\zalman-h110k\documents\arduinodata\packages\arduino\tools\avr-gcc\4.8.1-arduino5\avr\include\avr\interrupt.h:38,
 
                 from C:\Users\ZALMAN-H110K\Documents\ArduinoData\packages\digistump\hardware\avr\1.6.7\cores\tiny/WProgram.h:8,
 
                 from C:\Users\ZALMAN-H110K\Documents\ArduinoData\packages\digistump\hardware\avr\1.6.7\cores\tiny/Arduino.h:4,
 
                 from sketch\sketch_sep09b.ino.cpp:1:
 
C:\Users\ZALMAN-H110K\Documents\Arduino\libraries\SPI/SPI.h:255:25: error: 'SPIF' was not declared in this scope
 
     while (!(SPSR & _BV(SPIF))) ;
 
                         ^
 
In file included from C:\Users\ZALMAN~1\AppData\Local\Temp\arduino_modified_sketch_509466\sketch_sep09b.ino:2:0:
 
C:\Users\ZALMAN-H110K\Documents\Arduino\libraries\SPI/SPI.h: In static member function 'static void SPIClass::setBitOrder(uint8_t)':
 
C:\Users\ZALMAN-H110K\Documents\Arduino\libraries\SPI/SPI.h:292:31: error: 'SPCR' was not declared in this scope
 
     if (bitOrder == LSBFIRST) SPCR |= _BV(DORD);
 
                               ^
 
In file included from c:\users\zalman-h110k\documents\arduinodata\packages\arduino\tools\avr-gcc\4.8.1-arduino5\avr\include\avr\io.h:99:0,
 
                 from c:\users\zalman-h110k\documents\arduinodata\packages\arduino\tools\avr-gcc\4.8.1-arduino5\avr\include\avr\interrupt.h:38,
 
                 from C:\Users\ZALMAN-H110K\Documents\ArduinoData\packages\digistump\hardware\avr\1.6.7\cores\tiny/WProgram.h:8,
 
                 from C:\Users\ZALMAN-H110K\Documents\ArduinoData\packages\digistump\hardware\avr\1.6.7\cores\tiny/Arduino.h:4,
 
                 from sketch\sketch_sep09b.ino.cpp:1:
 
C:\Users\ZALMAN-H110K\Documents\Arduino\libraries\SPI/SPI.h:292:43: error: 'DORD' was not declared in this scope
 
     if (bitOrder == LSBFIRST) SPCR |= _BV(DORD);
 
                                           ^
 
In file included from C:\Users\ZALMAN~1\AppData\Local\Temp\arduino_modified_sketch_509466\sketch_sep09b.ino:2:0:
 
C:\Users\ZALMAN-H110K\Documents\Arduino\libraries\SPI/SPI.h:293:10: error: 'SPCR' was not declared in this scope
 
     else SPCR &= ~(_BV(DORD));
 
          ^
 
In file included from c:\users\zalman-h110k\documents\arduinodata\packages\arduino\tools\avr-gcc\4.8.1-arduino5\avr\include\avr\io.h:99:0,
 
                 from c:\users\zalman-h110k\documents\arduinodata\packages\arduino\tools\avr-gcc\4.8.1-arduino5\avr\include\avr\interrupt.h:38,
 
                 from C:\Users\ZALMAN-H110K\Documents\ArduinoData\packages\digistump\hardware\avr\1.6.7\cores\tiny/WProgram.h:8,
 
                 from C:\Users\ZALMAN-H110K\Documents\ArduinoData\packages\digistump\hardware\avr\1.6.7\cores\tiny/Arduino.h:4,
 
                 from sketch\sketch_sep09b.ino.cpp:1:
 
C:\Users\ZALMAN-H110K\Documents\Arduino\libraries\SPI/SPI.h:293:24: error: 'DORD' was not declared in this scope
 
     else SPCR &= ~(_BV(DORD));
 
                        ^
 
In file included from C:\Users\ZALMAN~1\AppData\Local\Temp\arduino_modified_sketch_509466\sketch_sep09b.ino:2:0:
 
C:\Users\ZALMAN-H110K\Documents\Arduino\libraries\SPI/SPI.h: In static member function 'static void SPIClass::setDataMode(uint8_t)':
 
C:\Users\ZALMAN-H110K\Documents\Arduino\libraries\SPI/SPI.h:298:5: error: 'SPCR' was not declared in this scope
 
     SPCR = (SPCR & ~SPI_MODE_MASK) | dataMode;
 
     ^
 
C:\Users\ZALMAN-H110K\Documents\Arduino\libraries\SPI/SPI.h: In static member function 'static void SPIClass::setClockDivider(uint8_t)':
 
C:\Users\ZALMAN-H110K\Documents\Arduino\libraries\SPI/SPI.h:303:5: error: 'SPCR' was not declared in this scope
 
     SPCR = (SPCR & ~SPI_CLOCK_MASK) | (clockDiv & SPI_CLOCK_MASK);
 
     ^
 
C:\Users\ZALMAN-H110K\Documents\Arduino\libraries\SPI/SPI.h:304:5: error: 'SPSR' was not declared in this scope
 
     SPSR = (SPSR & ~SPI_2XCLOCK_MASK) | ((clockDiv >> 2) & SPI_2XCLOCK_MASK);
 
     ^
 
C:\Users\ZALMAN-H110K\Documents\Arduino\libraries\SPI/SPI.h: In static member function 'static void SPIClass::attachInterrupt()':
 
C:\Users\ZALMAN-H110K\Documents\Arduino\libraries\SPI/SPI.h:309:42: error: 'SPCR' was not declared in this scope
 
   inline static void attachInterrupt() { SPCR |= _BV(SPIE); }
 
                                          ^
 
In file included from c:\users\zalman-h110k\documents\arduinodata\packages\arduino\tools\avr-gcc\4.8.1-arduino5\avr\include\avr\io.h:99:0,
 
                 from c:\users\zalman-h110k\documents\arduinodata\packages\arduino\tools\avr-gcc\4.8.1-arduino5\avr\include\avr\interrupt.h:38,
 
                 from C:\Users\ZALMAN-H110K\Documents\ArduinoData\packages\digistump\hardware\avr\1.6.7\cores\tiny/WProgram.h:8,
 
                 from C:\Users\ZALMAN-H110K\Documents\ArduinoData\packages\digistump\hardware\avr\1.6.7\cores\tiny/Arduino.h:4,
 
                 from sketch\sketch_sep09b.ino.cpp:1:
 
C:\Users\ZALMAN-H110K\Documents\Arduino\libraries\SPI/SPI.h:309:54: error: 'SPIE' was not declared in this scope
 
   inline static void attachInterrupt() { SPCR |= _BV(SPIE); }
 
                                                      ^
 
In file included from C:\Users\ZALMAN~1\AppData\Local\Temp\arduino_modified_sketch_509466\sketch_sep09b.ino:2:0:
 
C:\Users\ZALMAN-H110K\Documents\Arduino\libraries\SPI/SPI.h: In static member function 'static void SPIClass::detachInterrupt()':
 
C:\Users\ZALMAN-H110K\Documents\Arduino\libraries\SPI/SPI.h:310:42: error: 'SPCR' was not declared in this scope
 
   inline static void detachInterrupt() { SPCR &= ~_BV(SPIE); }
 
                                          ^
 
In file included from c:\users\zalman-h110k\documents\arduinodata\packages\arduino\tools\avr-gcc\4.8.1-arduino5\avr\include\avr\io.h:99:0,
 
                 from c:\users\zalman-h110k\documents\arduinodata\packages\arduino\tools\avr-gcc\4.8.1-arduino5\avr\include\avr\interrupt.h:38,
 
                 from C:\Users\ZALMAN-H110K\Documents\ArduinoData\packages\digistump\hardware\avr\1.6.7\cores\tiny/WProgram.h:8,
 
                 from C:\Users\ZALMAN-H110K\Documents\ArduinoData\packages\digistump\hardware\avr\1.6.7\cores\tiny/Arduino.h:4,
 
                 from sketch\sketch_sep09b.ino.cpp:1:
 
C:\Users\ZALMAN-H110K\Documents\Arduino\libraries\SPI/SPI.h:310:55: error: 'SPIE' was not declared in this scope
 
   inline static void detachInterrupt() { SPCR &= ~_BV(SPIE); }
 
                                                       ^
 
Несколько библиотек найдено для "OneWire.h"
 Используется: C:\Users\ZALMAN-H110K\Documents\Arduino\libraries\OneWire
Не используется: C:\Users\ZALMAN-H110K\Documents\ArduinoData\packages\digistump\hardware\avr\1.6.7\libraries\OneWire
Несколько библиотек найдено для "SPI.h"
 Используется: C:\Users\ZALMAN-H110K\Documents\Arduino\libraries\SPI
Не используется: C:\Users\ZALMAN-H110K\Documents\ArduinoData\packages\digistump\hardware\avr\1.6.7\libraries\SPI
exit status 1
Ошибка компиляции для платы Digispark (Default - 16.5mhz)
non programmer
Offline
Зарегистрирован: 09.02.2019

а тогда, возможноли сделать spi в attiny85 

а со 2 пунктом я не понял ?

sadman41
Offline
Зарегистрирован: 19.10.2016

Избавьтесь от SPI в скетче и проблема будет решена.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

SPI возможно сделать двумя способами - программно или поверх имеющегося USI. Гуглите по словам "программный SPI" и "SPI поверх USI"

А со вторым пунктом - читайте Кернигана и Ритчи

non programmer
Offline
Зарегистрирован: 09.02.2019

а подскажите пожалуйста как, а то я совсем не програмист для меня этот код слепить было крайне трудно, а теперь еще и както заменьть spi?

sadman41
Offline
Зарегистрирован: 19.10.2016

"Подскажите, как удалить аппендицит, а то я не хирург" - так что ли?

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

non programmer пишет:

а подскажите пожалуйста как

Так я же уже подсказао с чего начать.

ЕвгенийП пишет:

Гуглите по словам "программный SPI" и "SPI поверх USI"

Вы это сделали? Что-то нашли, прочитали и Вам непонятно? Тогда задавайте конкретные вопросы по непонятному.

nik182
Онлайн
Зарегистрирован: 04.05.2015

Тему верхнюю про тиньку13 изучите и будет вам счастье. Только не плачте что читать много а информации мало. 

non programmer
Offline
Зарегистрирован: 09.02.2019

нашел некоторую информацию по usi и 74hc595 которая очень билзка к тому что мне надо (http://greenoakst.blogspot.com/2012/08/usi-spi.html) там же есть пример для перемигивания светодиодами, но я признаюсь туповат, и не могу понять где здесь операторы для передачи даных если в первом коде алгоритм такой - "дергаем в низ защелку; передаем данные через SPI.transfer; далее дергаем верх защелку и пауза..." здесь в примере ниже PORTB управляет защелко это впринципе в коментариях написано, а кто прередает данные ?, возможео эта строка "while((USISR&(1<<USIOIF))==0)"  но как она работае ни че не понял, поясните пожалуйста.

/Подключаем самую нужную библиотеку io
#include </usr/lib/avr/include/avr/io.h>
//Подключаем библиотеку, которая обеспечивает функцию delay
#include </usr/lib/avr/include/util/delay.h>

int main(void){
  //Настраиваем нужные пины на выходы
  DDRB = (1 << DDB1) | (1 << DDB2) | (1 << DDB3) | (1 << DDB4);
  //Бесконечный цикл
  while(1){
    //Пробегаем по номерам светодиодов
    for (int i=0;i<8;i++){
      //В качестве данных для USI указываем номер светодиода
      USIDR=(1<<i);
      //Опускаем флаг переполнения таймера
      USISR|=(1<<USIOIF);
      //Отпускаем защелку регистра 74HC595
      PORTB&=(0<<PORTB4);
      //Пока не поднялся флаг переполнения счетчика
      while((USISR&(1<<USIOIF))==0){
        //Выставляем трехпроводной режим;
        //Выбираем внешний источник тактирования, с положительным фронтом;
        //Выставляем тактирование по стробу USITC;
        //Собственно, генерируем сам строб USITC
        USICR=(1<<USIWM0)|(1<<USICS1)|(1<<USICLK)|(1<<USITC);
      }
      //Защелкиваем данные в регистре 74HC595
      PORTB|=(1<<PORTB4);
      //Пауза 100 миллисекунд
      _delay_ms(100);
    }
  }
  //main возвращает 0, как всегда
  return 0;
}

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Строка №14 - записываем в USIDR байт для передачи (что туда запихаете, то и передастся)
Строки №№ 20-26 собственно передача.

Кстати, пример реализации SPI (гораздо более короткий и понятный) есть в даташите Attiny85 в разделе 15.3.2

Но если Вам пока такие примеры тяжелы, воспользуйтесь программным SPI. Прямо на этом сайте отличный простой пример - http://arduino.ru/Reference/ShiftOut  Ну или наберите в гугле "SPI shiftout"

non programmer
Offline
Зарегистрирован: 09.02.2019

а случаем не подскажите что за библиотки подключил автор, а то ни где не нахожу упоминания и еще подскажите, автор кода в 11 посте прошивает микроконтролер через asp програматор, у меняже диги спарк через узб нужнали первая библиотека io для digispark? (и первые движения работы с attiny 85 digispark, светодиод моргает)

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Он это делает не для ардуино, а в авр-студии или ещё в чём-то, Вам эти библиотеки не нужны, их среда ародуино сама подключит.

non programmer
Offline
Зарегистрирован: 09.02.2019

ааааа я смог запустиь этот пример и залитть она работает моему счастью нет придела

подскажите еще пожалуста вот эту строчку while((USISR&(1<<USIOIF))==0) не нуж-но ли заменить на void loop((USISR&(1<<USIOIF))==0)

//Бесконечный цикл
  void loop(){
    //Пробегаем по номерам светодиодов
    for (int i=0;i<8;i++){
      //В качестве данных для USI указываем номер светодиода
      USIDR=(1<<i);
      //Опускаем флаг переполнения таймера
      USISR|=(1<<USIOIF);
      //Отпускаем защелку регистра 74HC595
      PORTB&=(0<<PORTB4);
      //Пока не поднялся флаг переполнения счетчика
      while((USISR&(1<<USIOIF))==0){
        //Выставляем трехпроводной режим;
        //Выбираем внешний источник тактирования, с положительным фронтом;
        //Выставляем тактирование по стробу USITC;
        //Собственно, генерируем сам строб USITC
        USICR=(1<<USIWM0)|(1<<USICS1)|(1<<USICLK)|(1<<USITC);
      }
      //Защелкиваем данные в регистре 74HC595
      PORTB|=(1<<PORTB4);
      //Пауза 100 миллисекунд
      delay(100);
    }
  }
  //main возвращает 0, как всегда
  //return 0;

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Звчем чинить то, что не сломано?

non programmer
Offline
Зарегистрирован: 09.02.2019

т.к конечная цель должна быть вывод данных на сдвиговый регистр, то я попытался соединить с кодом из первого поста (упрощеным для вывода чисел)



void setup()
{
//Настраиваем нужные пины на выходы
  DDRB = (1 << DDB1) | (1 << DDB2) | (1 << DDB3) | (1 << DDB4); 
}
//мы разобъем число на сотни, десятки и единицы, объявляем их здесь 
int hundreds=0, tens=0, ones=0; 
//время отображения каждой цифры       
int delayTime=10;        
//коды цифр на семисегментнике (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()
{
//число, которое будем выводить 
  int f=707;                          
//выделяем сотни   
  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]);
//выбираем левый 7-сегментник
SPI.transfer(pos[0]);
//заканчиваем передачу
digitalWrite(reg, HIGH);
//пауза, равная delayTime
delay(delayTime);

// НИЖЕ ИДЕТ ВЫВОД ЦИФР КОТОРЫЙ РАБОТАЛ С БИБЛИОТЕКОЙ SPI, ТОЕСТЬ У НАС ЕСТЬ ФУНКЦИЯ SPI.transfer(digit[tens]) КОТОРАЯ НАПРИМЕР ВЫВОДИТ ДЕСЯТКИ digit[tens] ТАК ВОТ Я ХОТЕЛ ВЫВОДИТЬ ДЕСЯТКИ В ПРИМЕРЕ2
//передаем код цифры, соответствующей разряду десятков
digitalWrite(reg, LOW);
SPI.transfer(digit[tens]);
//выбираем центральный 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);

}

 

Пример2

for (int i=0;i<8;i++) // ЭТУ ЧАСТЬ Я ЗАКОМЕНТИРОВАЛ
{
      //В качестве данных для USI указываем номер светодиода
      USIDR=(1<<i); // А ЗДЕСЬ Я ХОТЕЛ ВМЕСТО i ВТАВИТЬ ТЕ САМЫЕ ДЕСЯТКИ digit[tens], НО КАК ТОЛЬКО НЕ КРУТИЛ НИ ЧЕГО НЕ ПЕРЕДАЕТСЯ, ХОТЯ ЭТОТ КОД
БЕЗ ИЗМЕНЕНИЙ РАБОТАЕТ
      //Опускаем флаг переполнения таймера
      USISR|=(1<<USIOIF);
      //Отпускаем защелку регистра 74HC595
      PORTB&=(0<<PORTB4);
      //Пока не поднялся флаг переполнения счетчика
      if ((USISR&(1<<USIOIF))==0){
        //Выставляем трехпроводной режим;
        //Выбираем внешний источник тактирования, с положительным фронтом;
        //Выставляем тактирование по стробу USITC;
        //Собственно, генерируем сам строб USITC
        USICR=(1<<USIWM0)|(1<<USICS1)|(1<<USICLK)|(1<<USITC);
      }
      //Защелкиваем данные в регистре 74HC595
      PORTB|=(1<<PORTB4);
      //Пауза 100 миллисекунд
      delay(100);
      
    }
  

Можете подсказать как сделать так чтобы через програмный spi заработал вывод единиц десятков и сотен, собственно чтобы работал также как первый код расчитаный под аппаратный спи

в коде КАПСом написано что и где я хотел

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Это не софтверный SPI. Софтверный описан по ссылке по shiftOut, что я Вам давал. Это реализация поверх USI.

Пример Вы выбрали неудачный, он написан под нужды того, кто писал, а вовсе не универсальноЮ потому Вам трудно его под себя переделывать.

Если Вы уж так хотите сделать именно на USI, Так, посмотрели бы даташит, там всё делается в несколько строчек. Вот смотрите.

1.
Предварительно нужно приинициализировать SPI. В данном слечае это сводится к переводу пинов CLK, MOSI и SS в OUTPUT и установке CLK и MOSI в LOW, а SS - в HIGH. Т.е. Вы пишете вот такую функцию и вызываете её один раз из setup.

//
// Инициализация SPI поверх USI
//
static void spiInit(void) {
	pinMode(MSPI_CLK, OUTPUT);
	pinMode(MSPI_MOSI, OUTPUT);
	pinMode(MSPI_SS, OUTPUT);
	digitalWrite(MSPI_CLK, LOW);
	digitalWrite(MSPI_MOSI, LOW);
	digitalWrite(MSPI_SS, HIGH);
}

2.
Далее, перед началом передачи данных необходимо перевести SS в LOW, а после завершения передачи - обратно в HIGH. Пишете две функции для этого:

static inline void spiBeforeSend(void) { digitalWrite(MSPI_SS, LOW); }
static inline void spiAfterSend(void) { digitalWrite(MSPI_SS, HIGH); }

3.
ну, и собственно передача. Функцию передачи можно совершенно тупо скопипастить из даташите (я давал Вам номер раздела). Вот она.

//
// Передача байта по SPI поверх USI
//
static void spiSend(const uint8_t what) {
	USIDR = what;
	const register uint8_t oldSREG = SREG;
	asm volatile (
		"ldi	r16, 27	\n\t"	//	27 == (1<<USIWM0)|(1<<USICS1)|(1<<USICLK)|(1<<USITC)
		"ldi	r18, 16 \n\t"
		"cli   \n\r"
		"rr1%=:   \n\r"
		"out	%0, r16	\n\t"
		"dec	r18 \n\t"
		"brne rr1%=	\n\t"
		: : "I" (_SFR_IO_ADDR(USICR)) : "r16", "r18"
		);
	SREG = oldSREG;
}

Собственно, всё. Можете называть эти несколько строчек "библиотекой", если Вам так нравится.

Теперь, когда бы Вам не нужно было передать какие-то данные, Вы просто пишете: spiBeforeSend(); .. собственно передача ... spiAfterSend(); и всё. Вот примеры (я их не запускал, так что опечатки возможны, но идею они показывают)

// где-то в setup один раз вызвана
spiInit();

//.......
//
// Пример №1. Передаём байт, 0xf0
//
spiBeforeSend();
spiSend(0xf0);
spiAfterSend();

//
// Пример №2. Передаём число типа float
//
float pi = 3.141592;
spiBeforeSend();
uint8_t * ptr = (uint8_t *)& pi;
for (int8_t i = 0; i < (int8_t)sizeof(pi); i++, ptr++) spiSend(*ptr);
spiAfterSend();

//
// Пример №3. Передаём строку вместе с завершающим нулём
//
char * s = "Ab initio nullum, semper nullum";
spiBeforeSend();
while (*s) spiSend(*s++); // Передача строки
spiSend(0);  // Передача завершающего нуля
spiAfterSend();
non programmer
Offline
Зарегистрирован: 09.02.2019

УРА. ЗАРАБОТАЛО СПАСИБО вам огромное ЕВГЕНИЙ,без вашей третей подсказки ну ваще ни че не получилось, правда первая подсказка не заработала совсем, но я решил совсем слегка подмешать из примера с usi который не заработал и все ок термометр живет. Еще раз спасибо огромное вам от души, от сердца!

итоговый

#include <OneWire.h>
OneWire ds(5); // Объект OneWire
 
int temperature = 0; // Глобальная переменная для хранения значение температуры с датчика DS18B20
 
long lastUpdateTime = 0; // Переменная для хранения времени последнего считывания с датчика
const int TEMP_UPDATE_TIME = 400; // Определяем периодичность проверок

void setup()

{
  //Настраиваем нужные пины на выходы
  DDRB = (1 << DDB1) | (1 << DDB2)  | (1 << DDB4);
   }
   //
// Передача байта по SPI поверх USI
//
static void spiSend(const uint8_t what) {
 USIDR = what;
  const register uint8_t oldSREG = SREG;
  asm volatile (
    "ldi  r16, 27 \n\t" //  27 == (1<<USIWM0)|(1<<USICS1)|(1<<USICLK)|(1<<USITC)
    "ldi  r18, 16 \n\t"
    "cli   \n\r"
    "rr1%=:   \n\r"
    "out  %0, r16 \n\t"
    "dec  r18 \n\t"
    "brne rr1%= \n\t"
    : : "I" (_SFR_IO_ADDR(USICR)) : "r16", "r18"
    );
  SREG = oldSREG;
}

//мы разобъем число на сотни, десятки и единицы, объявляем их здесь 
int hundreds=0, tens=0, ones=0; 
//время отображения каждой цифры       
int delayTime=7;        
//коды цифр на семисегментнике (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};


void loop() {
detectTemperature(); }// Определяем температуру от датчика DS18b20
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; 

  
  //Отпускаем защелку регистра 74HC595
      PORTB&=(0<<PORTB4);
      spiSend(digit[hundreds+21]);
//Защелкиваем данные в регистре 74HC595
      PORTB|=(1<<PORTB4);
      //Пауза 100 миллисекунд
      delay(delayTime);
      
      //Отпускаем защелку регистра 74HC595
      PORTB&=(0<<PORTB4);
      spiSend(digit[tens+11]);
//Защелкиваем данные в регистре 74HC595
      PORTB|=(1<<PORTB4);
      //Пауза 100 миллисекунд
      delay(delayTime);

      //Отпускаем защелку регистра 74HC595
      PORTB&=(0<<PORTB4);
      spiSend(digit[ones]);
//Защелкиваем данные в регистре 74HC595
      PORTB|=(1<<PORTB4);
      //Пауза 100 миллисекунд
      delay(delayTime);
}

код привожу

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

non programmer пишет:

УРА. ЗАРАБОТАЛО СПАСИБО вам огромное ЕВГЕНИЙ.   Еще раз спасибо огромное вам от души, от сердца!

Лучше пивом, или монетами

bortnik27
Offline
Зарегистрирован: 23.06.2019

ЕвгенийП пишет:

А возможно ли это перенести на Attiny13? 

Там нет USI но она же тоже программируется через SPI, как то это возможно реализовать?

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

bortnik27 пишет:

А возможно ли это перенести на Attiny13? 

Не знаю. Никогда этим не интересовался, т.к. никогда не держал в руках 13-ую.

Green
Offline
Зарегистрирован: 01.10.2015

У тини13 SPI только для программирования. Поэтому ногодрыгом.

bortnik27
Offline
Зарегистрирован: 23.06.2019

Green пишет:

У тини13 SPI только для программирования. Поэтому ногодрыгом.

С помощью shiftOut? 

Я хотел ногодрыгом, но кроме как через micros() я не представляю как это реализовать, но micros это 4 мкс, а у SPI 8 бит должны в 2мкс уложиться.