индикатор уровня заряда Li-Ion 3.7В на ATTiny13

Тема в разделе 'Батарейки, аккумуляторы и зарядные устройства', создана пользователем Acinonyx, 18 май 2010.

  1. Acinonyx

    Acinonyx Пользователь

    пишу прошивку для тини13 (и схему)
    будет измерять напряжение на ли-ионе (3.7 вольтовом) и выдавать результат измерения на светодиодную шкалу
    интересующиеся есть?
     
  2. suslox

    suslox Пушистикс Staff Member

    :) есть....я)
     
  3. Acinonyx

    Acinonyx Пользователь

    скучный листинг исходника на микропаскале
    Код:
    program liionmeter;
    { Declarations section }
    var i:byte;
        n:byte;
    
    procedure readacd;
    begin
    delay_ms(70);
    i:=ADC_Read(2)/4;
    end;
    
    function inv(t:byte):byte;
    begin
    if t=1 then inv:=0 else inv:=1;
    end;
    
    procedure led1;
    begin
    DDRB:=5;
    PORTB:=4;
    end;
    
    procedure led2;
    begin
    DDRB:=5;
    PORTB:=1;
    end;
    
    procedure led3;
    begin
    DDRB:=6;
    PORTB:=4;
    end;
    
    procedure led4;
    begin
    DDRB:=6;
    PORTB:=2;
    end;
    
    procedure led5;
    begin
    DDRB:=3;
    PORTB:=2;
    end;
    
    procedure led6;
    begin
    DDRB:=3;
    PORTB:=1;
    end;
    
    procedure resled;
    begin
    PORTB:=0;
    DDRB:=0;
    end;
    
    
    procedure prepvis;
    begin
     if i<=152 then n:=0 else
        {if i<186 then n:=6 else}   {mode6 is red + 1st green}
           if i<198 then n:=6 else
              if i<209 then n:=1 else
                 if i<221 then n:=2 else
                    if i<=232 then n:=3 else
                        if i<=244 then {n:=5} n:=4 else n:=0;
    
    end;
    procedure ind_chrg(num:byte);
     var c:dword;
     begin
     
     case num of
      1 :  begin
           for c:=1 to 30000 do
                       begin
                       led2;
                       resled;
                       end;
           end;
      2 :  begin
           for c:=1 to 30000 do
                       begin
                       led2;
                       resled;
                       led3;
                       resled;
                       end;
           end;
      3 :  begin
           for c:=1 to 30000 do
                       begin
                       led2;
                       resled;
                       led3;
                       resled;
                       led4;
                       resled;
                       end;
           end;
      4 :  begin
           for c:=1 to 30000 do
                       begin
                       led2;
                       resled;
                       led3;
                       resled;
                       led4;
                       resled;
                       led5;
                       resled
                       end;
           end;
      {5 :  begin
           for c:=1 to 30000 do
                       begin
                       led2;
                       resled;
                       led3;
                       resled;
                       led4;
                       resled;
                       led5;
                       resled;
                       led6;
                       resled;
                       end;
           end;}
      6 :  begin
           for c:=1 to 30000 do
                       begin
                       led1;
                       resled;
                       led2;
                       resled;
                       end;
           end
      else nop;
     end;
     
     end;
    
    
    begin
      { Main program }
      ADMUX.6:=1;
      DDRB.3 := 1;               // PORTB3 is ENABLE output to driver
      DDRB.5 := 0;               // PORTB5 is input from button
      PORTB.3:=0;                // ENABLE signal id OFF
    while TRUE do
          begin
          readacd;
          prepvis;
          if n=0 then   begin
                        PORTB.3:=0;
                        while true do begin
                                        PORTB.0:=0;
                                        PORTB.2:=inv(portB.2);
                                        delay_ms(250);
                                      end;
                        end
          else begin
               PORTB.3:=1;
               if PORTB.5=1 then begin
                                 ind_chrg(n);
                                 end;
               end;
          delay_ms(5000);
          end;
    
    end.
    led1 это красный, остальные зеленые
    к сожалению пока не удается воткнуть в код 5й зеленый светодиод... не хватает памяти =)

    порт B.3 стал выходом сигнала EN для драйвера (изначально планировался супервизор)
    никак не могу заставить гребаный микропаскаль работать с таймерами... придется курить даташиты и писать свой модуль обработки таймеров

    в архиве схемка
     

    Вложения:

    • indicator.rar
      Размер файла:
      28,1 КБ
      Просмотров:
      629
  4. suslox

    suslox Пушистикс Staff Member

    :cry: хны...я думал ты на асм пишешь(
     
  5. Acinonyx

    Acinonyx Пользователь

    ну не могу я на асме писать (
    но если интересно могу дать листинг на асме.... 600 строк... осилишь? )
     
  6. Acinonyx

    Acinonyx Пользователь

    надо учить си...
     
  7. INFERION

    INFERION Пользователь

    ИМХО, для МК ассемблер самое то. Я его за неделю выучил, не имея до этого ни малейших навыков программирования. В нём нет тёмных углов, он быстрый и занимает немного места. Простой до безобразия. Си я врятли вообще когдато выучу. Просто не осилю, да и не горит мне...
    Шкала и не лезет в память :confused: . Жесть... Вот на асме у меня код почти готовый (осталось проверить и устранить баги). Адаптивная система зажигания, со связью через USB. Кучу расчётов делает и корректно реагирует на различные сбои в двигателе. Можно крутить параметры с компа, и читать данные одновременно. Возится в основном с 16-ти разрядными числами (ATtiny2313). Всё на прерываниях, защиты от дребезга, индикатор загрузки ну и т.п. И весит скомпиленый файл 460 байт. Вот вам и ассемблер...

    Acinonyx. 600 строк на асме? Это что за монстр?
     
  8. Acinonyx

    Acinonyx Пользователь

    круть... не подскажешь на каком материале учил? тоже хочу асм за неделю =)
    я вообще сам не рад такой громоздкости кода
    когда програмишь для себя и на ПК, то както не особо расстраиваешься, когда программа начинает набирать килобайты веса =)
    а тут столкнулся вот
     
  9. axis

    axis Модератор Staff Member

    А мне объясните разницу между паскалем си и асмы? (Имею ввиду для контроллера.)
    и что значит на асме влезло а на паскале нет...
     
  10. ViNT

    ViNT Новичок

    Паскаль и Си - языки высокоуровневые, посторены так, что на выходе получается довольно много лишнего кода, без которого можно обойтись, Си этим страдает меньше чем Паскаль, но асму в этом плане равных нет. Си и Паскаль сделаны так, чтобы было удобно программеру, а производительность и размер кода стоят на втором месте. В асме же, все пишется прямо в коммандах процессора и оптимизация кода зависит только от умений программиста.
     
  11. Acinonyx

    Acinonyx Пользователь

    не совсем корректно... в асме пишет не "прямо в командах процессора"
    команды процессора это машинный код... вида 08 6F 20 и т.д.
    асм это язык низкого уровня, максимально приближенный к машинному коду
     
  12. Acinonyx

    Acinonyx Пользователь

    предлагаю выделить отдельную ветку "программирование" в разделе для опытных и там обсуждать все вопросы программирования
    например у меня нет желания бегать и регистрироваться в десятках форумах по программированию чтоб узнать как же за минимум команд сделать сортировку чего-нить или как правильно сконфигурировать АЦП
     
  13. axis

    axis Модератор Staff Member

    Именно,ассемблер максимально приближенный, и имеет то же компилирование что и паскаль и СИ. И разница в набранной программе будет незначительна, более того учитывая что там турбо.
    А по программе выше, ИМХО там что то уж больно заморочено, просматриваеться простая "транзисторная" логика. Сорь разбираться лень...
     
  14. Sparker

    Sparker Пользователь

    Вообще говорят, что лучше сначала освоить ассемблер, чтобы понять, как внутри работает микроконтроллер, а потом перейти на высокоуровневые языки программирования.
     
  15. axis

    axis Модератор Staff Member

    Ну, кому как... Я могу сказать одно, когда я писал диплом на асемблере только одно окно с надписью отняло у меня почти месяц. Думаю что лучше сразу учить СИ или Борланд паскаль и не морочить себе голову. Там чистая математика которую нужно осваивать как математику.
     
  16. Acinonyx

    Acinonyx Пользователь

    итоговый размер программы при разных используемых языках (и соответственно компиляторов) отличается (а иногда просто мегазначительно)
    язык асма обкатан вдоль и поперек, компиляторы (и их оптимизаторы) выдают практически идеальный код (найдите сайты про демо-программы, когда в 128 БАЙТ!!! помещают всякие 3Д объекты и всякие эффекты)
    Си тоже обкатан, но в итоге выйдет утяжеленный всякими ненужными кусками о которых оптимизатор пока ничего не знает
    компиляторы паскаля для авр можно пересчитать по пальцам (я знаю только 3), отсюда очень плохая оптимизация и как следствие громоздкий код и зачастую просто тонны мусора
    как в моем случае компилятор выдал листинг на 600 строк (без коментов останется 400) асма
    если эту программу написать на асме, то врядли получится больше 150 строк кода
     
  17. Acinonyx

    Acinonyx Пользователь

    асм на авре гораздо проще чем на х86 архитектуре
     
  18. axis

    axis Модератор Staff Member

    Ну если на паскале напишешь НОРМАЛЬНУЮ программу то уложишься и в 150. приглядись у тебя в коде мусора на 400 строк, зачем кодить по простой логике с такими тяжёлыми переменными? Конечно может я что то не допонимаю...
     
  19. suslox

    suslox Пушистикс Staff Member

    аксис, все равно - пойми - даже самый идеальный код на высокоуровневом языке будет занимать больше,чем аналогичный на асм!также все скоростные программы типа дров в компе, биоса, математики и тд пишутся только на асм! потому что по скокрости работы остальные языки проигрывают пополной
     
  20. axis

    axis Модератор Staff Member

    Суслик, ты немного ошибаешься. асм(я про кросс) - хороший язык но это не асемблер, и дрова не пишут на нём уже давно. Это раз. Биос не пишут на асемблере это два, да и сходи на http://ru.wikipedia.org/wiki/%D0%90%D1% ... 0%B5%D1%80 почитай, там написанно много интересного.
    Да забыл, основная причина почему асемблер умирает-это ядро операционной системы в которой асемблер не может обеспечить необходимой стабильности.
     

Поделиться этой страницей