Скетч не загружается в ATmega8A (ошибка при компиляции)

Zhyravlev_AS
Offline
Зарегистрирован: 03.04.2013

Здравствуйте. Не могу понять, почему скетч

#include <SoftwareSerial.h>
#include <EEPROM.h>

SoftwareSerial bluetooth(0, 1);

#define PIN_R 3
#define PIN_G 5
#define PIN_B 6

#define EPROM_ADDR_VALUE_R 0
#define EPROM_ADDR_VALUE_G 1
#define EPROM_ADDR_VALUE_B 2
#define EPROM_DEVICE_STATUS 3
#define EPROM_DEVICE_AUTO 4
#define EPROM_DEVICE_AUTO_VALUE 5
#define EPROM_DEVICE_RAINDOW 6

int global_R;
int global_G;
int global_B;

char message[255];
boolean reading;
unsigned int count;

void setup() {
  bluetooth.begin(9600);
  reading = true;
  
  EEPROM.write(EPROM_DEVICE_STATUS, 0);
  
  global_R = EEPROM.read(EPROM_ADDR_VALUE_R);
  global_G = EEPROM.read(EPROM_ADDR_VALUE_G);
  global_B = EEPROM.read(EPROM_ADDR_VALUE_B);
  
  pinMode(PIN_R, OUTPUT);
  pinMode(PIN_G, OUTPUT);
  pinMode(PIN_B, OUTPUT);
  
  deviceON();
  bluetooth.println("\nDEVICE ON");
}

void loop() {
  if(bluetooth.available() > 0 && reading) {
    char readChar = bluetooth.read();
    if(readChar == '^') {
      bluetoothRead();
    }
  }
  
    if((byte)EEPROM.read(EPROM_DEVICE_AUTO) == 1){
      deviceAuto();
    }
}

void deviceAuto(){
  
  int val = analogRead(0);
  byte device_status = EEPROM.read(EPROM_DEVICE_STATUS);
  int device_auto_value = EEPROM.read(EPROM_DEVICE_AUTO_VALUE);
  
  if(val < (device_auto_value-100) && device_status == 0){
    EEPROM.write(EPROM_DEVICE_STATUS, 1);
    deviceON();
    bluetooth.println("\nDEVICE ON");
  }else if(val > device_auto_value && device_status == 1){
    EEPROM.write(EPROM_DEVICE_STATUS, 0);
    deviceOFF();
    bluetooth.println("\nDEVICE OFF");
  }
  
  delay(10);
}

void bluetoothRead() {
  
  reading = false;
  count = 0;
  
  iniReading:
  if (bluetooth.available() > 0) {
    char readChar = bluetooth.read();
    if (readChar == '$') {
      goto endReading;
    } else {
      message[count++] = readChar;
      goto iniReading;
    }
  }
  goto iniReading;
  
  endReading:
  reading = true;
  message[count] = '\0';
  
  String str = message;
  
  if(str.substring(0,4) == "RGB:"){
    int r = stringToInt(str.substring(4,7));
    int g = stringToInt(str.substring(7,10));
    int b = stringToInt(str.substring(10,13));
    transictionFromTo(global_R, global_G, global_B, r, g, b, 5);
    bluetooth.println("\nRGB OK");
  }else if(str.substring(0,4) == "CMD:"){
    
    if(str.substring(4,6) == "ON" && EEPROM.read(EPROM_DEVICE_STATUS) == 0){
      deviceON();
      bluetooth.println("\nDEVICE ON");
    }
    
    else if(str.substring(4,7) == "OFF" && EEPROM.read(EPROM_DEVICE_STATUS) == 1){
      deviceOFF();
      bluetooth.println("\nDEVICE OFF");
    }
    
    else if(str.substring(4,8) == "SAVE"){
      deviceSave();
      bluetooth.println("\nSAVE OK");
    }
    
    else if(str.substring(4,11) == "DEFAULT"){
      deviceDefault();
      bluetooth.println("\nDEFAULT OK");
    }
    
    else if(str.substring(4,9) == "AUTO+"){
      String value = str.substring(9,12);
      EEPROM.write(EPROM_DEVICE_AUTO_VALUE, stringToInt(value));
      bluetooth.print("\nAUTO: ");
      bluetooth.println(value);
    }
    
    else if(str.substring(4,8) == "AUTO"){
      if((byte)EEPROM.read(EPROM_DEVICE_AUTO) == 0){
        EEPROM.write(EPROM_DEVICE_AUTO, 1);
        bluetooth.println("\nAUTO ON");
      }else{
        EEPROM.write(EPROM_DEVICE_AUTO, 0);
        deviceON();
        bluetooth.println("\nAUTO OFF");
        bluetooth.println("\nDEVICE ON");
      }
    }
    
    else if(str.substring(4,10) == "SENSOR"){
      bluetooth.print("\nSENSOR: ");
      bluetooth.println(analogRead(0));
    }
    
    else if(str.substring(4,14) == "RAINDOW+ON"){
      EEPROM.write(EPROM_DEVICE_RAINDOW, 1);
    }
    else if(str.substring(4,15) == "RAINDOW+OFF"){
      EEPROM.write(EPROM_DEVICE_RAINDOW, 0);
    }
  }
}

void deviceON(){
  
  byte r = EEPROM.read(EPROM_ADDR_VALUE_R);
  byte g = EEPROM.read(EPROM_ADDR_VALUE_G);
  byte b = EEPROM.read(EPROM_ADDR_VALUE_B);
  
  if(r==255 && g==255 && b==255){
    for(float i=0;i<=1;i+=0.02){
      analogWrite(PIN_R, i*255);
      analogWrite(PIN_G, i*255);
      analogWrite(PIN_B, i*255);
      delay(30);
    }
  }else{
    for(float i=0;i<=1;i+=0.02){
      analogWrite(PIN_R, i*r);
      analogWrite(PIN_G, i*g);
      analogWrite(PIN_B, i*b);
      delay(30);
    }
  }
  
  EEPROM.write(EPROM_DEVICE_STATUS, 1);
}

void deviceOFF(){
  
  deviceSave();
  
  byte r = EEPROM.read(EPROM_ADDR_VALUE_R);
  byte g = EEPROM.read(EPROM_ADDR_VALUE_G);
  byte b = EEPROM.read(EPROM_ADDR_VALUE_B);
  
  for(float i=1;i>=0;i-=0.02){
    analogWrite(PIN_R, i*r);
    analogWrite(PIN_G, i*g);
    analogWrite(PIN_B, i*b);
    delay(30);
  }
  
  EEPROM.write(EPROM_DEVICE_STATUS, 0);
}

void deviceSave(){
  EEPROM.write(EPROM_ADDR_VALUE_R, global_R);
  EEPROM.write(EPROM_ADDR_VALUE_G, global_G);
  EEPROM.write(EPROM_ADDR_VALUE_B, global_B); 
}

void deviceDefault(){
  EEPROM.write(EPROM_DEVICE_STATUS, 0);
  EEPROM.write(EPROM_DEVICE_AUTO, 0);
  EEPROM.write(EPROM_DEVICE_AUTO_VALUE, 300);
  EEPROM.write(EPROM_DEVICE_RAINDOW, 0);
  EEPROM.write(EPROM_ADDR_VALUE_R, 255);
  EEPROM.write(EPROM_ADDR_VALUE_G, 255);
  EEPROM.write(EPROM_ADDR_VALUE_B, 255);
  deviceON();
}

void transictionFromTo (int fromR, int fromG, int fromB, int toR, int toG, int toB, int velocity) {
    float R = fromR;
    float G = fromG;
    float B = fromB;
    float ContsR;
    float ContsG;
    float ContsB;
    boolean RComplete = false;
    boolean GComplete = false;
    boolean BComplete = false;

   if (R < toR){
     ContsR = (float)toR / 255;
   }else{
     ContsR = (float)fromR / 255;
   }
   if (G < toG){
     ContsG = (float)toG / 255;
   }else{
     ContsG = (float)fromG / 255;
   }
   if (B < toB){
     ContsB = (float)toB / 255;
   }else{
     ContsB = (float)fromB / 255;
   }


     do{

     if (!RComplete){
       if (R < toR){
        R = R + ContsR;
        if (R >= toR){
          RComplete = true;
        }
      }else{
        R = R - ContsR;
        if (R <= toR){
          RComplete = true;
        }
      }
     }

     if (!GComplete){
      if (G < toG){
        G = G + ContsG;
        if (G >= toG){
          GComplete = true;
        }
      }else{
        G = G - ContsG;
        if (G <= toG){
          GComplete = true;
        }
      }
     }

     if (!BComplete){
      if (B < toB){
        B = B + ContsB;
        if (B >= toB){
          BComplete = true;
        }
      }else{
        B = B - ContsB;
        if (B <= toB){
          BComplete = true;
        }
      }
     }

      analogWrite(PIN_R, R);
      analogWrite(PIN_G, G);
      analogWrite(PIN_B, B);
      
      delay(velocity);

    }while(!(RComplete && GComplete && BComplete));
    
    global_R = R;
    global_G = G;
    global_B = B;
}

int stringToInt(String string){
  char cValue[string.length() + 1];
  string.toCharArray(cValue, sizeof(cValue));
  int iValue = atoi(cValue);
  return iValue;
}

Не загружается не через Arduino ISP не через саму плату, точнее пишет ошибка при компиляции. На родную  ATmega328P-PU компилируется и загружается все отлично.

Вот что пишет мне:

 

C:\Users\1\Downloads\arduino-1.0.4-windows\hardware\tools\avr\bin\avr-g++ -c -g -Os -Wall -fno-exceptions -ffunction-sections -fdata-sections -mmcu=atmega8 -DF_CPU=16000000L -MMD -DUSB_VID=null -DUSB_PID=null -DARDUINO=104 -IC:\Users\1\Downloads\arduino-1.0.4-windows\hardware\arduino\cores\arduino -IC:\Users\1\Downloads\arduino-1.0.4-windows\hardware\arduino\variants\standard -IC:\Users\1\Downloads\arduino-1.0.4-windows\libraries\SoftwareSerial -IC:\Users\1\Downloads\arduino-1.0.4-windows\libraries\EEPROM C:\Users\1\AppData\Local\Temp\build6418823009604165814.tmp\led_lamp_bt.cpp -o C:\Users\1\AppData\Local\Temp\build6418823009604165814.tmp\led_lamp_bt.cpp.o 
led_lamp_bt.ino: In function 'void deviceDefault()':
led_lamp_bt.ino:219: warning: large integer implicitly truncated to unsigned type
C:\Users\1\Downloads\arduino-1.0.4-windows\hardware\tools\avr\bin\avr-g++ -c -g -Os -Wall -fno-exceptions -ffunction-sections -fdata-sections -mmcu=atmega8 -DF_CPU=16000000L -MMD -DUSB_VID=null -DUSB_PID=null -DARDUINO=104 -IC:\Users\1\Downloads\arduino-1.0.4-windows\hardware\arduino\cores\arduino -IC:\Users\1\Downloads\arduino-1.0.4-windows\hardware\arduino\variants\standard -IC:\Users\1\Downloads\arduino-1.0.4-windows\libraries\SoftwareSerial -IC:\Users\1\Downloads\arduino-1.0.4-windows\libraries\EEPROM -IC:\Users\1\Downloads\arduino-1.0.4-windows\libraries\SoftwareSerial\utility C:\Users\1\Downloads\arduino-1.0.4-windows\libraries\SoftwareSerial\SoftwareSerial.cpp -o C:\Users\1\AppData\Local\Temp\build6418823009604165814.tmp\SoftwareSerial\SoftwareSerial.cpp.o 
C:\Users\1\Downloads\arduino-1.0.4-windows\libraries\SoftwareSerial\SoftwareSerial.cpp:59: warning: only initialized variables can be placed into program memory area
C:\Users\1\Downloads\arduino-1.0.4-windows\libraries\SoftwareSerial\SoftwareSerial.cpp: In member function 'void SoftwareSerial::begin(long int)':
C:\Users\1\Downloads\arduino-1.0.4-windows\libraries\SoftwareSerial\SoftwareSerial.cpp:399: error: 'PCICR' was not declared in this scope
C:\Users\1\Downloads\arduino-1.0.4-windows\libraries\SoftwareSerial\SoftwareSerial.cpp:402: error: 'PCMSK2' was not declared in this scope
C:\Users\1\Downloads\arduino-1.0.4-windows\libraries\SoftwareSerial\SoftwareSerial.cpp:402: error: 'PCMSK0' was not declared in this scope
C:\Users\1\Downloads\arduino-1.0.4-windows\libraries\SoftwareSerial\SoftwareSerial.cpp:402: error: 'PCMSK1' was not declared in this scope
C:\Users\1\Downloads\arduino-1.0.4-windows\libraries\SoftwareSerial\SoftwareSerial.cpp: In member function 'void SoftwareSerial::end()':
C:\Users\1\Downloads\arduino-1.0.4-windows\libraries\SoftwareSerial\SoftwareSerial.cpp:417: error: 'PCMSK2' was not declared in this scope
C:\Users\1\Downloads\arduino-1.0.4-windows\libraries\SoftwareSerial\SoftwareSerial.cpp:417: error: 'PCMSK0' was not declared in this scope
C:\Users\1\Downloads\arduino-1.0.4-windows\libraries\SoftwareSerial\SoftwareSerial.cpp:417: error: 'PCMSK1' was not declared in this scope
Клапауций
Offline
Зарегистрирован: 10.02.2013

Потому, что камень ATmega328P-PU отличается от ATmega8 аппаратно.

нет у ATmega8 PCMSK2 и прочего, указанного в логах.

Zhyravlev_AS
Offline
Зарегистрирован: 03.04.2013

Понял.. нужно значит классом выше покупать.. у 168 вроде бы все есть

Zhyravlev_AS
Offline
Зарегистрирован: 03.04.2013

Получается 8 мега не поддерживает работу с блютузом или, это как то все таки можно решить?

Клапауций
Offline
Зарегистрирован: 10.02.2013

Zhyravlev_AS пишет:
Получается 8 мега не поддерживает работу с блютузом или, это как то все таки можно решить?

Не совсем так - ArduinoIDE в дефолтной поставке поддерживает работу только с прописанными в неё платами.

Вообще странно, какой bluetooth.begin( может быть на плате Arduino NG or older w/ ATmega8?

На этой плате нет блютуса, блютус есть на платах Arduino BT w/ ATmega328 и Arduino BT w/ ATmega16.

Соответсвенно все скетчи под эти платы и их камни и писались.

Может, кто и пишет под 8-ю - можно в инете поискать.

зы

Здесь сама философия Arduino идёт в противоречие с желаемым нами - они торгуют платами, а нам их платы не нужны, нужна среда и МК, среду берём бесплатно, а МК покупаем у Атмел - компания Ардуино финансово пролетает.

toc
Offline
Зарегистрирован: 09.02.2013

Клапауций пишет:

компания Ардуино финансово пролетает.

Мне кажется, что компания есть НКО. 

Но точно не мало получает от продажи оригинальных плат.

И, немаловероятно, что атмел участвовал в разработке бизнес-модели и бренда Ардуино.

maksim
Offline
Зарегистрирован: 12.02.2012

Не причем тут не Ардуина, не блютуз, не Arduino NG or older w/ ATmega8.
Вся беда в библиотеке SoftwareSerial. А беда заключается в том что у Atmega8 нет Pin Change Interrupt, которые и пытается заюзать эта либа. Решается эта проблема в вашем случае очень просто, достаточно воспользоваться аппартным UARTом. Да и вообще не понятно зачем вы на ногах аппаратного UARTа пытаетесь поднять программный. 

#include <EEPROM.h>

#define bluetooth Serial

#define PIN_R 3
#define PIN_G 5
#define PIN_B 6

.................................

Но вылазит вторая проблема - этот скейтч не поместится в 8 кбайт, так что оптимизируйте код.