Перейти к содержанию
    

marus-ka

Участник
  • Постов

    55
  • Зарегистрирован

  • Посещение

Весь контент marus-ka


  1. Всем привет! Есть необходимость создать 1-wire slave устройство, точнее сразу несколько. Так как не было ни мастера, ни слейва, нужно было для отладки создать и то, и другое. Для мастера была взята библиотека отсюда для слейва после гугления тоже нашлась, правда несколько странная и пришлось ее немного "допилить". Все работало прекрасно, пока была связь точка-точка. Как только подключаю еще один-два слейв устройства, начинается свистопляска при поиске. То одно устройство находится мастером, то два, то одно аж два раза. Было принято стратегическое решение найти "нормального" мастера и "нормальных" слейвов, чтобы тестировать с ними. В закромах Родины нашелся переходник USB-1-wire от Maxim (мастер) и платка с термодатчиком, реле и UIDом (слейвы). И тут тоже самое. Подправила задержки, вроде "нормальный" мастер обнаруживает мое устройство, но получается такая же свистопляска, если подключать более одного слейва. Все тайминги проверила ( по крайней мере постаралась). Все равно не работает( А вообще должно? Как в реальных сетях? Поиск выполняется мастером однократно в начале? Или мониторится сеть постоянно и перебои в количестве обнаруживаемых устройств это в рамках нормы? Куда копать? Тех. детали: в качестве моего слейва платка с контроллером xmega32d4, дергает ногой, не уартом.
  2. Error[Lc003]: IAR for ARM

    Сама не люблю темы без окончательного ответа, поэтому решила отписаться. Изначально было непонятно, какие настройки линкера стоит ставить для совпадения программного и линкерного расчетов, правильно ли считается программно, по какому диапазону считается CRC (совпадает ли он с диапазоном заполнения), есть ли какие-то отличия в алгоритме подсчета CRC для первых байт (или таблицы векторов прерываний) и для остальной части кода, почему для заполненных диапазонов CRC программное и линкерное совпадало. Были прочитаны форумы, википедии и документация на линкер. В итоге мне помогло тупое перебирание способов подсчета CRC (разных галочек в меню линкера) и порядка байт при подсчете. Смогла проверить с помощью он-лайн калькулятора CRC программный способ подсчета CRC. Программно все было правильно. А с помощью калькулятора все гипотезы удавалось проверять быстрее, чем прогоняя код. Для проверки для простоты брала первые 2 или 4 байта ( в разных экспериментах) с первой страницы кода. Было выяснено, что IAR при подсчете CRC два соседних байта меняет местами. Причем, если убрать галку с пункта reverse byte order within word (что должно бы помочь от смены мест байт), получается еще какой-то вариант расчета, который не совпадает ни с одним из тех, что представлены в калькуляторе. При подсчете CRC области памяти заполненной одинаковыми байтами линкерный и программный способы совпадали именно из-за одинаковости байт. Они менялись местами, но так как одинаковые, на результат расчета это не влияло. Еще были сомнения, что CRC считается как-то особенно для первых байт или таблицы векторов прерываний. Это не подтвердилось - проверила с помощью подсчета CRC по алгоритму прямой суммы. Таким образом, для обеспечения совпадения программного и линкерного расчета перед программным расчетом меняю соседние байты местами.
  3. Error[Lc003]: IAR for ARM

    У меня изначально была концепция проверять crc в бутлоадере, поэтому такой подход как у вас, если я его правильно понимаю, мне не подходит. Пока от своей концепции я не хочу отказываться, но, возможно, придется. Я изначально хотела не скопировать чей-то пример, а разобраться, именно поэтому задавала и задаю вопросы. Если вы не считаете нужным и правильным отвечать, зачем тогда продолжать разговор?
  4. Error[Lc003]: IAR for ARM

    Спасибо за уделенное время. Контроллер у меня другой алгоритм расчета Crc тоже. Поэтому предоставленные вами примеры мне не сильно помогли, к сожалению. Я, естественно, перед тем, как писать на форум, попробовала все возможные настройки линкера и прочитала документацию на компилятор.
  5. Error[Lc003]: IAR for ARM

    Для меня это не очевидно. Поля Start address и End address доступны для записи в них значений даже если расчет CRC не производится. Поэтому более логично, что это именно диапазон для Fill pattern. И путем экспериментов выяснила, что диапазон расчета CRC совпадает. Только вот сама crc не сходится. Да и так уж обязательно, что это должно быть значение стертой flash? Я в документации на IAR этого не нашла. Насколько я помню там пишут, что это может быть любое число. Мне понятнее не стало, так как я меняю это значение адрес crc не меняется. Или что должно меняться в зависимости от выравнивания? Просто это мой первый опыт работы с 32х разрядными МК, а в 8 разрядных как-то не приходилось с этим сталкиваться.
  6. Error[Lc003]: IAR for ARM

    Спасибо за ответ! Мне в нем еще разбираться и разбираться))) У меня IAR 7.20 и контроллер SAM D20. А у меня вот такие настройки: 0x4000 это адрес начала application section. Если делать заполнение с 0 до 0x4000, а в bootloader считать CRC от массива с таким же заполнением и длиной, то все сходится. Как только добавляю хоть одну страницу кода, не сходится. Если считать только одну страницу кода, тоже не сходится. Если считать страницу кода после таблицы векторов прерываний, не сходится. И еще вопрос от блондинки, никак не могу понять что значит aligment 4 для CRC16. Понимаю, что глупый вопрос, но вот так)
  7. Error[Lc003]: IAR for ARM

    Всем привет! И снова у меня проблемы с crc. Теперь с IAR ARM. Пыталась двумя способами: через меню линкера и через файл линкера. Через меню: не сходится с программным расчетом. Что пробовала: разные алгоритмы: CRC16, CRC32 и разные настройки (Reverse, initial value и т.д.) Код для программного расчета брала из EWARM IAR C/C++ Development Guide Что непонятно: как указывать диапазон адресов из которых вычисляется CRC? (есть подозрение, что это несовпадение связано именно с несовпадением диапазонов данных, которые считаются) Совпадает ли он с диапазоном для Fill unused code memory? А если нет, то как его настроить, чтобы вычислялся только по коду, а не по пустому месту? Через файл icf: постоянно возникает ошибка Error[Lc003]: expected "check", "define", "do", "export", "if", "include", "initialize", "keep", "place", or a placement label, D:\IAR_projects\ARM\concentrator_RE013_M0+\samd20g16_flash.icf 78 В icf файле определяю блок CHECKSUM, и пишу следующее из EWARM IAR C/C++ Development Guide ielftool --fill=0xdd; 0x00000000 – 0x00010000; --checksum=__checksum:2,crc16;0x00000000 – 0x00010000 concentrator_RE013_M0+.out.temp concentrator_RE013_M0+.out. Пробовала просто fill, та же ошибка. Гуглила, не помогло((( Что я делаю не так? :crying:
  8. Спасибо за комментарий. Только сегодня увидела, так как забыла что несмотря на соответствующую галку оповещения об ответах не приходят на почту. Дизассемблер действительно помог. Выяснила, что все же уходит в hard fault из-за попытки записи за границы sram, что было вызвано неправильной установкой значения переменной, которая задавала номер элемента массива для записи.
  9. Да, спасибо за совет. Сама думала проверить эту гипотезу, но забыла. Судя по описанию, фьюзам и значениям регистров в debug режиме watchdog выключен. Еще дополнение. Оказывается, курсор прыгает на начало main в отладке, а следующим шагом на строку, следующую за той, после которой перепрыгнул на начало main. И вот в этой второй строке он вообще уходит непонятно куда. Просто дебаггер висит и все. Если нажать break в этот момент, все равно весит. Поставила точку останова в reset_handler, код там останавливается только в самом начале.
  10. Всем привет! Пишу в Atmel Studio (6.2.1153) проект для samd20. Вообще это мой первый опыт работы с 32 разрядными Мк, до этого были только 8-разрядные и не в atmel studio. Использую ASF (3.19) код писался постепенно (точнее переписывался с кода для xmega под iar). На последнем этапе на определенной строчке при отладке перескакивает на начало main. По непонятным причинам. Если строку закоментировать, перескакивает на предыдущей. Если запускать без отладки, то просто код перестает выполнятся после определенного момента. Ума не приложу, как с этим разбираться? Это глюк студии или моего кода? Как понять? Пробовала увеличивать размер стека, размер rstack - все равно вылетает. Игралась со степенью оптимизации - тоже не помогает. Куда копать, подскажите.
  11. размер стека можно определять двумя способами: в xcl файле или в настройках проекта. Зайдите Project-Options-general options и уберите галочку с пункта configure system using diologs
  12. Спасибо за подсказку :a14: . действительно, проблема была в формировании адреса. Функция была написана для размера страницы 264. А когда я перешла на 256, забыла переписать.
  13. Картинка с осциллографа: Желтым - два последних считываемых байта на линии MISO на границе страниц. Должно быть 0x88 и 0x11. Как видно из картинки там 0x88 и 0xFF. Голубым показан тактовый сигнал.
  14. Осциллографом не смотрела. Это не так просто, потому что плата плотно скомпонована, но попробую. Как это функции удобно?! Она должна работать, как написано в datasheet. Там никаких ограничений на количество байт нет. Если читать две страницы подряд, то все равно первая страница читается правильно, а вторая - 0xff. Я снимаю CS, когда заканчиваю считывать нужное мне количество байт. Не вижу противоречия с ds
  15. Буфер, в который читаю, не переполняется. На данный момент он 9 байт, я 9 байт и считываю. Даже, если увеличить буфер в два раза, тоже самое. Т.е. пока считывание идет с одной страницы все ок, а когда переходит на другую - 0xff. Ну, 32-разрядные типы не нужны для моей задачи. Для номера страницы, смещения в байтах и количества считываемых байт использую 16-разрядные типы. При этом номер страницы 280, смещение 255 ( например) и количество байт 9, т.е. нет поводов для переполнения.
  16. Проблемы с AT45DB041D

    Добрый день! Работают в связке МК XMEGA32D4 и AT45DB041D. Использую команду Continuous Array Read (Low Frequency Mode: 03H): Up to 33MHz, размер страницы 256 байт ( установлено и проверено чтением регистра статуса). При переходе между страницами считываются данные не со следующей страницы, а 0xff. В чем может быть проблема? Не могу понять( void continuous_low_freq_read(unsigned char* in_data, unsigned int page_address, unsigned int byte_address, unsigned int byte_count) { unsigned char dummy; unsigned int i; set_address_bytes(page_address,byte_address); chip_select(); // opcode dummy=SPI_TX_RX(comm_cont_read_low); // three address bytes for (i=0;i<3;i++) dummy=SPI_TX_RX(spi_addr_byte[i]); // input data for (i=0; i<byte_count; i++) in_data[i]=SPI_TX_RX(0xaa); chip_deselect(); } unsigned char SPI_TX_RX(unsigned char data) { SPIC.DATA=data; while(!(SPIC.STATUS&SPI_IF_bm)); return SPIC.DATA; } void set_address_bytes(unsigned int page_address, unsigned int byte_address) { unsigned int temp; temp=page_address; temp>>=7; spi_addr_byte[0]=(unsigned char) temp; temp=(page_address&0x007F); temp<<=1; spi_addr_byte[1]=((unsigned char)(temp))|((unsigned char)(byte_address>>8)); spi_addr_byte[2]=(unsigned char)(byte_address); } #define chip_select() PORTD.OUT&= ~0x02 #define chip_deselect() PORTD.OUT|= 0x02 // command codes for at45 #define comm_cont_read_low 0x03 Запись страницы и чтение в рамках одной страницы происходят корректно.
  17. CRC в IAR

    Все заработало, когда переделала код в соответствии со статьей http://supp.iar.com/Support/?note=91733&from=note+76314 и примером к ней. Тему можно закрывать.
  18. CRC в IAR

    Здравствуйте! Использую IAR для AVR версии 6.3.3.1990 МК xmega32D4. Для написания бутлоадера необходимо подсчитывать CRC прошивки. Хочу это сделать средствами линкера. Прописываю в настройках: Рассчитываю программно в соответствии с документацией на линкер IAR unsigned long ChecksumStart = 0x0000; unsigned long ChecksumEnd = 0x8FFD; ... unsigned short slow_crc16(unsigned short sum, unsigned char *p,unsigned int len) { while (len--) { int i; unsigned char byte = *(p++); for (i = 0; i < 8; ++i) { unsigned long osum = sum; sum <<= 1; if (byte & 0x80) sum |= 1; if (osum & 0x8000) sum ^= 0x1021; byte <<= 1; } } return sum; } ... unsigned short calc = 0; // Run the checksum algorithm calc = slow_crc16(0, (unsigned char *) ChecksumStart,(ChecksumEnd - ChecksumStart+1)); // Rotate out the answer unsigned char zeros[2] = {0, 0}; calc = slow_crc16(calc, zeros, 2); ... Результат как программного расчета, так и линкером отправляю в com порт. Они не совпадают. И программный расчет не постоянен: при передергивании питания значение меняется. P.S. Видела подобные проблемы и их обсуждения на форуме, но не поняла, есть ли решение
  19. Спасибо за ответ. В связи с большой загрузкой по другому проекту и тем, что уведомления об ответах мне почему-то не приходят на почту, увидела его только сегодня. Наверное, это замечательная идея, но в рассматриваемом МК XMEGA32D4 нет DMA.
  20. Здравствуйте! Есть задача обновлять период таймера во время работы. Например, после десяти тактов с периодом 100 мс запустить 10 тактов с периодом 10 мс, потом снова 10 тактов с периодом 100 мс и т.д. Сначала я делала так: if(timeout==10) { delay_ms(15); TCC0.CTRLA=0; TCC0.CNT=0; TCC0.PER=290; TCC0.CTRLA = 0x07; // 1024 div } if(timeout==20) { TCC0.CTRLA=0; TCC0.CNT=0; TCC0.PER=2900; TCC0.CTRLA = 0x07; // 1024 div timeout=0; } При этом TCC0 настроен для работы в нормальном режиме, тактирование с предделителем 1024, т.е. на 1 мс 29 тактов. Разрешено прерывание по переполнению, в прерывании обновляется переменная timeout delay_ms() - это функция задержки на таймере TCC1. Ввела ее, чтобы проверить, что если таймер досчитал до большего числа, чем 10 мс, то он все равно сбросится в ноль, и только потом начнет считать заново с новым периодом. Итоги: в принципе работает, но один из тактов при периоде 10 мс длится 15 мс. Всегда третий. Если убрать delay_ms() (или поставить аргумент меньше или равный 10), то после 100 тактов с периодом 100 мс таймер больше не возобновляет работу. Пыталась понять, почему так, не поняла. В попробовала с использованием команды RESTART. Тоже самое. Что я делаю не так? Весь день сижу, не могу понять, и ds почитала и форумы разные...
  21. Все оказалось до банального просто :laughing: : не считывала 1 бит в байте (цикл был до 7 бит), поэтому самый старший байт выпадал. Поправила, все заработало. Всем спасибо! :a14:
  22. Знакома с этой процедурой, читаю побитно: .... #define PORT_UID IOPORT_CREATE_PIN (PORTE,2) .... if (ioport_get_pin_level(PORT_UID)) { temp|=0x80; } temp>>=1; .... Команды 0xCC в документации на ds2411 нет. Есть 0x33, 0xF0 и 0x3C ROM мне нужен, потому что как раз там записан UID P.S. реализовывала сама, так как показалось несложным и простым в реализации)))) Спасибо, попробую
  23. Здравствуйте! К Xmega32D4 подключена ИМС с UID ds2411. 1-wire реализовывала сама в avrstudio6. Reset проходит, ответ на него приходит. После команды Read ROM (0x33) в ответ приходит стабильно одна и та же последовательность байт, но почему-то последние два байта нулевые (хотя самый последний байт должен быть CRC). Первый байт считывается правильно 0x01. Из чего сделала вывод, что тайминги все соблюдаются, да и осциллограф об этом же говорит. Пробовала на двух разных платах (соответственно с двумя разными ИМС ds2411). Результат одинаковый. В чем может быть проблема? Тактовый сигнал таймера 16 МГц. Просмотрела 20 страниц форума по результату поиска по 1-wire. Ничего похожего на мою ситуацию не нашла, поэтому и создаю очередную тему. #define trstl 480 #define tpdh 70 #define tpdl 250 #define tslot 35 void init_timer0(void) { // enable timer and its clock system tc_enable(&TCC0); //задаем режим работы таймера: обычный tc_set_wgm(&TCC0, TC_WG_NORMAL); } void timer_delay_us(unsigned int us_count) { uint16_t us=0; us=us_count*16; // устанавливаем top tc_write_period(&TCC0, us); // устанавливаем источник тактирования и начинаем считать! tc_write_clock_source(&TCC0, TC_CLKSEL_DIV1_gc); while(!(tc_is_overflow(&TCC0))); tc_clear_overflow(&TCC0); // stop timer tc_write_clock_source(&TCC0, TC_CLKSEL_OFF_gc); tc_write_count(&TCC0,0); } unsigned char send_reset(void) { unsigned int delay_count=0; ioport_set_pin_dir(PORT_UID,IOPORT_DIR_OUTPUT); ioport_set_pin_level(PORT_UID, 0); timer_delay_us(trstl); ioport_set_pin_dir(PORT_UID,IOPORT_DIR_INPUT); // ждем ответа ds2411 (ждем нуля на линии) // либо выхода по тайм-ауту while((ioport_get_pin_level(PORT_UID))&&(delay_count<tpdh)) { timer_delay_us(1); delay_count++; } if (delay_count==tpdh) return 0; delay_count=0; // ждем пока ds2411 держит ответ (ждем 1 на линии) while((!(ioport_get_pin_level(PORT_UID)))&&(delay_count<tpdl)) { timer_delay_us(1); delay_count++; } if (delay_count==tpdl) return 0; return 1; } void write_one(void) { ioport_set_pin_dir(PORT_UID,IOPORT_DIR_OUTPUT); ioport_set_pin_level(PORT_UID, 0); ioport_set_pin_dir(PORT_UID,IOPORT_DIR_INPUT); timer_delay_us(tslot); } void write_zero(void) { ioport_set_pin_dir(PORT_UID,IOPORT_DIR_OUTPUT); ioport_set_pin_level(PORT_UID, 0); timer_delay_us(tslot); ioport_set_pin_dir(PORT_UID,IOPORT_DIR_INPUT); } void send_ROM_read(void) { // посылаем код команды 0x33 младшим битом вперед write_one(); write_one(); write_zero(); write_zero(); write_one(); write_one(); write_zero(); write_zero(); } unsigned char read_byte(void) { unsigned char temp=0,i; for(i=0;i<7;i++) { ioport_set_pin_dir(PORT_UID,IOPORT_DIR_OUTPUT); ioport_set_pin_level(PORT_UID, 0); ioport_set_pin_dir(PORT_UID,IOPORT_DIR_INPUT); LED_GREEN_ON(); if (ioport_get_pin_level(PORT_UID)) { temp|=0x80; } LED_GREEN_OFF(); temp>>=1; timer_delay_us(tslot); // while(!(ioport_get_pin_level(PORT_UID))); // usart_serial_putchar(USART_SERIAL, temp); } return temp; } void read_UID(unsigned char *uid) { unsigned char i; while (!send_reset()); timer_delay_us(tpdl); send_ROM_read(); timer_delay_us(tslot); for (i=0;i<8;i++) { LED_RED_ON(); // usart_serial_putchar(USART_SERIAL, i); *uid=read_byte(); // usart_serial_putchar(USART_SERIAL, *uid); LED_RED_OFF(); uid++; } }
  24. У меня похожий вопрос. Начальство предложило оплатить курсы (официальный сертификат не нужен). Поискала в нете, ничего по МК в Москве не нашла. В другой город меня вряд ли отпустят. Если кто-то знает такие курсы, поделитесь, плз.
  25. Спасибо! Да действительно, если подходить формально и понимать, что люди, которые это будут читать, если вообще будут, вообще не понимают о чем речь, то жизнь кажется проще))))
×
×
  • Создать...