Телескопы покупают здесь


A A A A Автор Тема: Контроллер КФ.  (Прочитано 105452 раз)

0 Пользователей и 3 Гостей просматривают эту тему.

Оффлайн Ivan7enych

  • Модератор
  • *****
  • Сообщений: 12 060
  • Благодарностей: 765
  • Ионов Иван
  • Награды Победитель ежегодного конкурса астрофото
    • Сообщения от Ivan7enych
    • Астропроекты и астрософт
Re: Контроллер КФ.
« Ответ #180 : 20 Дек 2007 [15:07:18] »
    Иван, в данном конкретном случае анализ бита готовности приведет только к снижению общего быстродействия. Поскольку прерывания невозможны, то лучше всего выполнить гарантированно большую задержку и затем считывать данные. Задержку можно выполнить не отдельным куском кода, а например кол-вом циклов фоновой работы. Т.Е. дал команду temperature_start затем отсчитал например 50-100 циклов опроса клавиатуры, затем температуру прочитал.


Я пока попробую с флагом (буду читать его между опросами клавиатуры, и если готов - читать температуру),
а если не выйдет - сделаю так как ты предлагаешь.

Можешь посмотреть, я правильно написал чтение флага? (я в основном беспокоюсь за правильность расстановки i2start i2ack, i2nack...)

Цитата
   i2start();
   i2write(0x90 | (termometr * 2)); // режим записи
   i2ack();     
   i2write(0xAC);     // Reads or writes the 1-byte configuration register.
   i2ack();

   i2start();
   i2write( 0x91 | (termometr * 2) );  // режим чтения
   i2ack();
   char fl = i2read();
   i2nack();
   i2stop();

char ready = fl & 0x80;
Видео отчеты мастерской
телескопы - 230мм/4 самодельный ньютон для поездок, Televue NP101is на удаленке, 500мм ньютон в постройке.
Просьбы о ремонте пишите мне в телеграм, не в личку.

Оффлайн Александр Л.

  • *****
  • Сообщений: 3 682
  • Благодарностей: 49
  • Мне нравится этот форум!
    • Сообщения от Александр Л.
Re: Контроллер КФ.
« Ответ #181 : 20 Дек 2007 [16:49:06] »
  Иван, постараюсь разобраться, но до завтра. Сейчас можешь посмотреть этот документ - http://pdfserv.maxim-ic.com/en/an/app135.pdf . И этот  http://pdfserv.maxim-ic.com/en/ds/DS1631-DS1731.pdf на 14 странице.
« Последнее редактирование: 20 Дек 2007 [16:51:53] от Александр Л. »

Оффлайн Ivan7enych

  • Модератор
  • *****
  • Сообщений: 12 060
  • Благодарностей: 765
  • Ионов Иван
  • Награды Победитель ежегодного конкурса астрофото
    • Сообщения от Ivan7enych
    • Астропроекты и астрософт
Re: Контроллер КФ.
« Ответ #182 : 20 Дек 2007 [16:53:57] »
  Иван, постараюсь разобраться, но до завтра. Сейчас можешь посмотреть этот документ - http://pdfserv.maxim-ic.com/en/an/app135.pdf . И этот  http://pdfserv.maxim-ic.com/en/ds/DS1631-DS1731.pdf на 14 странице.

Спасибо, хорошее описание.
Работу с флагом готовности сегодня вечером проверю.
Видео отчеты мастерской
телескопы - 230мм/4 самодельный ньютон для поездок, Televue NP101is на удаленке, 500мм ньютон в постройке.
Просьбы о ремонте пишите мне в телеграм, не в личку.

Оффлайн lazyBSD

  • *****
  • Сообщений: 3 335
  • Благодарностей: 10
    • Сообщения от lazyBSD
Re: Контроллер КФ.
« Ответ #183 : 20 Дек 2007 [20:00:33] »
Работу с флагом готовности сегодня вечером проверю.
Может лучше таймер использовать?
http://www.sax.de/~joerg/avr-timer/
/ссылка запрещена правилами форума/

Оффлайн lazyBSD

  • *****
  • Сообщений: 3 335
  • Благодарностей: 10
    • Сообщения от lazyBSD
Re: Контроллер КФ.
« Ответ #184 : 21 Дек 2007 [00:25:15] »
Может лучше таймер использовать?

#include <avr/interrupt.h>
#include <avr/io.h>

unsigned char gTicks=0;

#define TIMER_TICS_PER_SECOND   16
#define SENSOR_DELAY_TICKS      TIMER_TICS_PER_SECOND*3/4

//-----------------------------------------------------------------------------
SIGNAL(SIG_OVERFLOW0){
  if (++gTicks==TIMER_TICS_PER_SECOND) gTicks=0;
}

void stop_timer0(void) {
        TCCR0=0;
}

void start_timer0(void) {
  TCCR0 = ( 1<<CS02 ) || ( 1<<CS00 );    // 1024 prescale At 4MHz we get 15.26 overflows
  TIFR = 1 << TOV0;
  TIMSK = 1 << TOIE0;
}

void start_sensor_meas(void) { asm("nop"); }
void read_sensor_meas (void) { asm("nop"); }

//-----------------------------------------------------------------------------
int main(void) {

  unsigned char ConversionStarted=0;

  start_timer0();
  asm("sei");

  while (1){

        switch (ConversionStarted) {

          case 0:
                start_sensor_meas();
                ConversionStarted=1;
                gTicks=0;
                break;

          case 1:
                if (gTicks==SENSOR_DELAY_TICKS) {
                  ConversionStarted=0;
                  read_sensor_meas();
                }
                break;

        }

  }
}

/ссылка запрещена правилами форума/

Оффлайн Ivan7enych

  • Модератор
  • *****
  • Сообщений: 12 060
  • Благодарностей: 765
  • Ионов Иван
  • Награды Победитель ежегодного конкурса астрофото
    • Сообщения от Ivan7enych
    • Астропроекты и астрософт
Re: Контроллер КФ.
« Ответ #185 : 21 Дек 2007 [00:42:47] »
Работу с флагом готовности сегодня вечером проверю.
Может лучше таймер использовать?
http://www.sax.de/~joerg/avr-timer/

Ну не люблю я таймеры, чуть что изменилось (частота, битность термометра) - опять настраивать.

Сделал ожидание флага готовности.

Графики очень заметно выровнялись, на картинке - термометры сначала на улице, затем внес в комнату. На градиенте теперь никакого лишнего шума, все выбросы исчезли.

С флагом оказалась засада - если термометр включить в режим непрерывного измерения, то флаг никогда не выставляется.
А на разовых измерениях все работает нормально.

Посмотрел описание DS1821, их логика работы ровно такая же, только шина другая и цифры команд слегка иные.
« Последнее редактирование: 21 Дек 2007 [01:09:45] от Ivan7enych »
Видео отчеты мастерской
телескопы - 230мм/4 самодельный ньютон для поездок, Televue NP101is на удаленке, 500мм ньютон в постройке.
Просьбы о ремонте пишите мне в телеграм, не в личку.

Оффлайн Ivan7enych

  • Модератор
  • *****
  • Сообщений: 12 060
  • Благодарностей: 765
  • Ионов Иван
  • Награды Победитель ежегодного конкурса астрофото
    • Сообщения от Ivan7enych
    • Астропроекты и астрософт
Re: Контроллер КФ.
« Ответ #186 : 21 Дек 2007 [01:15:39] »
Температура считывается примерно каждые 0.8секунды. Осреднение =10 дает среднюю температуру за последние 8 секунд.
Если выдернуть термометр и воткнуть другой - внутренние данные сбрасываются и осреднение начинается по новой. Вот на картинке, было воткнуто 2 термометра, затем в процессе работы вынул и включил 3-й.

Термокомпенсацию тоже завязал на параметр осреднения, она будет срабатывать раз в 8 сек при осреднении=10, или раз в минуту (осреднение=80).
Видео отчеты мастерской
телескопы - 230мм/4 самодельный ньютон для поездок, Televue NP101is на удаленке, 500мм ньютон в постройке.
Просьбы о ремонте пишите мне в телеграм, не в личку.

Оффлайн Ivan7enych

  • Модератор
  • *****
  • Сообщений: 12 060
  • Благодарностей: 765
  • Ионов Иван
  • Награды Победитель ежегодного конкурса астрофото
    • Сообщения от Ivan7enych
    • Астропроекты и астрософт
Re: Контроллер КФ.
« Ответ #187 : 21 Дек 2007 [01:28:56] »
либо заниматься изучением временной диаграммы шины I2C, точнее ее микропрограммной реализации
Скорее всего, именно это и нужно смотреть. Очень смущает функция pause1:

Вот фронты при задержке =30 и длинне шнура 8метров. По моему картина очень далека от предельной.
При такой задержке частота = 13КГц, сама микруха DS1621, судя по описанию, нормально работает вплоть до 400КГц на шине.
Видео отчеты мастерской
телескопы - 230мм/4 самодельный ньютон для поездок, Televue NP101is на удаленке, 500мм ньютон в постройке.
Просьбы о ремонте пишите мне в телеграм, не в личку.

Оффлайн lazyBSD

  • *****
  • Сообщений: 3 335
  • Благодарностей: 10
    • Сообщения от lazyBSD
Re: Контроллер КФ.
« Ответ #188 : 21 Дек 2007 [14:32:35] »
Вот фронты
[offtop]
PCSU1000?
[/offtop]

С памятью проблемы, я не могу интегрировать код DS1820 в прошивку.

AVR Memory Usage:
-----------------
Device: atmega16

Program:   11976 bytes (73,1% Full)
(.text + .data + .bootloader)

Data:       1009 bytes (98,5% Full)
(.data + .bss + .noinit)

EEPROM:      140 bytes (27,3% Full)
(.eeprom)


Для ds1820 нужно:

AVR Memory Usage:
-----------------
Device: atmega16

Program:    1762 bytes (10,8% Full)
(.text + .data + .bootloader)

Data:         72 bytes (7,0% Full)
(.data + .bss + .noinit)


Может перенести все строковые константы в еепром?

lcd_out.h:

-void lcd_xy (unsigned int X,unsigned int Y)
-{
-        unsigned int adress = 0;                                               
-        switch (Y)                                                             
-        {                                                                       
-        case 0:                                                                 
-                {                                                               
-                        adress=(X+0x80-1);                                     
-                        break;                                                 
-                }                                                               
-                                                                               
-        case 1:                                                                 
-                {                                                               
-                        adress=(X+0xC0-1);                                     
-                        break;                                                 
-                }                                                               
-        }                                                                       
-        lcd_com(adress);
-}
+#define lcd_xy(X,Y)     lcd_com(X+0x80+0x40*Y-1)

-void lcd_cursor_off (void)                                                     
-{                                                                               
-        lcd_com(0x0C);                                                         
-}
+#define lcd_cursor_off()        lcd_com(0x0C)

« Последнее редактирование: 21 Дек 2007 [14:50:33] от lazyBSD »
/ссылка запрещена правилами форума/

Оффлайн Ivan7enych

  • Модератор
  • *****
  • Сообщений: 12 060
  • Благодарностей: 765
  • Ионов Иван
  • Награды Победитель ежегодного конкурса астрофото
    • Сообщения от Ivan7enych
    • Астропроекты и астрософт
Re: Контроллер КФ.
« Ответ #189 : 21 Дек 2007 [14:49:22] »
[offtop]
PCSU1000?
[/offtop]

Он, родимый.

С памятью проблемы, я не могу интегрировать код DS1820 в прошивку.
Может перенести все строковые константы в еепром?

Можно. Там какую-то приставку перед строчкой писать надо?

Кстати, чем ты требуемую память смотришь? WinAvr выдает что-то другое.
Цитата
AVR Memory Usage:
-----------------
Device: atmega16

Program:   11976 bytes (73,1% Full)
(.text + .data + .bootloader)

Data:       1009 bytes (98,5% Full)
(.data + .bss + .noinit)

EEPROM:      140 bytes (27,3% Full)
(.eeprom)
« Последнее редактирование: 21 Дек 2007 [15:12:27] от Ivan7enych »
Видео отчеты мастерской
телескопы - 230мм/4 самодельный ньютон для поездок, Televue NP101is на удаленке, 500мм ньютон в постройке.
Просьбы о ремонте пишите мне в телеграм, не в личку.

Оффлайн lazyBSD

  • *****
  • Сообщений: 3 335
  • Благодарностей: 10
    • Сообщения от lazyBSD
Re: Контроллер КФ.
« Ответ #190 : 21 Дек 2007 [15:05:22] »
Он, родимый.
Думаю прикупить...

Можно. Там какую-то приставку перед строчкой писать надо?
Да, примерно так:
eeprom_data.h, перед #endif // ATmega devices :

char ee_t0[] EEPROM_SECTION ="Focuser FilterWl";
char ee_t3[] EEPROM_SECTION ="Alexander & Ivan";


Только читая эти переменные в буфер в памяти, пользуйся, пожалуйста, библиотечными функциями из avr/eeprom.h.
eeprom_io.h их полностью повторяет. Зачем дублировать код?
« Последнее редактирование: 21 Дек 2007 [15:09:25] от lazyBSD »
/ссылка запрещена правилами форума/

Оффлайн lazyBSD

  • *****
  • Сообщений: 3 335
  • Благодарностей: 10
    • Сообщения от lazyBSD
Re: Контроллер КФ.
« Ответ #191 : 21 Дек 2007 [15:19:39] »
Кстати, чем ты требуемую память смотришь? WinAvr выдает что-то другое.
Я на FreeBSD компилирую. ;)

home$ pkg_info | grep avr
avr-binutils-2.18_1 GNU binutils for Atmel AVR 8-bit RISC cross-development
avr-gcc-4.2.2       FSF GCC 4.x for Atmel AVR 8-bit RISC cross-development
avr-libc-1.4.7,1    A C and math library for the Atmel AVR controller family
home$

Память смотрю этим. Взято отсюда. :)
/ссылка запрещена правилами форума/

Оффлайн Ivan7enych

  • Модератор
  • *****
  • Сообщений: 12 060
  • Благодарностей: 765
  • Ионов Иван
  • Награды Победитель ежегодного конкурса астрофото
    • Сообщения от Ivan7enych
    • Астропроекты и астрософт
Re: Контроллер КФ.
« Ответ #192 : 21 Дек 2007 [15:36:34] »
Память смотрю этим. Взято отсюда. :)

Это вроде простой скрипт, складывающий ".data + .bss + .noinit"

У меня эта цифра вроде = 753, судя по результатам WinAvr.

Size after:
filterwheel2.elf  :
section            size      addr
.text             10772         0
.data               236   8388704
.bss                517   8388940
.noinit               0   8389457
.eeprom             140   8454144
.stab               876         0
.stabstr            132         0
.debug_aranges       20         0
.debug_pubnames    2028         0
.debug_info        6661         0
.debug_abbrev       571         0
.debug_line        6327         0
.debug_str         2567         0
Total             30847
« Последнее редактирование: 21 Дек 2007 [15:38:43] от Ivan7enych »
Видео отчеты мастерской
телескопы - 230мм/4 самодельный ньютон для поездок, Televue NP101is на удаленке, 500мм ньютон в постройке.
Просьбы о ремонте пишите мне в телеграм, не в личку.

Оффлайн lazyBSD

  • *****
  • Сообщений: 3 335
  • Благодарностей: 10
    • Сообщения от lazyBSD
Re: Контроллер КФ.
« Ответ #193 : 21 Дек 2007 [16:34:34] »
С твоим мейкфайлом.

gcc-4.2.2:

Size after:
filterwheel2.elf  :
section            size      addr
.text             11530         0
.data               492   8388704
.bss                441   8389196
.eeprom             140   8454144
.stab              8796         0
.stabstr          25506         0
.debug_aranges       32         0
.debug_pubnames    2028         0
.debug_info        7293         0
.debug_abbrev       849         0
.debug_line        7683         0
.debug_frame       1152         0
.debug_str         2736         0
.debug_loc         4552         0
Total             73230


gcc-3.4.6:

Size after:
filterwheel2.elf  :
section            size      addr
.text             11004         0
.data               236   8388704
.bss                441   8388940
.eeprom             140   8454144
.stab              6084         0
.stabstr            972         0
.debug_aranges       20         0
.debug_pubnames    2028         0
.debug_info        6772         0
.debug_abbrev       571         0
.debug_line        6552         0
.debug_str         2540         0
Total             37360

 ::)

gcc-4 - фтопку.  ;D
/ссылка запрещена правилами форума/

Оффлайн Ivan7enych

  • Модератор
  • *****
  • Сообщений: 12 060
  • Благодарностей: 765
  • Ионов Иван
  • Награды Победитель ежегодного конкурса астрофото
    • Сообщения от Ivan7enych
    • Астропроекты и астрософт
Re: Контроллер КФ.
« Ответ #194 : 21 Дек 2007 [16:54:28] »
Цитата
gcc-4 - фтопку.
Однако....   ::)

Цитата
Только читая эти переменные в буфер в памяти, пользуйся, пожалуйста, библиотечными функциями из avr/eeprom.h.
eeprom_io.h их полностью повторяет. Зачем дублировать код?

Попробовал использовать библиотечные функции - фигня какая-то.
Мне надо банально взять байт из EEPROM по данному адресу. А штатная функция eeprom_read_byte() работает только на первых 256 адресах из 512 возможных, а строчки залезают за 256. Короче в топку.
« Последнее редактирование: 21 Дек 2007 [16:56:21] от Ivan7enych »
Видео отчеты мастерской
телескопы - 230мм/4 самодельный ньютон для поездок, Televue NP101is на удаленке, 500мм ньютон в постройке.
Просьбы о ремонте пишите мне в телеграм, не в личку.

Оффлайн lazyBSD

  • *****
  • Сообщений: 3 335
  • Благодарностей: 10
    • Сообщения от lazyBSD
Re: Контроллер КФ.
« Ответ #195 : 21 Дек 2007 [17:15:39] »
Странно...

Кста, cегодня вышел новый WinAVR. :) http://sourceforge.net/project/showfiles.php?group_id=68108
/ссылка запрещена правилами форума/

Оффлайн Ivan7enych

  • Модератор
  • *****
  • Сообщений: 12 060
  • Благодарностей: 765
  • Ионов Иван
  • Награды Победитель ежегодного конкурса астрофото
    • Сообщения от Ivan7enych
    • Астропроекты и астрософт
Re: Контроллер КФ.
« Ответ #196 : 21 Дек 2007 [17:53:24] »
Странно...
Кста, cегодня вышел новый WinAVR. :) http://sourceforge.net/project/showfiles.php?group_id=68108

Попробовал: код получился на 1кб больше, оперативной памяти потребовал ровно на 256 байт больше.
Сравнивал с версией от 20060421.

Может какие ключи есть, чтобы он так не делал?
« Последнее редактирование: 21 Дек 2007 [17:56:54] от Ivan7enych »
Видео отчеты мастерской
телескопы - 230мм/4 самодельный ньютон для поездок, Televue NP101is на удаленке, 500мм ньютон в постройке.
Просьбы о ремонте пишите мне в телеграм, не в личку.

Оффлайн lazyBSD

  • *****
  • Сообщений: 3 335
  • Благодарностей: 10
    • Сообщения от lazyBSD
Re: Контроллер КФ.
« Ответ #197 : 21 Дек 2007 [18:18:29] »
Попробовал: код получился на 1кб больше, оперативной памяти потребовал ровно на 256 байт больше.
Сравнивал с версией от 20060421.
Почти как при переходе на gcc-4.  >:(

Может какие ключи есть, чтобы он так не делал?
Может быть и есть ключи.
Попробуй:
-mcall-prologues
          Functions prologues/epilogues expanded as call to appropriate
          subroutines.  Code size will be smaller.
-mno-tablejump
          Do not generate tablejump insns which sometimes increase code
          size.

Ну да, они на 4.2.2 переползли:
http://lists.gnu.org/archive/html/avr-gcc-list/2007-12/msg00061.html

Вот частичное решение:
http://www.incunabulum.de/blog/archive/2007/06/05/avr-code-size-optimization-revisited

Цитата
Simply adding:

    * CFLAGS += -ffunction-sections
    * LDFLAGS += -Wl,--gc-sections
Не помогает.  >:(

Посмотрел вывод avr-objdump:

$ avr-objdump -h -S -x -d -s -g -t -T -a -f -p filterwheel2.elf | grep clz_tab
avr-objdump: filterwheel2.elf: not a dynamic object
0080014b g     O .data  00000100 __clz_tab
 6360 5f5f636c 7a5f7461 623a4728 302c3136  __clz_tab:G(0,16
UQItype const __clz_tab[256]:uint16 /* 0x80014b */;

Вот наша проблема:
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=29524 >:(
Цитата
------- Comment #12 From Mark Mitchell 2007-10-09 19:22 -------

Change target milestone to 4.2.3, as 4.2.2 has been released.

Сейчас попробую avr-libc проапдейтить до 1.5-devel, как рекомендуют здесь.

В общем так. На данный момент решения два:
1. gcc-3 и ждать 4.2.3
2. отказаться от использования float в программе.
« Последнее редактирование: 21 Дек 2007 [21:44:47] от lazyBSD »
/ссылка запрещена правилами форума/

Оффлайн Ivan7enych

  • Модератор
  • *****
  • Сообщений: 12 060
  • Благодарностей: 765
  • Ионов Иван
  • Награды Победитель ежегодного конкурса астрофото
    • Сообщения от Ivan7enych
    • Астропроекты и астрософт
Re: Контроллер КФ.
« Ответ #198 : 21 Дек 2007 [22:07:28] »
2. отказаться от использования float в программе.

На флоатах сделано несколько умножений и делений.
А 32-битная арифметика у нас есть? (+ - * /) Если да, то могу на нее перевести эти вычисления.

Вроде есть всякие int32_t uint32_t, работают.

Надеюсь, они не через ту же библиотеку эмулируются?
« Последнее редактирование: 21 Дек 2007 [22:32:08] от Ivan7enych »
Видео отчеты мастерской
телескопы - 230мм/4 самодельный ньютон для поездок, Televue NP101is на удаленке, 500мм ньютон в постройке.
Просьбы о ремонте пишите мне в телеграм, не в личку.

Оффлайн lazyBSD

  • *****
  • Сообщений: 3 335
  • Благодарностей: 10
    • Сообщения от lazyBSD
Re: Контроллер КФ.
« Ответ #199 : 22 Дек 2007 [15:01:16] »
Нашел все, что провоцирует gcc-4 на глюки. ;)

1. строка
               double delayMs = (500.0 * EEData.m_MotorStep) / currSpeed - 0.43;
в wakeupMotor из step_motors.h

2. строка
               tempers[ i ] = ((float)count * tempers[ i ] + temper) / ((float)(count + 1))
в readTemperature из filterwheel2.c

Остальные float и double можно оставить.

Патч для step_motors.h:
- double delayMs = (500.0 * EEData.m_MotorStep) / currSpeed - 0.43;
+ double delayMs = (500.0 * EEData.m_MotorStep) / (int)currSpeed - 0.43;

Патч для filterwheel2.c:
-tempers[ i ] = ((float)count * tempers[ i ] + temper) / ((float)(count + 1));
+tempers[ i ] = ((int)count * tempers[ i ] + (int)temper) / (int)(count + 1);


Size after:
filterwheel2.elf  :
section            size      addr
.text             10914         0
.data               236   8388704
.bss                441   8388940
.eeprom             140   8454144
.stab              8292         0
.stabstr            904         0
.debug_aranges      600         0
.debug_pubnames    2028         0
.debug_info        7289         0
.debug_abbrev       847         0
.debug_line        8533         0
.debug_frame       1152         0
.debug_str         2745         0
.debug_loc         4625         0
Total             48746

AVR Memory Usage:
-----------------
Device: atmega16

Program:   11150 bytes (68,1% Full)
(.text + .data + .bootloader)

Data:        677 bytes (66,1% Full)
(.data + .bss + .noinit)

EEPROM:      140 bytes (27,3% Full)
(.eeprom)

home$ avr-gcc --version
avr-gcc (GCC) 4.2.2
Copyright (C) 2007 Free Software Foundation, Inc.
Это свободно распространяемое программное обеспечение. Условия копирования
приведены в исходных текстах. Без гарантии каких-либо качеств, включая
коммерческую ценность и применимость для каких-либо целей.

home$


Makefile:
+LDFLAGS += -Wl,--relax

Получаем еще более компактный код.

AVR Memory Usage:
-----------------
Device: atmega16

Program:   10722 bytes (65,4% Full)
(.text + .data + .bootloader)

Data:        677 bytes (66,1% Full)
(.data + .bss + .noinit)

EEPROM:      140 bytes (27,3% Full)
(.eeprom)


Иван, проверь, пожалуйста, работоспособность.
« Последнее редактирование: 22 Дек 2007 [16:26:48] от lazyBSD »
/ссылка запрещена правилами форума/