проблема с компиляцией

barada
Offline
Зарегистрирован: 25.11.2013

Приветствую всех. не думал, что буду регистрироваться тут, но у меня возникла непонятная аномалия. Программировал я значит ардуину про мини, лепил к ней ад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
 
 
и как бы оно скомпилировалось и прошилось, и даже работает в железе, но компилиться уже не хочет.
помогите пожалуйста!
step962
Offline
Зарегистрирован: 23.05.2011

Что за файл такой - <stdlib>?

Пятая строка точно Rotary r = Rotary(2, 3);? не Rotary r(2, 3);? 

barada
Offline
Зарегистрирован: 25.11.2013

stdlib - это библиотека для 

 Serial.println(b = atof (freq));

вот этого преобразования(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.cpp, находится рядом с rotary.h
/*
 * 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
  

вот собственно и он. как бы все просто и все работало. То ли вспышка на солнце то ли что, не понимаю.

 

step962
Offline
Зарегистрирован: 23.05.2011

barada пишет:

stdlib - это библиотека для 

 Serial.println(b = atof (freq));

Я привык - точнее, компиляторы Си меня научили - что библиотека подключается посредством включения заголовочного файла. А они, как правило, имеют расширение ".h"

т.е.

#include <AD9850.h>
#include <rotary.h>
ну и
#include <stdlib.h>
соответственно...
 
barada
Offline
Зарегистрирован: 25.11.2013

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

barada
Offline
Зарегистрирован: 25.11.2013

прошу прощения - код управления синтезатором я взял отсюда http://www.ad7c.com/projects/ad9850-dds-vfo/

barada
Offline
Зарегистрирован: 25.11.2013

Ну чтож, проблема вроде как решена: запарился с переустановкой программы - не помогло. оказывается необходимо, чтоб рядом с файлом file.h был файл file.cpp. жаль, что не нашел где об этом условии можно почитать - все экспериментальным образом. правда так и не понял почему у меня тогда перестало работать, видимо что-то случайно удалил или переместил. короче кому интересно - программа, приведенная выше работает и энкодер отрабатывает очень четко. библиотека для AD9850 тут https://code.google.com/p/ad9850-arduino/downloads/detail?name=ad9850-arduino-r6.tar.gz&can=2&q=

iwe
Offline
Зарегистрирован: 22.10.2014

Расскажите, пожалуйста, как получилось запустить эту плату?

Смотрю на выход осцилографом - пусто. И с микросхемы ничего не идёт, ни синуса, ни меандра.

На ножки микросхемы библиотечные посылки приходят. На основе примера делаю свайп частоты с 100 до 200 Гц - пусто. Куда копать?

Mining
Offline
Зарегистрирован: 31.01.2016

barada, неплохое решение с библиотекой для AD9850.

Осталось дисплей прикрутить.

Небольшие разъяснения сделал в скетче , если кто захочет повторить

Копилируется в ID 1.6.8

/*
 http://arduino.ru/forum/programmirovanie/problema-s-kompilyatsiei-0#comment-48868
 библиотека для AD9850 тут https://code.google.com/archive/p/ad9850-arduino/downloads
 проверено с библиотекой ad9850-arduino-r6 
 скомпелирован скетч в ID 1.6.8
 */
#include <AD9850.h> //бибилотека ad9850-arduino-r6
//#include <rotary.h>
#include <Rotary.h> //библиотека энклдера, подключил свою т.к. у меня нет rotary.h
#include <stdlib.h> //библиотека в ID 1.6.8 нашлась сама
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-- );
  }
} 
     //////////////////////////////