Скетч не загружается в ATmega8A (ошибка при компиляции)
- Войдите на сайт для отправки комментариев
Чт, 18/04/2013 - 13:52
Здравствуйте. Не могу понять, почему скетч
#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
Потому, что камень ATmega328P-PU отличается от ATmega8 аппаратно.
нет у ATmega8 PCMSK2 и прочего, указанного в логах.
Понял.. нужно значит классом выше покупать.. у 168 вроде бы все есть
Получается 8 мега не поддерживает работу с блютузом или, это как то все таки можно решить?
Не совсем так - ArduinoIDE в дефолтной поставке поддерживает работу только с прописанными в неё платами.
Вообще странно, какой bluetooth.begin( может быть на плате Arduino NG or older w/ ATmega8?
На этой плате нет блютуса, блютус есть на платах Arduino BT w/ ATmega328 и Arduino BT w/ ATmega16.
Соответсвенно все скетчи под эти платы и их камни и писались.
Может, кто и пишет под 8-ю - можно в инете поискать.
зы
Здесь сама философия Arduino идёт в противоречие с желаемым нами - они торгуют платами, а нам их платы не нужны, нужна среда и МК, среду берём бесплатно, а МК покупаем у Атмел - компания Ардуино финансово пролетает.
компания Ардуино финансово пролетает.
Мне кажется, что компания есть НКО.
Но точно не мало получает от продажи оригинальных плат.
И, немаловероятно, что атмел участвовал в разработке бизнес-модели и бренда Ардуино.
Не причем тут не Ардуина, не блютуз, не Arduino NG or older w/ ATmega8.
Вся беда в библиотеке SoftwareSerial. А беда заключается в том что у Atmega8 нет Pin Change Interrupt, которые и пытается заюзать эта либа. Решается эта проблема в вашем случае очень просто, достаточно воспользоваться аппартным UARTом. Да и вообще не понятно зачем вы на ногах аппаратного UARTа пытаетесь поднять программный.
Но вылазит вторая проблема - этот скейтч не поместится в 8 кбайт, так что оптимизируйте код.