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

VladislavS

Свой
  • Постов

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

  • Посещение

  • Победитель дней

    9

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


  1. Мда. 300+ постов. Один(!) человек, который прочитал мануал.

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

     

    Вот вам программа для алгоритма по коротким включениям:

    #include <ioavr.h>
    #include <intrinsics.h>
    
    volatile __regvar __no_init unsigned char mode @ 15;
    volatile __regvar __no_init unsigned char power_low_counter @ 14;
    volatile __regvar __no_init unsigned int adc_c @ 12;
    
    __no_init __eeprom unsigned char ee_mode;
    
    #ifdef __cplusplus
    extern "C" {
    #endif
    char __low_level_init()
    { 
      CLKPR|=(1<<CLKPCE); 
      CLKPR=3; //Снизим тактовую частоту до 9.6/8 МГц
      
      DDRB=(0<<DDB5)|(0<<DDB4)|(0<<DDB3)|(0<<DDB2)|(1<<DDB1)|(1<<DDB0);
      PORTB=(0<<PORTB5)|(0<<PORTB4)|(0<<PORTB3)|(0<<PORTB1)|(0<<PORTB0);
      
      ACSR=(1<<ACD); //Analog Comparator Disable
      DIDR0=(1<<ADC0D)|(0<<ADC1D)|(1<<ADC2D)|(1<<ADC3D)|(1<<AIN1D)|(1<<AIN0D);
      PRR=(1<<PRTIM0)|(0<<PRADC);
      
      ADMUX=(1<<REFS0)| 1; // Vref=1.1V , ADC1
      ADCSRA=(1<<ADEN)|(0<<ADSC)|(1<<ADATE)|(0<<ADIF)|(1<<ADIE)|(0<<ADPS2)|(1<<ADPS1)|(1<<ADPS0);
      ADCSRB=0;      
      
      return 1;
    }
    #ifdef __cplusplus
    }
    #endif
    
    #pragma vector=ADC_vect
    __interrupt void ADC_Interrupt(void)
    {  
      switch(mode)
      {
        case 0: // Яркость 100%
          if(ADC<600) power_low_counter++; else power_low_counter=0;
          if(power_low_counter>100) { ee_mode=0; mode=2; power_low_counter=0; }
          PORTB|=(1<<PORTB1);
          PORTB|=(1<<PORTB0);      
          break;
        case 1: // Яркость 40%
          if(ADC<600) power_low_counter++; else power_low_counter=0;
          if(power_low_counter>100) { ee_mode=1; mode=2; power_low_counter=0; }
          PORTB|=(1<<PORTB0);
          PORTB&=~(1<<PORTB1);
          break;
        case 2: // Яркость 4%
          if(ADC<558) power_low_counter++; else power_low_counter=0;
          if(power_low_counter>100) { ee_mode=2; mode++; }
          PORTB&=~(1<<PORTB1);
          PORTB|=(1<<PORTB0);
          __delay_cycles(10);      
          PORTB&=~(1<<PORTB0);
          break;
        default: // Защитное выключение
          PORTB&=~(1<<PORTB1);
          PORTB&=~(1<<PORTB0);
          MCUCR=(1<<SE)|(2<<SM0); //Power Down
          __sleep();
          break;
      }
    };
    
    int main( void )
    {   
      __delay_cycles(100000);
      adc_c=0;  
      mode=ee_mode; 
      switch(mode)
      {
        case 0:
        case 1:
          ee_mode++;
          break;
        default:
          mode=2;       
          ee_mode=0;
          break;
      }  
      power_low_counter=0;
    
      ADCSRA|=(1<<ADSC);  
      __enable_interrupt(); 
      for(;;)  
      {   
        MCUCR=(1<<SE)|(1<<SM0); //Sleep
        __sleep();
        if(adc_c<16000) adc_c++;
        else
        {
          if(adc_c==16000)
          {
            __disable_interrupt();
            PORTB&=~(1<<PORTB1);
            PORTB&=~(1<<PORTB0);
            adc_c++;        
            ee_mode=mode;
            __delay_cycles(75000);
            __enable_interrupt();
          }
        }  
      }
    }

  2. 3.значения РОН сравниваем с сохраненными любимыми значениями из EEPROM. если совпали, то длинное отключение, если хоть 1 бит не совпал - то короткое. меняем или не меняем режим

     

    Ууууу.... 300-е сообщение темы, а вы еще верите, что все биты могут совпасть???

  3. Не мешало бы делать проверку целостности ячейки после записи и в случае порчи включать "самый правильный" режим.

     

    Ну само собой - при любом значении в EEPROM какой-то из валидных режимов все равно надо включить. Думаю, дядькам, которые знают про LDI, такие вещи очевидны. :)

  4. Господа, всем спасибо за участие! Меня срывают в Израиль "спасать проект" - участвовать в дальнейших разборках временно не могу.

     

    В боевой фонарь пока зашиваю следующий алгоритм:

    1. При старте считываем режим из EEPROM и принимаем его за текущий, инкрементируем режим и записываем обратно в EEPROM.

    2. Через 2-3 секунды подмаргиваем диодом и записываем в EEPROM текущий режим (делаем откат).

     

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

     

    интересно, а есть на осциллограммах похожий временной интервал? 64 ячейки*8бит*5команд(к примеру)=2500тактов

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

  5. надо полагать, что маленький пичок при включении синхронен с тем, что Вы приводили на ноге PB0?

    Судя по всему да.

     

     

    что-то ШИМ какой-то непонятный, практически постоянная 1,

    Так оно и есть. Это режим Hi - 100% яркости. И даже при этом они не просто единицу ставят, а короткие импульсы остаются. Наверное особенности реализации ШИМ на таймере. Хотя таймер можно было бы и отключать. Но они не заморачивались.

     

     

    проверить эту версию просто - аккуратно отпаять ногу контроллера

    Осталась последняя плата с оригинальной прошивкой - жалко убить. Думаю резистора 10 кОм хватит.

  6. VladislavS, а дайте, пожалуйста, осциллограммки ноги PB1 в моменты включения и отключения

    Только в понедельник. :( Прибор на работу уехал.

     

    Вот из старых измерений. Разрешение не очень, но общую картину видно. Волосня справа - ШИМ.

    post-4140-1263569980_thumb.png

  7. Компилятор IAR. Пробовал с регистрами общего назначения. Конкретно R15 вот так:

     

    volatile __regvar __no_init unsigned char mode @ 15;

     

    Он занулён намертво при старте. Не думаю что R20 чем-то отличается в этом плане.

  8. Запускаем ADC в Free Runing - при условии , что работаем на 200 кгц - 5*25=125мкс , 500-125=375мкс в остатке.

    А у меня АЦП вообще всегад запущен - за батарейкой следит. Поэтому, 13 тактов выборка. Делители следующие 9.6МГц/8=1.2МГц тактовая процессора. 1.2МГц/8=150кГц тактовая АЦП. 150кГц/13=11538 выборок в секу или каждые 86 мкс.

     

     

    Зачем значение АЦП нужно и, что с ним делать и как Вы собираетесь привязать его к режиму в котором работает фонарик совершенно не понятно ?

    1. Следить за разрядом аккумулятора.

    2. Опровергнуть утверждение, что tiny НЕ МОЖЕТ УЗНАТЬ ЧТО ЕГО ВЫКЛЮЧАЮТ. Может!

    3. Если посмотришь код, который я выкладывал, то увидишь что на прерывании АЦП, раз уж оно работает, еще и ШИМ сделан. А таймер спит и экономит энергию в это время.

     

    А дальше интереснее всего - значение надо сохранить , единственно возможное место EEPROM - типовое значение записи 3,4 mc

    Зачем его сохранять? Тем более в EEPROM? Можно выполнить какие-нибудь другие действия. Не важно какие - главное МОЖНО.

  9. 3. TiNY не знает , при нажатии на кнопку , что с ним произойдёт , т.е это может произойти в любом месте программы .

    Согласен.

     

    Времени чтобы оценить "обстановку" у него нет. Его тупо выключают.

    Злобное заблуждение. После выключения он живет ещё где-то 500 мкс. Запускаем ADC в Free Runing и имеем новую выборку каждые 86 мкс. Времени чтобы "подготовиться" к выключению вагон и тележка.

     

    Так , что можно исходить из того , что он оценивает что-то (сижу вычитываю DS), что он может использовать при включении , как более или менее точное указание на то , сколько он "тупил".

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

     

    Я не думаю , что китайцы использовали , что-то кроме написанного в DS.

    Я не думаю что это сделали китайцы. Они лишь печатный станок запустили.

  10. Ну, на самом деле, в 12f629 есть компаратор с Vref на одном из входов. Подобрав делитель можно за батарейкой следить. Не так гибко как с АЦП, но всёже.

     

    набросайте схемку, если не сложно

    Можно словесно - мы не такие привередливые. :)

     

    точнее интересует к какой ноге тогда драйверы подключены и какие драйверы используются

    Ну драйверы те же AMC7135 - линеный стабилизатор тока.

  11. может поэтому rx3apf и сказал, что выкинул эту прошивку?

    Возможно. У родной прошивки бывает при включении режим перескакивает. Похоже из-за дребезга контактов. На электронном ключе ложных срабатываний я не замечал ни разу. Всетаки это схема из китайского фонаря и качество всех сопутствующих компонентов тоже влияет на работу схемы.

     

    кстати, а почему Вы решили перешить контроллер?

    1. Китайцы считают, что наличие в фонаре 18 !!! режимов работы это его конкурентное преимущество. Нормальному же пользователю достаточно 1-2 уровней яркости без всяких мигалок.

     

    2. В оригинальной плате регулировка яркости организована ШИМ-мом. Если открыть даташит на светодиод, то можно посчитать, что световой поток будет выше если его питать 350 мА постоянного тока вместо 1А 35% скважности. На этой платке очень легко сделать 1А, 700мА и 350мА без ШИМ. Повышается эффективность и не жужит к тому же.

     

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

     

    4.Действительно интересно КАК они это сделали.

     

    такое ощущение, что принцип найден.

    Возможно и удастся дожать чтобы по этому принципу работало. Будет наш метод!

    Но ни на одной диаграмме с китайской прошивки ничего похожего не видно. Я уже под микроскопом все всплески просмотрел. Вот на 5-й ноге при старте что-то подозрительное. С компаратором они там выёживаются что-ли...

     

    IMHO, при старте нужно, до того как подключать ее к АЦП, установить на ней нулевой уровень принудительно.

    Ну это запросто - попробую.

     

    что иноземцы скажут - китайцы-то все там выучены

    Думаю это всеже не китайская разработка.

     

    может быть есть возможность выловить момент отключения питания до срабатывания BOD

    Есть, АЦП у меня в Free Runing и молотит выборки 11.5 кГц. То есть, через 87*2 мкc он может понять что его выключают.

  12. Значит, вот до чего я продвинулся. Как мы тут уже нащупали, измерял напряжение на висящей в воздухе ножке cразу после включения. Коды получались где-то в диапазоне 560-580. Чтобы выявить хоть какую-то зависимость я питание жестко зафиксировал. Пытался найти просто границу. Что-то типа "если (код>570) то короткое, иначе длинное". Общая тенденция действительно прослеживается. Но процент ложных срабатываний очень высокий как я ни двигал границу. Причем ложные срабатывания как в одну, так и в другую сторону.

  13. Я вот ещё что заметил. В сообщении #138 диаграмма китайской прошивки на 5-й ноге.

     

    Взял второй вариант платы - там другая прошивка, так как запись в EEPROM и включение нужного режима происходит уже через 400 мкс после старта. Диаграммы 5-й ноги этой прошивки.

     

    post-4140-1263390037_thumb.png

    post-4140-1263390045_thumb.png

     

    Мне кажется, или это АЦП работает на этой ноге?

  14. 1.в рабочем цикле переключаем мультиплексор с делителя на свободную ножку, подзаряжая ее таким образом

    Не осознал. Кого подзаряжаем? Если и правда НОЖКУ, то я могу туда пулап подцепить.

  15. Есть активный щуп с полевиком на входе? Дабы избавится от разряда через 10МОм щупа? Или слепить из подручных материалов?

    Щупа нет. Слепить что-то в приемлемое время не смогу.

     

    Ну так что, пытаться с помощью АЦП измерять отклонение от пол питания?

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