На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
  
    > Микроконтроллер для опытов. , И программатор к нему.
      Хочу научиться использовать микроконтроллеры и отсюда вытекает парочку вопросов:

      Какая модель лучше подойдёт для всего этого издевательства над девайсом?
      Какой тип лучше выбрать PIC или AVR с точки зрения удобства и полезности в дальнейшем применении?
      Конечно же интересует доступность как самого девайса, так и его цена.

      Минимальные требования:
      8-битный порт I/O , проц на 10МГц, 128 байт оперативки, обработка внешних прерываний.
      Планируется частая перепрошивка (а как без неё при изучении)
      Желательно без всяких дополнительных наворотов (АЦП, ЦАП и всё в таком духе)

      Посоветуйте пожалуста модельку и программатор к ней (100% рабочий и что-бы можно было собрать самому).
        http://www.rev-ed.co.uk/picaxe/

        База pic 16f88 запрограмирован Бэйсиком, Один день и вы Embedded программер

        http://www.basicx.com/ база ATMEL (то что на базе AT90S8535 - очень даже крутенький) зашит тоже бэйсиком

        а этот не смотря на то что тоже бэйсиком прошит уже тянет на промышленый уровень
        http://www.comfiletech.com/index.asp?PageAction=VIEWPROD&ProdID=2

        Для старта ИМХО лучше не придумаешь.

        програматор - для всех них любой писюк с виндой от win98 до ...
        и свободный COM - port ( все програмируются через RS232)


        Best regards,

        P.S.

        Цитата
        Посоветуйте пожалуста модельку и программатор к ней (100% рабочий и что-бы можно было собрать самому


        Посмотрите этот сайт :
        для старта найдете очень много полезных ссылок
        Сообщение отредактировано: AlexJ -
          Цитата KillerXX7, 06.08.2006, 1:02:35, 1205970
          Какой тип лучше выбрать PIC или AVR с точки зрения удобства и полезности в дальнейшем применении?

          Zilog рулит :) Мнемоника Zilog (ну, тыж хочешь как серьёзный человек, на асме писАть, да?) ИМХО намного удобнее и понятнее прочих.
          Цитата KillerXX7, 06.08.2006, 1:02:35, 1205970
          Планируется частая перепрошивка (а как без неё при изучении)

          Я бы для этого выбрал модель с возможностью подкл. внешнего ROM. Хотя, ИМХО - отлаживать надо в эмуляторе, а в МК писать, когда уверен, что заработает. Если с десятой попытки не получится работающее устр-во - значит руки неоттуда растут ;) :)
            Цитата Змей(Чёрный) @
            Zilog рулит :)

            Вы этот имеете в ввиду ?

            Очень неплохой, но ИМХО для старта сложноват
              Вот почитал я много информации по теме, и что-то выбор останавливается на AVR микроконтроллерах... Чем то они привлекательны :)
              Что думаете о таком комплетке:
              МК - ATTiny2313 (замена старому AT90S2313)
              Программатор - Altera Byte Blaster
              Софт программатора - AVReAL

              Цитата Змей(Чёрный) @
              ну, тыж хочешь как серьёзный человек, на асме писАть, да?

              А как-же! Самый чистый и компактный код можно получить только на ассемблере! :yes:

              Добавлено
              У зилога скорость хорошая и портов много... Но это на будующее, а сейчас что попроще и понаглядней.
                Цитата AlexJ, 06.08.2006, 2:36:22, 1205985
                Вы этот имеете в ввиду ?
                Очень неплохой, но ИМХО для старта сложноват
                Очень сорри, у меня трафика осталось почти ничего, по линку сходить не могу...

                Zilog это не определённый контроллер, а фирма-производитель. Наиболее известное изделие - процессор Z80 :wub:
                Лично мне изделия фирмы зилог нравятся тем, что используют, в отличие от интела и моторолы, полноценную мнемонику, без "подразумевания". например, команда "поместить в регистр-пару BC значение NN" пишется так: ld bc,NN :wub:

                Вообще, что-то более-менее серьёзное лично я предпочитаю делать не на контроллере, а на комплекте - Z80, ВВ55А, ROM-чип + RAM-комплект, прочее железо по необходимости. Это не самый удобный способ, но просто я ОЧЕНЬ лублу Z80 :wub:
                  Цитата Змей(Чёрный) @
                  Zilog это не определённый контроллер, а фирма-производитель. Наиболее известное изделие - процессор Z80 :wub:

                  Помним, помним, старичка Зилог (эх времена, синклеры, аоны, "специалист","радио-86рк", микроша, загрузка с 5 раза через магнитофон с зажеванной кассеты...), классный проц, но увы не микроконтроллер.
                  Современные uC уже дано его (Z80) позади оставили... эволюция однако.
                  Так что лучше идти в ногу со временем, а то года задерживаешься на старом ,тяжелей потом нагонять, да и работать с новой техникой гораздо приятней.

                  -Added
                  Цитата KillerXX7 @
                  Вот почитал я много информации по теме, и что-то выбор останавливается на AVR микроконтроллерах... Чем то они привлекательны :)

                  Все зависит от конкретной задачи. Скорость, типы интерфэйсов для общения с внешним миром, энергопотребление, компактность, скорость разработки.
                  Если просто для души, но с надеждой на будущее, то ИМХО лучше сейчас потратить
                  время и остановиться на чем то одном (желательно переспективном) чтобы в голове потом путаницы между ассемблерами не было. это у нас у всех так, самый первый - самый любимый и надолго. По поводу вашего выбора - ATMEL-ки классные конроллеры, мне они тоже очень нравятся, и софта для них много, хотя PIC-и тоже не плохи.
                  ИМХО если есть база (опыт работы с хардварью, ассемблер) то выбор для старта
                  AVRки то что надо.

                  По поводу програматора:
                  все новые Атмелы имееют ISP(in system programming), поэтому
                  можно пойти по более простому пути, гляньте еще здесь
                    И PIC'и и AVR'ы, пожалуй, одинаково хороши. Архитектура PIC'ов постарее, но битовые операции более развиты, хотя старшие PIC'и не менее наворочены, чем AVR'ы.
                    И PIC'и и AVR'ы поддерживают ISP.
                        AVRки как "начало" рулят. Хотя начинать я бы посоветовал все же с чего-нить повеселее, типа ATMega16. Также рулят платы типа WishBoard - макетная плата с дырочками, без пайки.

                        ByteBlaster - рулез. AVReal - тоже.

                        Сайтик кстати есть неплохой - avr123.nm.ru

                        Как компилятор - посмотри в сторону IAR (сам пользую) или WinAVR (раньше пользовал).
                          Цитата AlexJ, 06.08.2006, 5:41:26, 1206001
                          Помним, помним, старичка Зилог (эх времена, синклеры, аоны, "специалист","радио-86рк", микроша, загрузка с 5 раза через магнитофон с зажеванной кассеты...), классный проц, но увы не микроконтроллер.

                          Блин, проц не Zilog, а Z80 называется! :angry: Zilog это фирма. К тому же ты глобально напутал. "специалист","радио-86рк", "микроша" построены на К(Р)580ВВ80, аналог интеловского 8080. (надеюсь, цифры не напутал... с этим железом нечасто работал...)
                          Цитата AlexJ, 06.08.2006, 5:41:26, 1206001
                          Так что лучше идти в ногу со временем, а то года задерживаешься на старом ,тяжелей потом нагонять, да и работать с новой техникой гораздо приятней.
                          Видишь ли.... переделать программку с Z80 на один из новых Zilogовских МК-несложно. А схема стандартной архитектуры (раздельной. проц, память, ввод/вывод) НАМНОГО удобнее.
                          А "работа с новой техникой гораздо приятней" - вообще непонятно, что ты имеешь ввиду. Это тебе не женщины... :D

                          Зилог рулит. Никому не предлагаю строить системы на Z80, но Зилог делает отличные МК, лучше PICов точно... с ATMEL я не сталкивался, но PIC против Ziloga шумно сливает, полюбому.
                            Цитата Змей(Чёрный) @
                            Блин, проц не Zilog, а Z80 называется! :angry: Zilog это фирма. К тому же ты глобально напутал. "специалист","радио-86рк", "микроша" построены на К(Р)580ВВ80, аналог интеловского 8080. (надеюсь, цифры не напутал...

                            Саш, да не злитесь Вы, то что Zilog - это завод, а Z80 - проц, это я еще 15 лет назад знал, просто начали Вы про него говорить и сразу молодость вспомнилась.
                            Цитата
                            К тому же ты глобально напутал

                            :D Да нет не напутал, просто-ж говорю времена вспомнились, BTW не К(Р)580ВВ80
                            а К(Р)580ВMВ80 он у меня на стенке в лаборатории висит (первенец :) )

                            Ладно сорри за оффтоп, автору топика, может быть будет интересно подключиться к форуму Конференция «Микроконтроллеры и их применение» очень хороший ресурс и по теме.

                            Best regards,
                              Z80 или 580ВМ80
                              На этой базе можно собирать контроллер за пол дня, без печатной платы, навесным монтажем. Выдумывать что угодно, сто раз переделывать, конструировать любые решения для любого предназначения.
                              Недостатки: Большее энергопотребление, малая тактовая частота, громоздкие схемы, большие помехи в пространство. В связной аппаратуре не применить. Ограниченая опер. память макс 128 кбайт.
                              Вспомнить давно забытое прошлое всегда приятно!
                                Цитата Максим Гайгальник @
                                Z80 или 580ВМ80
                                На этой базе можно собирать контроллер за пол дня, без печатной платы, навесным монтажем.

                                Максим, за пол дня с нуля на этой технике Вы ничего не соберете , в лучшем случае спаяете ее в кучу, и потом + пару дней на отладку в навесном монтаже, не говоря уже о прорамировании. Представте себе прийдем мы к заказчику и Вы принесете... плату с навесным монтажом и кто нибудь другой с одной микросхемой в кармане(причем микросхемка раз в 10 - 20 более шустрая и стоимость проекта НА МОГО меньшая[разработка+мат.часть] и работает от одной батарейки пол года )
                                Как Вы думаете, кому покупатель отдаст предпочтение ? :)
                                А теперь скачайте среду разработки с http://www.rev-ed.co.uk/picaxe/software.htm
                                или с http://www.amctools.com/ и сделайте вывод, за сколько реально можно запустить проект, ничего не паяя и
                                Цитата
                                Выдумывать что угодно, сто раз переделывать, конструировать любые решения для любого предназначения.


                                Ладно, как отмазка за оффтоп еще одна ссылочка для автора топика с очень
                                большой библитекой информации: http://lord-n.narod.ru/walla.html
                                  Цитата AlexJ, 06.08.2006, 19:57:34, 1206443
                                  не К(Р)580ВВ80 а К(Р)580ВMВ80

                                  ой. сорри, очепятка. имелось в виду не ВВ, а ВМ. а ВМВ это что такой?
                                  Цитата Максим Гайгальник, 06.08.2006, 20:15:38, 1206456
                                  Z80 или 580ВМ80
                                  На этой базе можно собирать контроллер за пол дня, без печатной платы, навесным монтажем. Выдумывать что угодно, сто раз переделывать, конструировать любые решения для любого предназначения.

                                  угу :yes:
                                  Цитата Максим Гайгальник, 06.08.2006, 20:15:38, 1206456
                                  Недостатки: Большее энергопотребление, малая тактовая частота, громоздкие схемы, большие помехи в пространство.

                                  ой да ладно, помехи... реальное железо следует строить в металлическом корпусе, а корпус красить молотковой эмалью. :) И красиво, и помех никаких...
                                  Цитата Максим Гайгальник, 06.08.2006, 20:15:38, 1206456
                                  В связной аппаратуре не применить.
                                  хм. Видел трансивер с цифровым управлением, на интеловском 8080 (ВМ80 - его копия.) нормально работает...

                                  Цитата Максим Гайгальник, 06.08.2006, 20:15:38, 1206456
                                  Ограниченая опер. память макс 128 кбайт.
                                  ЭЭххх... адресуемая память - 64К. Вторые 64К это уже вторая страница. Адресуемый диапазон ввода-вывода - 64К. Физическая память ограничена только разумностью, без особого усложнения схемы (при условии применения Static RAM.). Потребуется простейшая подпрограммка - менеджер страничной памяти, плюс небольшой фокус со старшими разрядами шины адресов ОЗУ. Берём ВВ55, вешаем на IO, получаем 24 бита расширения шины адреса, которыми мы будем переключать страницы. 16 миллионов страниц страниц... нехило, да? Правда, я никогда не делал больше восьми страниц (страница по 32К, итого 256К.). Для этого достаточно 3х линий, и отдельную ВВ55 использовать не пришлось, нашлось место на общей.(там один из портов можно программировать не на 8бит, а на 2 по 4)
                                    Цитата Змей(Чёрный), 06.08.2006, 21:06:19, 1206496
                                    Видел трансивер с цифровым управлением, на интеловском 8080 (ВМ80 - его копия.) нормально работает...

                                    Как не лепил в трансивер, - фонит. Но теоретически можно, если делать в раздельных частях металлического корпуса трансивера.
                                    Потом пошла посовременней серия процессоров русских, не вспомню точно, меньше обвязки. Процессор, память, ввод вывод. В три раза меньше контроллер получался, практически не фонил. Работал в КВ УКВ трансивере. При желании можно собрать трансивер круче чем какой нибудь 2 т. баксов Кенвуд. Но не стоит того ибо все продается. Только как ностальгия если нечем заняться.

                                    Цитата Змей(Чёрный), 06.08.2006, 21:06:19, 1206496
                                    ЭЭххх... адресуемая память - 64К.

                                    Видел решение только на две страници, по этому так и сказал 128. А больше наверное и смысла нет. Так как ПЗУ не особо обьемны были. Если это контроллер, не ПК.
                                      Спасибо за ссылки и советы! Ушел изучать :)
                                        Здравствуйте! Решил новую тему не начинать, а в этой спросить:
                                        в Аtiny13 Watchdog-таймер сбрасывает память, или нет(в режиме system reset)? Т.е., делает ли WDT полный аппаратный сброс?
                                        Мне нужно реализовать режим, когда программа выполняется один раз и МК отправляется в спячку, а по WD таймеру (через пару секунд) просыпается, но нужно сохранять параметры с предыдущего цикла. Или придётся использовать WDT в режиме прерывания? Хотелось бы системный сброс, чтобы заодно и надёжность повысить, хотя, может я становлюсь параноиком?
                                        Что посоветуете?
                                          Несовсем понял что за параметры цикла хочешь сохранить.
                                          Если это данные, то пиши в оперативку. (или оставляй там, в зависимости от того как реализована программа)

                                          WD на tiny13 полюбому вызывает прерывание номер 9 - 0x0008 - WD Timeout

                                          Добавлено
                                          Кстати, раз уж подняли тему.... Нашел суперскую прогу для прошивки микроконтроллеров, никакого программатора, напрямую в LPT коннетится.
                                          Вобщем мега-вещь.

                                          UniProf - http://avr.nikolaew.org/
                                            Я и имею в виду данные из оперативки. Мне нужно, чтобы они сохранялись. Да какие там данные. По идее, наверное, можно будет одним битом обойтись(режим работы устройства на предыдущем цикле). Под циклом я имею в виду каждый проход программы: от нулевого адреса и до команды "спать". Т.е., проснулся МК, и с нулевого адреса всё по новой, только с учётом текущего режима устройства
                                            WD имеет несколько режимов: Interrupt, system reset, и смешанный: сначала Int, потом sys res. Вот этот последний как раз используется для того, чтобы сохранить данные(в еерrom?). Но чего-то мне неохота в eeprom каждые 2 сек. записывать, этак она долго не протянет. Может есть какой-нибудь способ?
                                              Цитата Prince @
                                              Может есть какой-нибудь способ?
                                              Этот способ был придуман еще во времена MS-DOS, чтобы отличать "горячий старт" от "холодного". В память(ОЗУ) пишется определенное достаточно длинное слово, после сброса оно читается и проверяется.

                                              Добавлено
                                              Цитата Prince @
                                              в Аtiny13 Watchdog-таймер сбрасывает память, или нет(в режиме system reset)?
                                              Никакой сброс нигде память не сбрасывает. После подачи питания в ОЗУ мусор, после сброса - то, что там было до сброса(если только в железе нет ошибки, приводящей к порче памяти). Я не видел ни одного микроконтроллера, в котором память чистилась бы автоматически.
                                              Сообщение отредактировано: trainer -
                                                Цитата
                                                Этот способ был придуман еще во времена MS-DOS, чтобы отличать "горячий старт" от "холодного". В память(ОЗУ) пишется определенное достаточно длинное слово, после сброса оно читается и проверяется.

                                                Ну так после холодного старта данные в памяти теряются? Что-то я не понял, к чему... :unsure:

                                                Цитата
                                                Никакой сброс нигде память не сбрасывает. После подачи питания в ОЗУ мусор, после сброса - то, что там было до сброса(если только в железе нет ошибки, приводящей к порче памяти). Я не видел ни одного микроконтроллера, в котором память чистилась бы автоматически.



                                                trainer, спасибо. Но это точно? Я проверить сейчас не могу, нужно все свои железки раскапывать. А мне пока нужно определиться: использовать ли МК вообще, или "по старинке", на ОУ схему делать.
                                                Почему я спрашиваю. Я в предыдущем посте упомянул про третий режи WDT. В даташите написано, что он используется как раз для того, чтобы данные можно было предварительно сохранить. Т.е., имеются в виду только данные из РОН, а в ОЗУ и так всё сохраниться?
                                                Сообщение отредактировано: Prince -
                                                  Цитата Prince @
                                                  Т.е., имеются в виду только данные из РОН, а в ОЗУ и так всё сохраниться?
                                                  Цитата
                                                  This mode will for instance allow a safe shutdown by saving critical parameters before a system reset.


                                                  Цитата Prince @
                                                  Ну так после холодного старта данные в памяти теряются? Что-то я не понял, к чему...
                                                  После старта, и начального тестирования читаешь содержимое участка ОЗУ. Если там содержится некое условное число, например, 0x5555, значит у нас произошел сброс без отключения питания(внешний сброс или сторожевая собака сработала) - ОЗУ содержит данные, бывшие там до сброса, если не содержит, то только что подали питание. В зависимости от этого выполняем нужные действия и записываем в тот же участок памяти это самое условное число.

                                                  Добавлено
                                                  Кстати, у ATTiny13 есть флаг, показывающий, что произошел сброс от сторожевой собаки - бит WDRF в регистре MCUSR.
                                                    Цитата
                                                    This mode will for instance allow a safe shutdown by saving critical parameters before a system reset.

                                                    Не понял. :unsure:

                                                    Цитата
                                                    Кстати, у ATTiny13 есть флаг, показывающий, что произошел сброс от сторожевой собаки - бит WDRF в регистре MCUSR.

                                                    Да эт я знаю. Но мне не это надо: узнавать отчего сброс.
                                                      Цитата Prince @
                                                      Не понял.
                                                      Цитата
                                                      Этот режим позволяет, например, выполнять безопасное завершение работы путем сохранения критических параметров перед выполнением системного сброса
                                                        Хороший девайс Atmel-stk500.
                                                        Цитата

                                                        The STK500 is a complete starter kit, programming tool and development system for Atmel’s AVR microcontrollers. The STK500 gives AVR users the freedom to develop and test complete AVR designs and prototypes. The STK500 supports the following Atmel AVR devices: ATtiny11 ATtiny12 ATtiny15 ATtiny22 ATtiny26 ATtiny28 AT90S1200 AT90S2313 AT90S2323 AT90S2333 AT90S2343 AT90S4414 AT90S4433 AT90S4434 AT90S8515 AT90S8535 ATmega8 ATmega8515 ATmega8535 ATmega161 ATmega162 ATmega163 ATmega16 ATmega1692 ATmega323 ATmega32 ATmega641 ATmega1031 ATmega1281 AT899513 AT899523
                                                        AT86RF4013.
                                                          Где сохранять? В ЕЕPROM?
                                                          Что-то мы как-то не поймём друг друга.
                                                          Мне подходит, если ОЗУ после системного сброса сохраняет данные. Но вот эта цитата, что Вы привели, и заставляет меня сомневаться в этом. Поэтому я и спросил: имеется в виду сохранять критические параметры только те, что храятся в регистрах, которые после системного сброса 100% "потеряются" или и ОЗУ тоже?
                                                          Сообщение отредактировано: Prince -
                                                            Цитата Prince @
                                                            которые после системного сброса 100% "потеряются" или и ОЗУ тоже?

                                                            Если питание не снимается то ОЗУ останется без изменений,
                                                            именно поэтому и предложили держать какую-то ячейку ОЗУ как контрольный флаг.
                                                            Если програма инициализации смотрит в эту ячейку и пароль не сходится(мусор при первом холодном страте) то ОЗУ чистое, если пароль(флаг) сходится значит
                                                            значит стартанули или из спячки, или по сторожевой собаке.
                                                              Цитата Prince @
                                                              имеется в виду сохранять критические параметры только те, что храятся в регистрах, которые после системного сброса 100% "потеряются" или и ОЗУ тоже?
                                                              Имеется в виду, что этот режим позволяет делать что-то перед сбросом.
                                                                :wall:
                                                                Вы меня совсем запутали.
                                                                Есть режим WDT: сначала выполняется преывание(в обработчике которого нужно ручками сохранить важные данные: откуда-то(регистры ОН IO, ОЗУ(?) , и куда-то(EEPROM, ОЗУ(?), чтобы они не потерялись, а уже потом выполняется системный сброс(после которого эти данные могли бы потеряться).
                                                                Вопрос: ОЗУ Atiny13 после cистемного сброса сохраняет инфу или нет? Чёткого ответа я не нашёл пока.

                                                                В общем, как проверю, отпишусь.
                                                                  Цитата Prince @
                                                                  Есть режим WDT: сначала выполняется преывание(в обработчике которого нужно ручками сохранить важные данные

                                                                  Все зависит от задачи, надо ли переинициализировать все ОЗУ как при первом старте
                                                                  или Ваша алгоритм (задача)умеют анализировать холодный и горячий страт. Если вам надо (согласно логиге вашей програмы стартовать как при холодном старте инициализируя все с нуля или поймать по флагу что это горячий старт, или сброс произошел по вотч догу) вы можете поймать момент в стартовой програме был ли сброс по вотч догу и питание не снималось(ЗНАЧИТ ОЗУ СОХРАНИЛОСЬ)
                                                                  или в памяти мусор(флаг не выставлен значит ОЗУ не сохранилось, значит снималось питание) значит старт идет холодный - первый. в соответствии с этим вы можете в обработчике прерывания по вотч догу установить в ОЗУ флаг и сохранить только регистры.

                                                                  С чего вы взяли что "сброс(после которого эти данные могли бы потеряться)."
                                                                  при сбросе теряются только состояние регистров, ОЗУ остается в том же состоянии если вы не снимали питание.
                                                                  Сообщение отредактировано: AlexJ -
                                                                    Эээ... Кусок кода на IAR C для AVR, который реализует поставленную задачу:

                                                                    Правда, компилируемость не проверял - вырезал "по живому" из программы.

                                                                    Основная идея:
                                                                    Программа имеет некую переменную bValue, которую холит и лелеет.
                                                                    Также, имеет некоторые настройки, которые хранятся в EEPROMе.

                                                                    Если ничего не происходит на некоторой линии за какое-то время, то программа "засыпает", а будит её WatchDog. Причем будит перезагрузкой. При старте программа проверяет, не был ли контроллер перезагружен с помощью WDT, и если не был (т.е. холодный старт) - то обнуляет переменную. Если был - просыпается.

                                                                    PS: Код для ATTiny26. Для других процов возможно потребуется поправить названия регистров.

                                                                    ExpandedWrap disabled
                                                                      // Crystal: 11.0592MHz
                                                                      #include "global.h"
                                                                      #include "init.h" //Initialization sequences
                                                                      //#include "softserport.h"
                                                                      #include "iButton.h"
                                                                       
                                                                      __no_init unsigned char bValue;
                                                                       
                                                                      int main(void)
                                                                      {
                                                                          __disable_interrupt();
                                                                        
                                                                          InitPeripherals();
                                                                          
                                                                          __enable_interrupt();
                                                                       
                                                                          SafeReadEEPROM(); //Checks CRC of EEPROM and fails if check failed.
                                                                       
                                                                          //Check that we have or have not resetted by WatchDog:
                                                                       
                                                                          if (MCUSR&_BV(WDRF))
                                                                          {
                                                                              //Hot-start (resetted by watchdog)
                                                                              MCUSR&=~_BV(WDRF);
                                                                              
                                                                              //Check that we need to be online:
                                                                              if (/*...Nothing happens on some line...*/)
                                                                                  EnterDeepSleep();
                                                                          }
                                                                          else
                                                                          {
                                                                              //cold-start. Init value.
                                                                              bValue=0x00;
                                                                          }
                                                                       
                                                                          while(1)
                                                                          {
                                                                              __watchdog_reset();
                                                                              
                                                                              if (/*...smth...*/))
                                                                              {
                                                                                  EnterDeepSleep();
                                                                              }
                                                                          }    
                                                                      }
                                                                       
                                                                       
                                                                      inline void eeprom_read_block (unsigned char *pointer_ram, unsigned char pointer_eeprom, unsigned char size)
                                                                      {
                                                                          do
                                                                          {
                                                                              _EEGET(*pointer_ram,pointer_eeprom);
                                                                              pointer_ram++;
                                                                              pointer_eeprom++;
                                                                              size--;
                                                                          }
                                                                          while(size);
                                                                      }
                                                                       
                                                                      void SafeReadEEPROM()
                                                                      {
                                                                          eeprom_read_block(pBuffer,EEPROM_DATA_START,16);
                                                                          if (crc8(pBuffer,16)) //Non-zero
                                                                              bFail=TRUE;
                                                                          else
                                                                              bFail=FALSE;
                                                                      }
                                                                       
                                                                       
                                                                      inline void eeprom_write_block (unsigned char *pointer_ram, unsigned char pointer_eeprom, unsigned char size)
                                                                      {
                                                                          do
                                                                          {
                                                                              _EEPUT(pointer_eeprom,*pointer_ram);
                                                                              pointer_ram++;
                                                                              pointer_eeprom++;
                                                                              size--;
                                                                          }
                                                                          while(size);
                                                                      }
                                                                       
                                                                      void EnterDeepSleep()
                                                                      {
                                                                          INDICATE_NONE;
                                                                          MOSFET_OFF;
                                                                          //Enable watchdog:
                                                                          WDTCR=_BV(WDE)|_BV(WDP0)|_BV(WDP1)/*|_BV(WDP2)*/;   // 0.14s
                                                                          
                                                                          ADCSR &= ~_BV(ADEN);
                                                                          
                                                                          MCUCR = _BV(SE)|_BV(SM1);
                                                                          __sleep(); //Power-down mode. Exit by Watchdog reset.
                                                                      }
                                                                       
                                                                      void InitPeripherals(void)
                                                                      {
                                                                          //
                                                                          //  Init I/O ports:
                                                                          //
                                                                          DDRA  = 0x00;
                                                                          PORTA = 0x00;
                                                                          
                                                                          PORTB = 0x00;
                                                                          DDRB  = 0x00;
                                                                       
                                                                          MCUCR = 0x00; //two times to write JTD bit.
                                                                          
                                                                          PLLCSR = 0x00;
                                                                          
                                                                          ACSR  = _BV(ACD); //Analog Comparator Disable
                                                                      //  ADCSR = 0x80;
                                                                      }
                                                                    Сообщение отредактировано: Kosha -
                                                                      Ну, спасибо, общими усилиями вы меня убедили: с памятью будет всё в порядке. :D
                                                                      trainer,
                                                                      AlexJ,
                                                                      Kosha, спасибо вам.
                                                                      0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                                                                      0 пользователей:


                                                                      Рейтинг@Mail.ru
                                                                      [ Script execution time: 0,0759 ]   [ 15 queries used ]   [ Generated: 27.04.24, 17:21 GMT ]