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

Charoit

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

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

  • Посещение

Сообщения, опубликованные Charoit


  1. Быстрее насколько? На 30%? Возможно данная батарея долго хранилась на складе, может и в ненадлежащих условиях, и подсела.

     

     

    Этот кондёр как раз и может жрать лишние мкА :biggrin:

    ...если выбран неправильного типа с большой утечкой.

     

    Да и собственно - каким прибором меряется ток утечки? Учитывается падение напряжения на нём? Если падение большое, то без него там ток может быть совсем другой...

    Для получения достоверных результатов мерять нужно специальным микроамперметром, а у Вас дподи обычный китайский мультиметр? B)

     

    К батарее вопросов не должно быть - из той же коробки коллеги брали неделю назад, проблем не было.

     

    Кондер - керамический, типоразмер 0603, какая утечка - не знаю..

     

    Прибор - мультиметр UNI-T, модель UT70B. Не Fluke конечно, но и не хлам вроде? Или нет? :)

     

  2. если ваши две батарейки отработали по часу а вы намеряли ток всего 400 мкА, значит вы ошиблись в 100 раз, значит вы не понимаете что делаете

     

     

    Я не писал, что они отработали по часу :) Я написал, что должно было хватить на 1,5 часа, то есть на заведомо большее время, чем получилось по факту. По факту вторая батарея проработала считанные минуты. А посчитал неверно, да - при 400 мкА должно быть не менее 120 часов. Не менее - потому что округлил ток в большую сторону.

     

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

     

  3. при таких условиях батарейки должно хватать на 120 часов

     

    Ошибся, действительно 120 часов.

     

    Не знаю, как у L4xx, а у F2xx если не выключить АЦП на этом входе, то потребление вполне ощутимое.

     

    Речь про вывод VBAT?

  4. Отключите часы, проверьте без них. Может, генератор много ест?

    У меня CR1220 работает годами. И кварц часовой генерит, хоть и не используется. Режимы работы храню. Напряжение 3V, где-то чуть меньше. Измеряю по желанию внутренним АЦП, выдаю результат.

    А конденсатора параллельно батарейке не имею. Зачем он?

    В STM32F207.

     

    Отключил RTC, разницы по потреблению нет. Стер флэш вообще - тоже самое, жрет сотни мкА и все тут.

    Зачем емкость воткнули - не знаю, задам вопрос разработчику.

     

    Если не ошибаюсь, и если исключить дохлость конкретного камушка, то такое может быть если нарушены требования к одновременности появления напряжений VDD и VDDA.

    Если при подаче питания в какой то момент разность напряжений между этими ногами более 0,5В могут быть проблемы с работой внутренней логики питания.

    Если поставить между этими ногами двусторонний диод, то проблема может исчезнуть.

     

    Спасибо за идею, попробую проверить.

     

     

     

  5. Есть небольшой девайс на данном процессоре, в бэкап-регистрах хранит данные, плюс идут часы. К выводу VBAT подключена батарейка на 3В, CR1225SM.

     

    При отладке выяснилось, что при отсутствии питания на VDD содержимое бэкап-регистров сохраняется, а часы сбросились. Посмотрел код, вроде все норм. Проверил напряжение на батарее - а там 0,4 вольта. Видимо для BKP хватало, а для работы часов уже нет (кварц внешний на 32 кГц). Заменил батарею на хорошую - но очень быстро проблема вернулась. Проверяю напряжение - 0,6 В..

     

    Подключил мультиметр в разрыв цепи батареи, замерил ток - 400 мкА потребляет схема при отсутствии питания на VDD. При емкости батарейки 48 мАч она должна разрядиться примерно через 1,5 часа, а у меня вторая батарея умерла быстрее..

     

    Может у кого есть идеи, в чем проблема и где искать?

     

    Кусок схемы прилагаю, батарейка больше ни к каким пинам не подключена.

    post-31217-1488536506_thumb.jpg

  6. Всем привет.

     

    Вопрос такой - обязательно ли стирать флэш-память перед перепрошивкой?

    Экспериментирую с бутлоадером для XMega32A4AU, попробовал перепрошить чип без стирания - прошился и работает..

  7. У Вас не хватает места в этом сегменте.

    Или уменьшите то, что Вы собираетесь туда впихнуть, или расширьте диапазон. Верхняя граница определяется физическим размером памяти, значит уменьшите нижнюю.

    Тогда сегмент налезет на другие сегменты, придется и их двигать.

    Так что лучше начните с того, что нарисуйте на бумажке распределение памяти, тогда и придет озарение.

     

     

    Спасибо за ответ.

    Пробовал менять диапазон, но результата нет, а в документации IAR'а не все понятно.

     

    Я правильно понимаю, что :

     

    1) Верхняя граница, которая определяется физ.размером памяти, в данном случае : -D_..X_CODE_END=8FFF ?

     

    2)

        -P(CODE)BOOT=_..X_FLASH_BASE-_..X_CODE_END
        -P(CODE)CODE=_..X_FLASH_BASE-_..X_CODE_END
        -P(CODE)FARCODE=_..X_FLASH_BASE-_..X_CODE_END

     

    Эти строки означают, что определены сегменты BOOT, CODE и FARCODE и располагаются они во флэш, а директива -P означает что части сегмента могут быть размещены не непрерывно, а с

    разрывами? Эти сегменты могут быть расположены в любой части секции Бутлоадера, т.к. указано _..X_FLASH_BASE-_..X_CODE_END?

     

     

    Еще непонятно с сегментом INTVEC : он описан как -Z(CODE)INTVEC=81F4-81FF, при этом выше есть строка : -D_..X_INTVEC_END=81FB, что означает верхнюю границу сегмента. Но почему это значение меньше 81FF?

     

     

  8. Всем привет!

    Изучаю код бутлоадера для XMega32A4AU, взял атмеловский пример для IAR.

     

    Линковщик выдает вот такую ошибку :

     

    Error[e16]: Segment NEAR_ID (size: 0x98 align: 0x1) is too long for segment definition. At least 0x30 more bytes needed. The problem occurred while processing the segment placement command "-Z(CODE)NEAR_ID=81FC-_..X_CODE_END", where at the moment of placement the available memory ranges were "CODE:8f98-8fff"

    Reserved ranges relevant to this placement:

    CODE:81fc-81fd STARTBOOT

    CODE:81fe-8f8b CODE

    CODE:8f8c-8f97 INITTAB

    CODE:8f98-8fff NEAR_ID

     

    Открыл файл xcl, но пока не понимаю, что и как надо там изменить:(

     

    -D_..X_FLASH_BASE=8002
    -D_..X_CODE_END=8FFF
    -D_..X_INTVEC_END=81FB
    
    
    //////////////////////////////////////////////////////////////////////////////
    // Code (flash) segments
    
    
    -Z(CODE)INTVEC=81F4-81FF
    -P(CODE)BOOT=_..X_FLASH_BASE-_..X_CODE_END
    -P(CODE)CODE=_..X_FLASH_BASE-_..X_CODE_END
    -P(CODE)FARCODE=_..X_FLASH_BASE-_..X_CODE_END
    -Z(CODE)INITTAB=81FC-_..X_CODE_END
    -Z(CODE)NEAR_ID=81FC-_..X_CODE_END

     

    Подскажите пжлста, в чем проблема..

  9. Продаю отладочный комплект Atmel SAM3N-EK.

     

    Новый, в коробке. Внутри сама плата с ARM-процессором, дисплеем и т.д. + плата QT600 USB Bridge (для использования в качестве программатора) + блок питания + кабели.

     

    Фото прилагается.

     

    Цена - 4000 рублей, Москва.

     

    Пишите в личку или mak1308[at]mail.ru

     

    post-31217-1338989381_thumb.jpg

    post-31217-1338989389_thumb.jpg

    post-31217-1338989395_thumb.jpg

    post-31217-1338989402_thumb.jpg

    post-31217-1338989409_thumb.jpg

  10. Оень плохая практика включать прерывания, на которые не реализованы обработчики. Более того, раз обработчика нету, значит программе то прерывание вообще не нужно.

    Либо уберите тот бит, либо реализуйте обработчик.

     

     

    Если бит убираю - устройство работает неправильно, но похоже, что причина где-то в другом месте.. Видимо, код был написан без учета существования других компиляторов.

    Буду разбираться дальше. Спасибо всем ответившим, пока есть куда копать :)

  11. Контроллер после записи в этот регистр уходит в прерывание UDR. Сразу. Ибо глобально прерывания разрешены, а UDR пуст. Обработчик прерывания написан? Имя его правильное? Он располагается по правильному адресу? Посмотрите в дизассемблере, куда указывает вектор этого прерывания? Что делает обработчик этого прерывания, если учесть, что у вас еще нет данных для передачи? Очень странным выглядит взведение UDRIE в инициализации - обычно его взводят перед отправкой данных, чтобы в обработчике осуществить загрузку UDR из буфера передачи, и сбрасывают после опустошения буфера.

     

     

    Обработчик прерывания (USART__UDRE_vect - правильно понимаю?) не написан..

     

    Взведение бита UDRIE сделано потому, что так было в исходнике, который мне достался по наследству, как уже писал выше, этот проект изначально был сделан в IAR'e, я же решил его перенести в среду AVR Studio. Удивительно, что этот же код работает после IAR'а - hex-файл прошил в контроллер, все функционирует..

  12. если Вы бы пошли дальше в своих рассуждениях, то достаточно комментировать вашу супер-пупер секретную мигалку светодиодами по блочно и смотреть когда эффект исчезнет(или проявится). дальше делите подозрительный блок лапополам и повторяете тест. и так вы дойдёте до действительно проблемного куска кода. и он будет не в этих строчках скорее всего.

     

    У меня есть пищалка, включается программно, чтобы определять переход устройства из одного состояния в другое. Ее и использовал для определения проблемного места.

    Если включать пищалку до записи в регистр UCSRB - пищит, если после записи в этот регистр - уже не пищит.

     

    если напрячь телепатию - то скорее всего идёт выше инициализация неких прерываний, обработчиков и иже. попробуйте отключить всё кроме вызова этой функции и вы увидите что она тут не причём.

     

    Выше идет вот это (сразу после этих строк вызов InitUART) :

     

     SREG=0x80;
      GICR=0x00;
      GIFR=0x00;
    
      MCUCR = 0x80; 
      
      
      MCUCSR=0x00;
      
      WDTCR=0x10;
      
      SFIOR=0x00;
    
      DDRA =0x00; // if '1' --> PORTAn --> OUT;   if '0' --> PORTAn --> IN
      DDRB =0xFF; // if '1' --> PORTBn --> OUT;   if '0' --> PORTBn --> IN
      DDRC =0xFF; // if '1' --> PORTCn --> OUT;   if '0' --> PORTCn --> IN
      DDRD =0x0C; // if '1' --> PORTDn --> OUT;   if '0' --> PORTDn --> IN
      
    
    //******************************************************************************  
      PORTA=0xDF;   // ножку 5 порта А переводим в Z-состояние, на остальных Pull-up
    //******************************************************************************  
      
      PORTB=0x00;
      PORTC=0xFF;
      PORTD=PORTD | 0xFC;
    
      SPCR=0x00;//F0;
      SPSR=0x01;
      //-------     Настройка таймера TIMER0  --------------------------------------
      
      ASSR  = 0x00; 
                   
      TIMSK = 0x42; 
      TCNT0 = 0x00; 
    
      
      TCCR0 = 0x0D; 
                    
      
      //-------  Кварцевый резонатор  12 МГц  --------------------------------------
      OCR0  = 11;

  13. Что значит в ступор? где он зацикливается ? на прерывании по опустошению регистра UDR ? или по резету ?

    Проверте в компиляторе alt+f7 / Toolchain/ AVR/GNU C Linker / Memory Settings -> поле Initial Stack Address. Должно быть пустым (или впишите RAMend для своего контроллера)

     

     

    Ступор - зависание.

     

    Поле Initial Stack Address проверял (как раз прочитал ваш пост об этом на форуме) - было пустым, прописал Ramend - не помогло.

  14. Имеется проект для IAR'a под Атмегу32А, он компилится и работает нормально..

     

    Решил перенести проект в AVR Studio 5.1, не сразу, но получилось, компилится нормально, без ошибок и предупреждений. Однако в железе работать не хочет, микроконтроллер впадает в ступор :(

     

    Опытным путем выяснилось, что происходит это во время инициализации UART, а именно после записи в регистр UCSRB. Причем контроллеру не нравится запись именно бита UDRIE - если его оставить нулем, то ступора не будет (но при этом не будет работать правильно железо)

     

    Сам исходник большой, наверно нет смысла его тут приводить, а функция инициализации UART'a выглядит вот так :

     

    void InitUART()
    {
    
        UCSRA=0x00; 
    
        UCSRB = (1<<RXCIE)|(1<<TXCIE)|(1<<RXEN)|(1<<TXEN)|(1<<UDRIE);  
    
            UCSRC = (1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0); 
    
            UBRRH=0;
      
            UBRRL=12;//BAUD=57692.31 (+0.16%) <-baudrate for Fosc=12 MHz и 6 MHz.
      
            UART_RxBufIndex=0;
      
      
    }

     

    Даташит на Мегу32А читал, насколько понял, есть особенность только при записи в регистры UCSRC и UBRRH, в остальном все нормально..

     

    Что делать, не понимаю :( Помогите пжлста..

  15. Не получается писать в память программ:( Для начала решил просто стереть страницу - и это не работает..

    Обязательно ли макросы boot_page_erase должны находиться в области загрузчика?

     

    Вызываемая функция выглядит вот так :

     

    void boot_program_page (uint16_t page)
       {
    
           uint8_t sreg;
    
           // Disable interrupts.
    
           sreg = SREG;
           cli();
    
           eeprom_busy_wait ();
    
           boot_page_erase (page);
           boot_spm_busy_wait ();      // Wait until the memory is erased.
    
    
    
           // Reenable RWW-section again. We need this if we want to jump back
           // to the application after bootloading.
    
           boot_rww_enable ();
    
           // Re-enable interrupts (if they were ever enabled).
    
           SREG = sreg;
    
    
       }

  16. Наверное, вопрос был всё же о памяти программ? В эту память абы-откуда писать не получиться. Поэтому и смотреть нужно в файле boot.h

     

    Тьфу, блин, конечно о памяти программ.. Спасибо, буду смотреть boot.h.

  17. Хотел там мяукнуть, но обленился. Тут спрошу - а зачем?

    Не подколки ради, просто чтение регистра из С ведь не самоцель.

    Опишите задачу.

    Тогда будет понятно, что советовать.

     

     

    Да признаться стыдно..:) Хотел прочитать несколько байт памяти программ - на асме это делал командой LPM, в принципе все понятно было.

    Решил попробовать на С, выяснил, что есть макрос pgm_read_byte_near(address_short) __LPM((uint16_t)(address_short)) - ну и решил,

    что результат чтения как и на асме тоже сохраняется в регистре R0.

    Микроконтроллерный С не так просто в освоении оказался..

  18. Можно читать содержимое из памяти (регистровый файл)...

     

    А можно сделать ассемблерную вставку + привязку, и компилятор "сгенерит" код в котором переменная в С будет

    ассоциироватся с нужным Вам регистром.

     

     

    Мне бы пример, если Вам несложно:)

×
×
  • Создать...