Кастомная прошивка на 8х7135 или приключения программатора. - Страница 8
+ Ответить
Страница 8 из 11 ПерваяПервая ... 3678910 ... ПоследняяПоследняя
Показано с 71 по 80 из 104

Тема: Кастомная прошивка на 8х7135 или приключения программатора.

  1. #71

    По умолчанию

    Alekz, Cпасибо, но у меня входное напряжение 16.8 v, а в S-817 максимум 6 вольт на входе.

  2. #72

    По умолчанию

    Цитата Сообщение от Kompilator Посмотреть сообщение
    Cпасибо, но у меня входное напряжение 16.8 v, а в S-817 максимум 6 вольт на входе
    Всегда пожалуйста, но у нее номинальное 10В, а предельное 12В. Но никак не 16,8.

  3. #73
    Без 5-ти минут веломаньяк!
    Байк
    Corratec Motion 2008, RS Tora 302
    Адрес
    Ярославль
    Сообщений
    26

    По умолчанию

    Цитата Сообщение от stronge Посмотреть сообщение
    В моей прошиве проц не засыпает (собственно, и #include <avr/sleep.h> нету), правда, потребление на нуле я не мерял, потому что дома аккум отключаю, иначе индикатор всё время работает.
    А куда вставлять этот код? И может какой полезный ресурс по теме имеется? я нуб в программировании(

  4. #74
    Не филология, а логофилия Аватар для stronge
    Байк
    Tideace FM-M009
    Адрес
    Москва
    Сообщений
    18,401

    По умолчанию

    Цитата Сообщение от Ariez Посмотреть сообщение
    А куда вставлять этот код?
    Первой строчкой.

    Цитата Сообщение от Ariez Посмотреть сообщение
    я нуб в программировании(
    Как ты тогда засыпание будешь делать? И просыпание по прерыванию? Просто, я тоже - нуб и в этих функциях ещё не разбирался, так - видел краем уха...

    Цитата Сообщение от Ariez Посмотреть сообщение
    И может какой полезный ресурс по теме имеется?
    Гугл. Серьёзно. Ну и avrfreaks.net. Все ресурсы для новичков по атмеловским чипам, что я находил, повествуют про ассемблер .
      ____,,,,_______________o__Q_Q_Q_Q\Q_Q_Q_Q_Q___,_;======,___,
    ()____________)___)_o_o___0b_~==============dB_G__G_______)

  5. #75

    По умолчанию

    Цитата Сообщение от stronge Посмотреть сообщение
    Народ, вы ставите этот драйвер в кастомные фары, я так понимаю? Купил несколько штук для апа ручных фонарей на 1х18650. Оказывается ставить двухсторонний драйвер в фонари вместо одностороннего 17мм это геморрой еще тот. На одном C2-образном фонаре пришлось поменять батарейную трубу на другу (хорошо была) более короткую, на другом наоборот укоротить пружину в хвостовике, а в третьем фонаре так и пришлось отказаться от замены, нарушается длина и не прет блин ни в какую! Учтите этот момент, если тоже будете ставить в фонари. А вообще драйвер трю, хорош.

  6. #76

    По умолчанию

    Mutant, а за счет резьб в корпусе нельзя эти 3 мм выбрать?
    хотя бы со стороны башки добавить колечко внутрь, чтобы не до конца закручивалось.

  7. #77

    По умолчанию

    За счет резьб можно, но это не эстетично, я как эстет такое не приемлю Хороший вариант утопить драйвер в "pill set" (по-русски: фиговина с резьбой, на которую крепится диод и драйвер)) под латунное кольцо, а верхним слоем в кольцо поставить плату-заглушу 17мм, на которую откроется широкий выбор пружин или вообще без пружины, если места мало.

  8. #78

    По умолчанию

    Добавил в ближний свет мониторинг заряда батареи, при снижении заряда примерно до 3-х вольт фонарик начинает затухать

    #include<avr/io.h>
    #include<util/delay.h>
    #include <avr/power.h>
    #include <avr/wdt.h>
    #include <avr/interrupt.h>

    #define ADC_PRSCL 0x06 // Делитель АЦП, на сколько понял из инструкции чем от меньше тем точнее
    #define ADC_MUX 0x01 //
    #define ADC_DIDR ADC1D // На каком канале АЦП мерим напряжение
    #define START_POWER 255 // Мощность при новой батарейке максимум

    #define LOWBAT_TRIG 135 // Показание АЦП когда пора снижать мощность

    int curstate=0; // Текущее состояние
    int maxPower = START_POWER; //Начальные настройки, при новой батарейке
    int mode[3]={0,START_POWER,START_POWER}; //Режимы выключен, настраиваемый и максимум


    void modesw(); //процедурка смены режимов


    inline void start_adc() //Инициализация АЦП
    {
    // internal 1.1V, left adjusted, use configured mux
    ADMUX = _BV(REFS0) | _BV(ADLAR) | (uint8_t) ADC_MUX;

    // make sure pin is not set to output
    DDRB &= (uint8_t) ~(_BV(ADC_DIDR));

    // disable digital input on ADC pin
    DIDR0 |= _BV(ADC_DIDR);

    // enable ADC, start conversion, set prescaler
    ADCSRA = _BV(ADEN) | _BV(ADSC) | (uint8_t) ADC_PRSCL;

    }

    ISR(WDT_vect) // Прерывание по таймеру
    {

    static uint8_t lbat_cnt = 0; //На сколько я понял счетчик чтобы выносить решение на основании 4-х измерений




    // check if there is a new battery voltage measurement available.
    // проверяем готовы ли результаты в АЦП
    if(ADCSRA & _BV(ADIF)){

    // if battery voltage is below threshold, increase counter, else
    // reset it.
    // Если готовы и показание меньше границы, то увеличиваем счетчик
    // иначе сбрасываем его
    if(ADCH < LOWBAT_TRIG)
    {

    ++lbat_cnt;
    }
    else
    lbat_cnt = 0;
    }

    // Если счетчик вырос до 4-х, то начинаем снижать максимальную мощность, а заодно и вощномть в режимах

    if(lbat_cnt >= 4){
    maxPower-=5;
    if (maxPower<0) maxPower=0;
    if(mode[1]>maxPower)
    mode[1] = maxPower;
    mode[2] = maxPower;
    // обновляем показание на ДИОДЕ
    OCR0B = mode[curstate];
    // сбрасываем счетчик
    lbat_cnt = 0;
    }

    // restart ADC
    // перезапускаем измерение
    ADCSRA |= _BV(ADSC);


    }

    /*
    * set up the watchdog timer to trigger an interrupt every 250ms
    */
    //Инициализация таймера и прерывания по таймеру
    inline void start_wdt()
    {
    uint8_t wdt_mode;

    /*
    * prepare new watchdog config beforehand, as it needs to be set within
    * four clock cycles after unlocking the WDTCR register.
    * Set interrupt mode prescaler bits.
    */
    wdt_mode = ((uint8_t) _BV(WDTIE)
    | (uint8_t) (WDTO_250MS & (uint8_t) 0x07)
    | (uint8_t) ((WDTO_250MS & (uint8_t) 0x08) << 2));

    cli();
    wdt_reset();

    // unlock register
    WDTCR = ((uint8_t) _BV(WDCE) | (uint8_t) _BV(WDE));

    // set new mode and prescaler
    WDTCR = wdt_mode;

    sei();
    }




    // процедурка переключения режимов
    void modesw()
    {
    curstate+=1;
    if (curstate==3) curstate=0;
    OCR0B=mode[curstate];
    }


    int main(void)
    {
    int pwr=0;
    //нога для считывания кнопки
    PORTB |= _BV(PB4);
    DDRB |= _BV(PB1);
    //Настройка ШИМ
    TCCR0A = 0x21;
    TCCR0B = 0x01;
    //Установка начального режима
    OCR0B=mode[curstate];
    //Инициализация АЦП и таймера
    start_adc();
    start_wdt();
    //Дальше бесконечный цикл
    while(1)
    {
    //усли кнопка нажата, ждем 200мс для пропуска дребезга контактов
    if (!(PINB & _BV(PB4))) _delay_ms(200);
    //если кнопка все еще нажата
    if (!(PINB & _BV(PB4)))
    {
    //переключаем режим
    modesw();
    _delay_ms(500);
    //ждем еще 500мс
    while(!(PINB & _BV(PB4)))
    {
    //и пока нажата кнопка увеличиваем мощность до maxPower, и далее по кругу от 0
    pwr+=5;
    if (pwr>=maxPower) pwr=0;
    //ждем 100 мс между увеличением мощности
    _delay_ms(100);
    //ставим текущую мощность на диод
    OCR0B=pwr;
    // и записываем в режим
    mode[1]=pwr;
    }
    }
    }
    return 0;
    }

    тоже самое для дальнего

    #include<avr/io.h>
    #include<util/delay.h>
    #include <avr/power.h>
    #include <avr/wdt.h>
    #include <avr/interrupt.h>

    #define ADC_PRSCL 0x06 // ADC prescaler of 64
    #define ADC_MUX 0x01
    #define ADC_DIDR ADC1D // digital input to disable, see README
    #define START_POWER 255

    #define LOWBAT_TRIG 135

    int pwr = START_POWER;
    int curstate;

    void modesw();
    void strobe();



    inline void start_adc()
    {
    // internal 1.1V, left adjusted, use configured mux
    ADMUX = _BV(REFS0) | _BV(ADLAR) | (uint8_t) ADC_MUX;

    // make sure pin is not set to output
    DDRB &= (uint8_t) ~(_BV(ADC_DIDR));

    // disable digital input on ADC pin
    DIDR0 |= _BV(ADC_DIDR);

    // enable ADC, start conversion, set prescaler
    ADCSRA = _BV(ADEN) | _BV(ADSC) | (uint8_t) ADC_PRSCL;

    }

    ISR(WDT_vect)
    {

    static uint8_t lbat_cnt = 0;




    // check if there is a new battery voltage measurement available.
    if(ADCSRA & _BV(ADIF)){

    // if battery voltage is below threshold, increase counter, else
    // reset it.

    if(ADCH < LOWBAT_TRIG)
    {

    ++lbat_cnt;
    }
    else
    lbat_cnt = 0;
    }

    /* set the GF_LOWBAT flag if we have detected a low battery
    * voltage four times in a row. Reset lbat_cnt so we can trigger again.
    * Needed for the ramping down functionality.
    */
    if(lbat_cnt >= 4){
    pwr-=10;
    if (pwr<0) pwr=0;
    if (curstate)
    {
    OCR0B = pwr;
    }
    lbat_cnt = 0;
    }

    // restart ADC
    ADCSRA |= _BV(ADSC);


    }

    /*
    * set up the watchdog timer to trigger an interrupt every 250ms
    */
    inline void start_wdt()
    {
    uint8_t wdt_mode;

    /*
    * prepare new watchdog config beforehand, as it needs to be set within
    * four clock cycles after unlocking the WDTCR register.
    * Set interrupt mode prescaler bits.
    */
    wdt_mode = ((uint8_t) _BV(WDTIE)
    | (uint8_t) (WDTO_250MS & (uint8_t) 0x07)
    | (uint8_t) ((WDTO_250MS & (uint8_t) 0x08) << 2));

    cli();
    wdt_reset();

    // unlock register
    WDTCR = ((uint8_t) _BV(WDCE) | (uint8_t) _BV(WDE));

    // set new mode and prescaler
    WDTCR = wdt_mode;

    sei();
    }


    void strobe() // функция строба
    {
    int i;
    for(i = 0; i < 7; ++i) // основной цикл из 7ми миганий
    {
    if (!(PINB & _BV(PB4))) // если кнопка нажата
    {
    OCR0B = pwr; // максимум
    _delay_ms(25);
    OCR0B = 0; // минимум
    _delay_ms(50); // пауза
    }
    else break; // если кнопка отпущена
    // прерываем цикл
    }


    for(i = 0; i < 15; ++i){ // пауза между порциями строба оформлена в виде цикла для выхода из него в течение 10мс, а не 300, если кнопка будет отпущена в этот момент
    if (!(PINB & _BV(PB4))) _delay_ms(50); // если кнопка нажата - ждём 10мс
    else {
    modesw();
    break; // в противном случае меняем режим и выходим из цикла
    }
    }
    }

    void modesw() // функция переключения режимов
    {
    if (curstate)
    {
    curstate=0;
    OCR0B=0;
    }
    else
    {
    curstate=pwr;
    OCR0B=pwr;
    }
    }



    int main(void) // основная программа
    {
    curstate = 0;
    PORTB |= 0b00001000;//_BV(PB4); // пин PB4 (третий) будет опрашиваться
    DDRB |= 0b00000010;//_BV(PB1); // пин PB1 (шестой) будет использоваться для вывода ШИМ (на нём через 7135е висит диод)
    TCCR0A = 0x21; // корректируем ШИМ по фазе (взято из исходного драйвера)
    TCCR0B = 0x01; // множитель частоты ШИМ ((1 => 1, 2 => 8, 3 => 64...)
    OCR0B=0;

    start_wdt(); // ставим начальный режим первым элементом из массива
    start_adc();
    while(1) // основной непрерывный цикл
    {

    if (!(PINB & _BV(PB4))) _delay_ms(200); // если пин PB4 замкнут на землю ждём для пропуска дребезга контактов 50мс
    if (!(PINB & _BV(PB4))) // если он всё ещё замкнут
    {
    modesw(); // меняем режим
    _delay_ms(500);
    while(!(PINB & _BV(PB4))) strobe(); // пока кнопка нажата - стробим

    }

    }
    return 0; // Всё .
    }


  9. #79
    Не филология, а логофилия Аватар для stronge
    Байк
    Tideace FM-M009
    Адрес
    Москва
    Сообщений
    18,401

    По умолчанию

    mma29121983, Супер! Мне, правда, не надо, так как вольтметр подключен, но очень многим пригодится. Спасибо!
      ____,,,,_______________o__Q_Q_Q_Q\Q_Q_Q_Q_Q___,_;======,___,
    ()____________)___)_o_o___0b_~==============dB_G__G_______)

  10. #80

    По умолчанию

    На самом деле прошивка актуальна для плохих аккумуляторов, те которые проседают при нагрузке, хороший аккумулятор не проседает, и в итоге при достижении 3.1В(LOWBAT_TRIG 135 если 130, то примерно 2.9В) фонарик плавно затухает, но хоть защита будет. Сделал потому что планирую использовать не только на велосипеде, а вольтметр тоже купил, просто если на шлеме то его непонятно куда крепить чтобы еще и перед глазами был

+ Ответить

Информация о теме

Пользователи, просматривающие эту тему

Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)

Похожие темы

  1. Тормоза ARMOR или Не стоит гоняться за дешевизной
    от N-roman в разделе Технические вопросы
    Ответов: 8
    Последнее сообщение: 10.10.2008, 19:18
  2. Механика диск или V-brake???????????
    от Anonymous в разделе Технические вопросы
    Ответов: 26
    Последнее сообщение: 10.01.2008, 19:36
  3. Что лучше Merida Matts Sport 500 (2005г) или ...
    от unna[]v[]ed[iT] в разделе Выбор велосипеда
    Ответов: 15
    Последнее сообщение: 27.11.2004, 17:04
  4. Кто тут из ЮАО или рядом
    от Grin-mtb в разделе Москва.Юг
    Ответов: 58
    Последнее сообщение: 17.05.2004, 11:27