проблема с компиляцией
- Войдите на сайт для отправки комментариев
Пнд, 25/11/2013 - 19:24
Приветствую всех. не думал, что буду регистрироваться тут, но у меня возникла непонятная аномалия. Программировал я значит ардуину про мини, лепил к ней ад9850. среда разработки: Arduino 1.0.5.
в начале ввод частоты по юарту, а потом еще решил добавить энкодер. немного попарился и всё получилось. крутишь - частота меняется. решил немного изменить программу и вдруг начались ошибки компиляции. вернул все взад до того момента когда работало, но оно увы, не компилится.
значит текст моей программы таков:
#include <AD9850.h>
#include <rotary.h>
#include <stdlib>
AD9850 ad(5, 6, 7); // w_clk, fq_ud, d7
Rotary r = Rotary(2, 3);
double b = 10460000;
void setup() {
Serial.begin(9600);
ad.setfreq(b);
PCICR |= (1 << PCIE2);
PCMSK2 |= (1 << PCINT18) | (1 << PCINT19);
sei();
}
void loop() {
if (Serial.available() > 0) //Проверка буфера юарта
{
char freq[10];
for (int i=0; i<8; i++)
{
freq[i] = Serial.read();
delay(5);
}
delay(1);
Serial.write(" ");
delay(1);
Serial.print("Freq: ");
Serial.println(b = atof (freq));
Serial.print("Input new freq");
ad.setfreq(b);
Serial.flush();
}
}
//////////////////////////////обработка прерывания на энкодере
ISR(PCINT2_vect) {
unsigned char result = r.process();
if (result) {
ad.setfreq(b);
Serial.println(result == DIR_CW ? b++ : b-- );
}
}
//////////////////////////////
при компиляции внизу красным шрифтом показывает:
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
ad9850_serial.cpp.o: In function `__static_initialization_and_destruction_0':
C:\Program Files\Arduino/ad9850_serial.ino:5: undefined reference to `Rotary::Rotary(char, char)'
ad9850_serial.cpp.o: In function `__vector_5':
C:\Program Files\Arduino/ad9850_serial.ino:39: undefined reference to `Rotary::process()'
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Значит исходник для энкодера я брал стандартный в примерах AD7C_DDS_VFO/Rotary source/rotary
и как бы оно скомпилировалось и прошилось, и даже работает в железе, но компилиться уже не хочет.
помогите пожалуйста!
Что за файл такой - <stdlib>?
Пятая строка точно Rotary r = Rotary(2, 3);? не Rotary r(2, 3);?
stdlib - это библиотека для
вот этого преобразования(string to boolean); находится в C:\Program Files\Arduino\hardware\tools\avr\avr\include
у меня по крайней мере.
я так понимаю, что ошибка ссылается вот на этот файл:
#include "Arduino.h" #include "rotary.h" /* * The below state table has, for each state (row), the new state * to set based on the next encoder output. From left to right in, * the table, the encoder outputs are 00, 01, 10, 11, and the value * in that position is the new state to set. */ #define R_START 0x0 #ifdef HALF_STEP // Use the half-step state table (emits a code at 00 and 11) #define R_CCW_BEGIN 0x1 #define R_CW_BEGIN 0x2 #define R_START_M 0x3 #define R_CW_BEGIN_M 0x4 #define R_CCW_BEGIN_M 0x5 const unsigned char ttable[6][4] = { // R_START (00) {R_START_M, R_CW_BEGIN, R_CCW_BEGIN, R_START}, // R_CCW_BEGIN {R_START_M | DIR_CCW, R_START, R_CCW_BEGIN, R_START}, // R_CW_BEGIN {R_START_M | DIR_CW, R_CW_BEGIN, R_START, R_START}, // R_START_M (11) {R_START_M, R_CCW_BEGIN_M, R_CW_BEGIN_M, R_START}, // R_CW_BEGIN_M {R_START_M, R_START_M, R_CW_BEGIN_M, R_START | DIR_CW}, // R_CCW_BEGIN_M {R_START_M, R_CCW_BEGIN_M, R_START_M, R_START | DIR_CCW}, }; #else // Use the full-step state table (emits a code at 00 only) #define R_CW_FINAL 0x1 #define R_CW_BEGIN 0x2 #define R_CW_NEXT 0x3 #define R_CCW_BEGIN 0x4 #define R_CCW_FINAL 0x5 #define R_CCW_NEXT 0x6 const unsigned char ttable[7][4] = { // R_START {R_START, R_CW_BEGIN, R_CCW_BEGIN, R_START}, // R_CW_FINAL {R_CW_NEXT, R_START, R_CW_FINAL, R_START | DIR_CW}, // R_CW_BEGIN {R_CW_NEXT, R_CW_BEGIN, R_START, R_START}, // R_CW_NEXT {R_CW_NEXT, R_CW_BEGIN, R_CW_FINAL, R_START}, // R_CCW_BEGIN {R_CCW_NEXT, R_START, R_CCW_BEGIN, R_START}, // R_CCW_FINAL {R_CCW_NEXT, R_CCW_FINAL, R_START, R_START | DIR_CCW}, // R_CCW_NEXT {R_CCW_NEXT, R_CCW_FINAL, R_CCW_BEGIN, R_START}, }; #endif /* * Constructor. Each arg is the pin number for each encoder contact. */ Rotary::Rotary(char _pin1, char _pin2) { // Assign variables. pin1 = _pin1; pin2 = _pin2; // Set pins to input. pinMode(pin1, INPUT); pinMode(pin2, INPUT); #ifdef ENABLE_PULLUPS digitalWrite(pin1, HIGH); digitalWrite(pin2, HIGH); #endif // Initialise state. state = R_START; } unsigned char Rotary::process() { // Grab state of input pins. unsigned char pinstate = (digitalRead(pin2) << 1) | digitalRead(pin1); // Determine new state from the pins and state table. state = ttable[state & 0xf][pinstate]; // Return emit bits, ie the generated event. return state & 0x30; }/* * Rotary encoder library for Arduino. */ #ifndef rotary_h #define rotary_h #include "Arduino.h" // Enable this to emit codes twice per step. //#define HALF_STEP // Enable weak pullups #define ENABLE_PULLUPS // Values returned by 'process' // No complete step yet. #define DIR_NONE 0x0 // Clockwise step. #define DIR_CW 0x10 // Anti-clockwise step. #define DIR_CCW 0x20 class Rotary { public: Rotary(char, char); // Process pin(s) unsigned char process(); private: unsigned char state; unsigned char pin1; unsigned char pin2; }; #endifвот собственно и он. как бы все просто и все работало. То ли вспышка на солнце то ли что, не понимаю.
stdlib - это библиотека для
Я привык - точнее, компиляторы Си меня научили - что библиотека подключается посредством включения заголовочного файла. А они, как правило, имеют расширение ".h"
т.е.
а, ну да, видимо рука дрогнула, так я и писал. хотя странно, что работало без указания полного имени файла. но это как бы ничего не меняет.
прошу прощения - код управления синтезатором я взял отсюда http://www.ad7c.com/projects/ad9850-dds-vfo/
Ну чтож, проблема вроде как решена: запарился с переустановкой программы - не помогло. оказывается необходимо, чтоб рядом с файлом file.h был файл file.cpp. жаль, что не нашел где об этом условии можно почитать - все экспериментальным образом. правда так и не понял почему у меня тогда перестало работать, видимо что-то случайно удалил или переместил. короче кому интересно - программа, приведенная выше работает и энкодер отрабатывает очень четко. библиотека для AD9850 тут https://code.google.com/p/ad9850-arduino/downloads/detail?name=ad9850-arduino-r6.tar.gz&can=2&q=
Расскажите, пожалуйста, как получилось запустить эту плату?
Смотрю на выход осцилографом - пусто. И с микросхемы ничего не идёт, ни синуса, ни меандра.
На ножки микросхемы библиотечные посылки приходят. На основе примера делаю свайп частоты с 100 до 200 Гц - пусто. Куда копать?
barada, неплохое решение с библиотекой для AD9850.
Осталось дисплей прикрутить.
Небольшие разъяснения сделал в скетче , если кто захочет повторить
Копилируется в ID 1.6.8