Скетч не загружается в 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 кбайт, так что оптимизируйте код.