PCCar.ru - Ваш автомобильный компьютер

PCCar.ru - Ваш автомобильный компьютер (http://pccar.ru/index.php)
-   Разное (http://pccar.ru/forumdisplay.php?f=158)
-   -   Интеллектуалный БП для Asus EeePC (http://pccar.ru/showthread.php?t=9254)

yurich38 20.07.2009 18:05

Интеллектуалный БП для Asus EeePC
 
Вложений: 2
Интеллектуальный блок питания для Auas EeePC

Вложение 11829

в связи с тем что многие задают вопросы что/как сделать, решил все подробно описать в отдельной теме, вопросы и конструктивная критика приветствуются.
также некоторая инфа есть в моем проекте http://www.pccar.ru/showthread.php?t=8178

как было выяснено, EeePC имеет очень "неприятную" особенность, при небольшом скачке на входе питания, он сразуже переходит на батарею.. эксперименты с канденсаторами, и т.п. ничего не дали.
использовать Li-ion батарею в машине, в наших сибирских условиях, не реально (Li-ion батареи очень бояться мороза)
поэтому питание EeePC лучше осуществлять через разъем батареи.
для батареи:
напряжение питания 8.3В - полностью заряженная батарея
ЕееРс работает при понижении до 5.9В!, (начинает мигать лампочка "разрядки")
я настраивал свой преобразователь на 8В.

и так для начала о схеме самого преобразователя
использовать параметрические стабилизаторы (помоему так называются) типа 7809 или "Кренки" не стоит.
во первых они выделяют огромное количество тепла
во вторых, при большой нагрузке наблюдается просадка, что нежелательно.

хорошим выбором в данном случае будет импульсная схема, например на LM2576
напряжение на входе может быть до 40В,
к тому-же можно купить уже практически готовую схему
http://www.masterkit.ru/info/magshow.php?num=405
дальше, всеголишь подбором резисторов R1,R2 выставить нужное напряжение на выходе.

Вложение 11830

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

yurich38 22.07.2009 12:15

Вложений: 3
Интеллект.
собрано все на микроконтроллере tiny15.
Вложение 11857
Вложение 11858

схема довольно простая, можно конечно еще и исключить светодиоды, но не советую. для отладки это незаменимая вещь :)
Вложение 11856

прошивка+схема+исходник.
http://forum.pccar.ru/attachment.php...3&d=1247704033

yurich38 22.07.2009 13:03

Вложений: 1
как прошить микроконтроллер?
очень просто.
покупаем tiny15L. (какой модификации не существенно, главное чтобы корпус был удобный для пайки :))

даташит, если кто хочет знать больше :)
http://www.atmel.com/dyn/resources/p...ts/doc1187.pdf

прошить можно с помощью самого простого программатора через lpt
Вложение 11859
соединяем tiny15 с lpt и подключаем питание. можно взять с usb.
на этом железная часть окончена..

yurich38 22.07.2009 13:26

Вложений: 2
для прошивки скачиавем PonyProg http://www.lancos.com/e2p/V2_06/ponyprogV206f.zip
устанавливаем и запускаем..

первое что вытает программа это
"You need to run Calibration from the Options menu
before any read/write operations" и еще чтото..

лезем в меню Setup\Calibration..
закрывем все лишние приложения и жмем OK.
программа откалибруется и выдаст ОК.

теперь настройка интерфейса.. Setup\Interface Setup
выбираем паралельный порт и Avr ISP I/O
Вложение 11862
теперь выбираем что шьем.. Device\AVR micro\ATtiny15

программа готова к прошивке.
открываем нашу прошивку bp.hex
File\Open Device File..

Вложение 11861
и жмем Write Program Memory (Flash)

если все правильно прошивка и проверка пройдет без ошибок.. :)

DimSky 22.07.2009 18:28

Мда... :tease:
Нет ли уж совсем готовых решений типа мастеркита чтобы вообще ничего не надо было прошивать ? :)

Anthonymus 23.07.2009 00:01

Давно ждал Вашу статью про блок питания. Спасибо. Теперь несколько вопросов:
1. Про БП - каковы характеристики дросселя. Диаметр стержня диаметр провода и число витков :-) Ну недружу я с катушками :-( Чем охлаждать.
2. Про контроллер. Есть ли задержка на отключении ACC? Просто у меня в машине магнитолу можно слушать только при наличии ключа в зажигании. И при отключении зажигания для включения магнитолы существует отдельное положение ключа...

Ну и фотки самого БП хотелось бы лицезреть...

Спасибо за информацию. Очень впечатлен Вашей работой.

yurich38 23.07.2009 07:44

Вложений: 3
Вложение 11887
Вложение 11888
Структурная схема питания EeePC
Вложение 11889

я с дросселями тоже не дружу. :) по идее если покупать мастеркит там уже все должно быть для намотки дросселя.
В моем преобразователе стоят паралельно два дросселя с маркировкой 300. что это значит попробую выяснить :smile1:

чем охлаждать.. посмотрите в моем проекте здесь (в подписи) и тут http://compcar.ru/forum/showthread.php?t=4232
lm2576 и 7805 прикручены на радиатор ЕееРс.

yurich38 23.07.2009 07:53

несколько комментариев по схеме..
транзистор .. можно взять C337
стабилитрон на 4.7 вольта, тоже любой
номиналы конденсаторов не сильно существенны. они там для гашения просадки по питанию.
по схеме бп в архиве - от 7805 - сопротивление на ноге сидит - а кое где, на схеме, его нету. - это сопротивление не нужно, я его из схемы убрал.

yurich38 23.07.2009 08:00

алгоритм работы:
при включении АСС..
включаем питание преобразователя, ждем Х-сек, нажимаем кнопку, ждем Y-сек, считаем что комп включен
при отключении...
гасим подсветку LCD, ждем М-мин, нажимаем кнопку, ждем Y-сек, считаем что комп выключен, ждем N-сек и отключаем питание..

для данной прошивки.
X-10сек Y-50сек M-15мин N-30сек

Если состояние АСС изменилось до нажатия кнопки. то процесс включения/отключения будет отменен.
Если после, процесс будет доведен до конца.
т.е. если кратковременно включить АСС то будет включен преобразователь и через 30 сек выключен.

Исключительные ситуации в программе:
Если комп отключился сам (не по нажатию кнопки) - отключить питание преобразователя
Если после нажатия кнопки спустя 70сек. комп не выключился/включился - отключить питание преобразователя

Anthonymus 23.07.2009 10:09

Ага - с контроллером понял. Комп гасится через 15 мин после пропадания сигнала ACC (экран сразу). Если в течении этих 15-ти мин АСС появится - отключение (жим кнопки) отменяется. Тогда под мои задачи надо сделать несколько реле как на подсветку и ими глушить усилители. Я хочу поставить два мастеркитовских н 18W на центральный канал и 4х44 на фронт и тыл и со временем усилок саба. На мастеркитовских усилках вроде есть дежурный режим - вот его и вкл/выкл с помощью доп реле.

Дросселя с такой меткой где-то видел. Немогу вспомнить где...

Спасибо.

yurich38 23.07.2009 10:32

Все правильно..
дросселя на фотках видны.. попробуйте найти такие-же

в описание алгоритма дописал..
"Исключительные ситуации в программе:
Если комп отключился сам (не по нажатию кнопки) - отключить питание преобразователя
Если после нажатия кнопки спустя 70сек. комп не выключился/включился - отключить питание"

nightflyer 03.08.2009 15:07

А то что комп включен как он определяет? По поступлению +5 с USB на 7ю ногу Tiny15?
Для питания USB использовали 7805 отдельную или со схемы?

beriv 06.08.2009 13:10

Позволю себе ответить:-) да он смотрит появилось ли +5 на юсб входе асуса. Для питания хаба 7805 та что на схеме

yurich38 06.08.2009 17:03

Вложений: 1
Отладка схемы.

для тех то собрал программа проверки чтобы ничего не спалить.
!процессор устанавливать только после проверки

Вложение 12113

если не уверены в правильности установки диодов (8) то
выпаять транзистор
подключить питание +12В
!должен гореть светодиод (зеленый)
замкнуть точки (1) (2)
!должно замкнуться реле (4) и загореться светодиод (синий)
если этого не произошло диод перевернуть.

впаять транзистор
на колодке процессора (9) померить напряжение на всех ногах
!не должно быть болше 5В
!на ногах 1 8 должно быть около 5в

замкнуть ноги 3 8
!должен гореть светодиод (серый)

замкнуть ноги 5 8
!должен гореть светодиод (красный)
проверить сопротивление контактов кнопки(6)
!когда горит светодиод сопротивление должно быть близким к 0
!напряжение на контактах (6) не должно быль больше 5В


замкнуть ноги 6 8
!должно замкнуться реле (4) и загореться светодиод (синий)

Установить процессор.
!Если схема не подключена к USB то резистор 7 должен быть, или нога 7 процессора должна сидеть на
земле. (иначе может глючить)

Подключить +12В
!должен гореть светодиод (зеленый)
Подключить АСС к +12В
!должен гореть светодиод (желтый)
!должен гореть светодиод (синий)
!должен мигать светодиод (серый) (светодиод мигает ровно, вкл/выкл - равные промежутки времени.)
спустя ~10 сек
!должен загореться/погаснуть светодиод (красный)
спустя ~50 сек
!должен погаснуть светодиод (синий)
!светодиод (серый) начнет мигать "Авария" Длинно-Коротко или редко. (непомню уже :) )
комп не включился поэтому блок питания перешел в режим аварии. все работает.

yurich38 06.08.2009 17:09

Цитата:

Сообщение от nightflyer (Сообщение 106061)
А то что комп включен как он определяет? По поступлению +5 с USB на 7ю ногу Tiny15?
Для питания USB использовали 7805 отдельную или со схемы?

То что комп включен определяет именно так, по USB
для питания USB Хабов, если вы про них, у меня используется отдельная 7805

yurich38 06.08.2009 17:30

Индикация лампы "Режим"
Отключена - Комп выключен
Мигает 1 раз в сек - переходный режим, начат процесс включения/отключения
Включена - Комп включен
Мигает "Длинный(включена)-Короткий(выключена)" - режим сбоя, компьютер отключился самостоятельно либо не смог включиться/выключиться за установленное время.

nightflyer 07.08.2009 18:31

Вложений: 6
Вот я и собрал интеллектуальную часть блока питания. Процесс оказался не таким простым как я предполагал. Первое с чем столкнулся выбор и покупка компонентов (где их искать в Москве я знаю, а вот поиск всего этого добра в Мельбурне был не так уж прост). Огромное спасибо yurich38 за терпиливое объяснение мне что нужно покупать. После покупки начал разводить схему для того чтобы сделать под нее печатную плату. Разводил в Sprint Layout 5 (скачивается бесплатно). В данном процессе мне оказал огромную помощь (а точнее в итоге все сделал за меня) мой друг Андрей, за что ему огромное спасибо! Плату изготавливал с помощью ЛУТ (Лазерно Утюжная Технология).
Ну вот собственно как все начиналось:
Во вторник вечером вытравил печатку и попытался засверлить ее чем было,а было сверло 1мм (тупое до безобразия и наточить нечем) и некое подобие дремели. Естественно, плату я благополучно запорол и в последствии использовал как подкладку при сверлении других плат. Утро среды началось с шопинга =) поехал покупать сверло 0.8 и что-нибудь, чем сверлить. Благополучно купил все это в том же магазине где и компоненты покупал и поехал домой творить. Вытравил вторую плату, залудил, начал сборку. Собирал часа 3, как раз успел закончить собирать перед тем как ехать в институт (я в основном по вечерам учусь). Решив что самое тяжелое я сделал я решил прошить Attiny15 после универа, но не тут то было. USB программатор от Мастер-Кит который мне прислали из Москвы друзья не хотел работать ни с одной программой которую я смог найти. Немного опечалившись пошел спать.
Утро четверга началось с шоппинга =). Поехал покупать LPT коннектор и резисторы. Приехал, нарисовал разводку под маленькую плату-программатор (решил что времени на это много не потрачу, но зато будет выглядеть цивильно), вытравил, собрал, подключил - работает :happy:! Ну, думаю, надо тестировать то что собрал. Взял баттарейку 12 вольтовую подключил к схеме показывает только включение питания и ничего больше. Подсветка LCD и питание преобразователя - молчат, начал разбираться в чем дело, отключил питание посмотрел все ли правильно собрал и подключил питание обратно, но тут с криками е%:!%:*! обнаружил что перепутал полярность (еще думал припаять коннектор на провода к баттарее чтобы этого не сделать, но какого то хрена не сделал). Ну что же, отключил питание, начал смотреть повреждения, сгорела одна дорожка, ну думаю не беда, аодпаял перемычку, включил - сгорела другая дорожка =(, вот тут начал думать головой и звонить элементы, вычислил сгоревший диод, поменял - включил, опять ничего кроме питания не показывает. Начал проверять реле, обнаружил, что то что мне нарисовал продавец, у которого я эти реле купил, и то что есть на самом деле не сходится. Перерзал неправильные дорожки, припаял перемычки куда надо - включил, реле на подсветку LCD сработало, помимо диода питания начал мигать диод режим, но более ничего не происходило. К моему счастью yurich38 как раз в этот момент ответил на мое письмо с вопросами про отладку и дал номер аськи. Списавшивь начали искать что где не правильно. Я что то протупил конкретно и не сказал сразу что переполюсовал схему при тестировании :blush:. Путем тестирования вышли на то что погорел транзистор, после чего yurich38 убежал а я выпаяв транзистор начал думать, что делать дальше. Но тут появился в сети Андрюха, который мне с разводкой помогал. Я ему поведал о своих проблемах, после чего он подсказал в чем можно найти подобный транзистор и что скорее всего у меня сгорела 7805. Путем ломания автомобильной зарядки для iPhone (которая все равно плохо работала) была найдена 7805 а путем разбирания старого блока питания нашелся транзистор. После замены неисправных деталей начали тестирование. В процессе которого все заработало, но попутно выяснилось несколько неприятных моментов. 1) Сильно грелось реле которое отвечает за включение подсветки (скорее всего оказалось не рассчитано на 12в, хотя продавец говорил что работает от 5 до 14в, хотя после того как он мне дал неправильную распиновку доверия к нему пропало); 2) Сильно грелся транзистор, который все таки не совсем подходил. В виду этого Андрей посоветовал менять реле (что ввергло меня в состояние жуткой тоски, потому как реле мне обошлось очень недешево). А так как менять оба реле было достаточно накладно решили одно реле оставить (то которое на включение питания преобразователя) но запитать его от 5в с 7805, заодно и решалась проблема с перегревом транзистора. Путем перезания дорожек и припаивания перемычек создали схему питания реле от 5в и попробовали ее в работе, все работало хорошо и не грелось. Потом мне удалось выцыганить у хозяев дома в котором я живу 2 автомобильных реле (реле фирмы ford, надеюсь моя toyota ревновать не начнет :secret: ). Началась переделка разводки с учетом новых обстоятельств. После этого все началось по новой, даже еще труднее, потому как надо было со старой платы элементы выпаять и в новую впаять. Когда закончил сборку на часах было 4 утра. Начал тестировать - ничего не работает. Расстроился и пошел спать.
Утро пятницы началось с шопинга. Поехал покупать колодки под tiny15 и hcf4066 да и резисторы не мешало бы поменять так как выпаивать их еще раз не сильно улыбалось. Поехал в другой магазин и обнарудил что цены там во много раз ниже тех по которым я закупался 1й раз, причем ниже в разы. Купил все необходимое, даже больше. Приехал домой, пока я ездил Андрей нашел ошибку в разводке. Ну и опять все по новой. Собирать закончил часов в 5 вечера. Подключил - уррра!!!! Заработало. Попробовал подключиться к кнопке eeepc - все завелось! Радости не было предела!
Но после состояния радости пришло понимания того, что нужно еще комнату из состояния "полнейший бардак" перевести в состояние "порядок" чем я собственно и занялся. По завершении этого процесса нашлась клавиатура и соответственно появилась возможность написать этот пост. Надеюсь не очень нудно получилось. Если есть какие-нибудь вопросы - пишите с радостью отвечу. Ну и конечно фотографии:
1) Первая версия
2) Программатор
3) Рабочая версия
4) Эволюция
5) Тестирование
6) Творческий беспорядок =)

Ну и напоследок хотелось бы выразить огромную благодарность yurich38 за его коллосальное терпение и отзывчивость и моему другу Андрею за его помощь в разводке платы и поддержке в процессе отладки и тестирования!

yurich38 08.08.2009 21:16

Рад что все получилось! :) отлично написал..
интересно, Tiny15 нет в списке процессоров совместимых с USB программатором Мастеркита! хотя я им прошивал. через раз правда, но получалось... :)

nightflyer 08.08.2009 22:53

А в какой программе это делалось и с какими настройками? Я сколько не пробовал с разными программами ничего не получалось... Просто тупо не видели программатор и все. На самом деле почитал, у многих подобная проблема. На самом деле USB удобнее в том плане, что на моем компе LPT нету, как думаю и на многих других современных компах. Кстати, немного не в тему, но всеже. Я так предполагаю, что программатор USB от Мастер-Кит предназначен для того, чтобы уже к готовой схеме подключаться? А вот как правильно называтеся разъем под который он рассчитан?

yurich38 10.08.2009 10:40

я прошивал через AvrProg.exe она иногда говорит что проц не найден, иногда что ошибка записи. но программатор всегда "видит".. я думал что у меня программатор бракованный какойто.. а оказывается они все такие.
что этот программатор для внутрисхемного программирования это точно, но вот чтобы разъем както назывался особенно не помню..

interhard 16.08.2009 17:59

Подключение eee pc 1000H через батарейный разьём
 
Вложений: 1
Выкладываю схемку, вдруг понадобиться.. Сопротивление R2 - убранный терморезистор, без него комп не запускается.

odessit 16.08.2009 18:08

А зачем выкладывать неправильную схему ???
1 НЕ указано где 1 нога а где 7 !!! с какой стороны считать ...
да и ног вроде как 9 ... а не 7 ...
вот правильная схема!!! http://forum.pccar.ru/attachment.php...2&d=1241351374
да и не на 6 ногу сопротивление вешаеться ...

interhard 16.08.2009 20:39

схема правильная. eee pc 1000H выведено семь ног в батарейном разьёме,две крайних - 8,9 пустые гнёзда и на плату не распаяны.Если посмотреть внимательно на мать, на каждом разьёме есть треугольник, означающий первый контакт(вывод).

1 + Power
2 Data
3 Gnd
4 Data
5 Data
6 term. resistor
7 Gnd

odessit 16.08.2009 21:43

А сори это под 1000!!! неуглядел ТУПЛЮ :)
Сверху под 701 схема от Юрьича 38

Honda_ЛЁТ 17.08.2009 23:44

Цитата:

Сообщение от yurich38 (Сообщение 104510)
к тому-же можно купить уже практически готовую схему
http://www.masterkit.ru/info/magshow.php?num=405
дальше, всеголишь подбором резисторов R1,R2 выставить нужное напряжение на выходе.

Вложение 11830

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

По ссылке страница не найдена.
Можно ли с этой схемой бук совсем не выключать? Т.к. мне необходима видеорегистрация при стоянке авто. Не будет ли сбой при заводке двигателя?

odessit 18.08.2009 00:03

Ну СОВСЕМ невыключать врядле получиться ...
Ноут жрет даже в спящем ... а невырубленным жрет 2 ампера минимум ...
Вот и посчитай ... сколько твой акум протянет ... часов 5 потолок и то ОЧень для него это будет не хорошо ...

а вот Сбой при заводке двигателя это непроблемма при подключении
через разьем батареи и использовании Конденсаторов !!!

Honda_ЛЁТ 18.08.2009 15:41

Цитата:

Сообщение от odessit (Сообщение 107668)
... а невырубленным жрет 2 ампера минимум ...

так при аккумуляторе 55 а/ч должен держать ~ 24 часа. Надо померить...

odessit 18.08.2009 18:54

А чё мерить ???
Кпд не 100% жеш + при разгоне и полной яркости жрет уже под 3 ампера
+ устройства внешние ЮСБ теже камеры итд ... еще минимум 1 ампер
Вот и считай ... часов 10 -15 потолок!!!
А как сделать еще так чтобы акумулятор ненадо было после этого Выкидывать!!!
+ так чтобы Тебе хватало на ЗАВестись!!!

nightflyer 22.08.2009 12:56

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

nightflyer 03.09.2009 14:48

Если кому-то понадобится рассчитать делитель я нашел полезную ссылку http://www.cdxp.zx6.ru/del.php

Coloss 10.09.2009 11:17

Доброго времени суток.
Не мог бы кто нибудь выложить рисунок печатных плат для схем из 1 и 2-го поста...
Заранее благодарен...

odessit 10.09.2009 13:35

а где ты там в 1 и 2 посте увидел печатные платы ???
Оно собиралось насколько вижу на простой универсальной плате

Coloss 10.09.2009 17:33

Цитата:

Сообщение от odessit (Сообщение 110336)
а где ты там в 1 и 2 посте увидел печатные платы ???
Оно собиралось насколько вижу на простой универсальной плате

Ну просто подумал,что они существуют :blush:Ладно...будем сами творить :unsure2:

Honda_ЛЁТ 11.09.2009 15:47

Цитата:

Сообщение от odessit (Сообщение 107668)
Сбой при заводке двигателя это непроблемма при подключении
через разьем батареи и использовании Конденсаторов !!!

Купил родной БП от прикуривателя, запитал напрямую от аккумулятора, но при заводке авто комп тухнет. Подскажи пожалуйста к каким контактам подсоединения аккумулятора подпаивать "+ -"? Кондёр как я понял припаять на выход источника питания, 4700 мкФ х 25В пойдёт или побольше?

odessit 12.09.2009 16:33

кондер надо ставить совместно с диодом. чтобы при просадке кондер не питал сеть автомобиля!!! соответственно в проход чтобы питание шло от акума к кондеру а обратно нет ... померить прибором ...

odessit 12.09.2009 16:34

4700 врядле хватит у меня стоят 3 по 9000мф ... немного с запасом на зииму ...

по поводу к каким контактам непонял ... вопроса ....

ну минус к минусу = к плюсу желательно протянуть прямые провода от акума ...

Honda_ЛЁТ 13.09.2009 11:43

Цитата:

Сообщение от odessit (Сообщение 110587)
4700 врядле хватит у меня стоят 3 по 9000мф ... немного с запасом на зииму ...

Во спасибо. Всё понял :yes4:.

Цитата:

Сообщение от odessit (Сообщение 110587)
по поводу к каким контактам непонял ... вопроса ....

ну минус к минусу = к плюсу желательно протянуть прямые провода от акума ...

Я имел ввиду контакты подключения родного аккумулятора (EEPC 701), там их штук 8-мь помоему, ты же советовал от них запитаться или пойдет от от сетевого (зарядочного) разъёма?

Прямой "+" от аккумулятора ч/з предохранитель я провёл.

odessit 13.09.2009 14:02

а топ не пробовал читать ????

На предидущей странице есть фото КАк подрубать к бат разьему ...

-qwerty- 22.09.2009 03:29

Толи я что-то не понял, толи оно не работает.
В общем при попытке перейти на AtTiny25 впрямую ничего не получилось, пришлось курить маны.
В итоге было найдено кучка ошибок в коде программы, особенно если всё делать по манам.
Пришлось програмить своё заново, и оно того стоило!
В данный момент программа может работать как на Tiny15, так и на 25/45/85 (последние особо дёшевы в Чип и Дип, 220 рублей за tiny25 и всего 110 за tiny85).

Програмил на AVR-GCC в AVR Studio, код громозок и есть куда оптимизировать, но лень, очень лень.
Выкладываю свою разработку в исходнике, кому надо - оптимизируйте.
AVR Studio нахаляву забрать можно на сайте атмела, WinAVR найти в гугле.
Если кто на выходе в 2 раза сократит прогу, то пойдёт и на tiny15, хотя, ИМХО, проще купитьт 45 или 85 тиню в Чип и Дип.

Шил все тини с помощью UniProf (версию не помню, но последняя с ручным апдейтом exe файла).

Код:

#include
#include

#define ON_PROCESS 1
#define ON 2
#define OFF_PROCESS 3
#define OFF 4
#define SYSTEM_FAIL 10

// ïðåäíàñòðîéêè.. ïðèìåðíî â ñåêóíäàõ :)
#define initTimer                                                4        // ÷àñòîòà ïðîâåðêè òàéìåðîì
#define initButtonDelay                                        2        // çàäåðæêà êíîïêè 2ñåê
#define initBeforeStartDelay                        5        // âðåìÿ äî âêëþ÷åíèÿ 10ñåê.
#define initAfterStartDelay                                90        // çàäåðæêà ïîñëå âêëþ÷åíèÿ 90ñåê âðåìÿ íóæíîå íà ñòàðò âèíäå.

#define initBeforeOFFDelay                                150        // âðåìÿ äî îòêëþ÷åíèÿ 150ñåê
#define initBeforeOFFDelay_Multipler        2        // ìíîæèòåëü 2 .=> 150ñåê*2 = 300ñåê = 5ìèí
#define        initPowerDownDelay                                120        // âðåìÿ îæèäàíèÿ âûêëþ÷åíèÿ êîìïà âî âðåìÿ âûêëþ÷åíèÿ

int PC_State;
int BeforeStartDelay;
int ButtonDelay;
int AfterStartDelay;
int BeforeOFFDelay;
int BeforeOFFDelay_Multipler;
int PowerDownDelay;

int Timer_step;

int main ( void )
{
        DDRB = (1<         TCCR0B = (1<         TIMSK = (1<         sei();

        PORTB = 0x00; // óñòàíàâëèâàåì âñå ñîñòîÿíèÿ â 0 äëÿ íà÷àëà ìîîíèòîðèíãà

        Timer_step = initTimer;
        PC_State = OFF;
        BeforeStartDelay = 0;
        ButtonDelay = 0;
        AfterStartDelay = 0;
        BeforeOFFDelay = 0;
        BeforeOFFDelay_Multipler = 0;
        PowerDownDelay = 0;

        for(;;)
        {
        }
        return 0;
}

// PB0 - OUT BUTTON
// PB1 - OUT POWER
// PB2 - IN USB
// PB3 - IN ACC
// PB4 - OUT LED

void p_OFF()
{
        if ( PINB & (1<         {
                PC_State = ON_PROCESS; // ïåðåõîäèì â ðåæèì âêëþ÷åíèÿ
                BeforeStartDelay = initBeforeStartDelay; // îæèäàíèå äî íàæàòèÿ êíîïêè
                ButtonDelay = initButtonDelay; // êàê äîëãî æàòü êíîïêó
                if ( !(PORTB & (1<                 {
                        PORTB |= (1<                 }
        }
}

void p_ON_PROCESS()
{
        if ( BeforeStartDelay > 0 ) // òàéìàóò äî íàæàòèÿ êíîïêè
        {
                if ( !( PINB & (1<                 {
                        if ( PORTB & (1<                         {
                                PORTB &= ~(1<                         }
                        PC_State = OFF; // ïåðåõîä â ðåæèì ñëåæåíèÿ çà âêëþ÷åíèåì
                        return;
                }
                BeforeStartDelay --; // ìèíóñóåì òàéìàóò
        }else{ // ïîåõàëè âêëþ÷àòü êîìï
                if ( ButtonDelay > 0 ) // äåðæèì êíîïêó íàæàòîé
                {
                        if ( !( PORTB & (1<                         {
                                PORTB |= (1<                         }
                        ButtonDelay --;
                }else{
                        if ( PORTB & (1<                         {
                                PORTB &= ~(1<                                 AfterStartDelay = initAfterStartDelay; // çàäà¸ì òàéìåð äî ïîÿâëåíèÿ USB
                        }else{
                                if ( AfterStartDelay > 0 )  // æä¸ì äî ïîÿâëåíèÿ óñá ïî òàéìåðó
                                {
                                        AfterStartDelay--;
                                }else{ // ïðîâåðÿåì ñòàòóñ USB
                                        if ( PINB & (1<                                         {
                                                PC_State = ON;
                                                return;
                                        }else{
                                                PC_State = SYSTEM_FAIL; // à íåòó óñá, ãîâíî ñëó÷àåòñÿ...
                                                return;
                                        }
                                }
                        }
                }
        }
}

void p_ON()
{
        // ïðîïàäàíèå USB
        if ( !( PINB & (1<         {
                PC_State = SYSTEM_FAIL;
                return;
        }
        if ( !( PINB & (1<         {
                PC_State = OFF_PROCESS;
                BeforeOFFDelay = initBeforeOFFDelay; // èíèöèàëèçàöèÿ òàéìåðà äî âûêëþ÷åíèÿ
                BeforeOFFDelay_Multipler = initBeforeOFFDelay_Multipler; // èíèöèàëèçàöèÿ òàéìåðà  ìíîæèòåëÿ
                ButtonDelay = initButtonDelay; // êàê äîëãî æàòü êíîïêó
                PowerDownDelay = initPowerDownDelay; // êàê äîëãî æäàòü ïîòóõàíèÿ êîìïà
        }
}

void p_OFF_PROCESS()
{
        if ( !( PINB & (1<         {
                PC_State = SYSTEM_FAIL; // íàõóé ïàäàåì è âñ¸ ãàñèì
                return;
        }
        if ( BeforeOFFDelay_Multipler == 0 ) // òèïà òàéìåð ñ ìíîæèòåëåì íà íóëå.
        {
                if ( ButtonDelay > 0 ) // ïîêà äåðæèì êíîïêó, è äàæå åñëè íå äåðæèì.
                {
                        if ( !( PORTB & (1<                         {
                                PORTB |= (1<                         }
                        ButtonDelay --; // ìèíóñóåì òàéìåð íàæàòîé êíîïêè.
                }else{
                        if ( PORTB & (1<                         {
                                PORTB &= ~(1<                         }
                        if ( PowerDownDelay > 0 ) // òèïà æä¸ì ïðîñòîãî âûêëþ÷åíèÿ
                        {
                                PowerDownDelay--; // íó è ìèíóñóåì òàéìåð îæèäàíèÿ âûêëþ÷åíèÿ
                        }else{
                                PC_State = SYSTEM_FAIL; // ïðîâàëèâàåìñÿ â system_fail â ëþáîì ñëó÷àå
                        }
                }
        }else{
                if ( BeforeOFFDelay == 0 )
                {
                        BeforeOFFDelay = initBeforeOFFDelay; // âîññòàíàâëèâàåì òàéìåð îòêëþ÷åíèå
                        BeforeOFFDelay_Multipler--; // ìèíóñóåì ìíîæèòåëü òàéìåðà âûêëþ÷åíèÿ
                }else{
                        if ( PINB & (1<                         {
                                PC_State = ON;
                                return;
                        }
                }
                BeforeOFFDelay --;
        }
}

void p_SYSTEM_FAIL()
{
        if ( PORTB & (1<         {
                PORTB &= ~(1<         }
        if ( PINB & (1<         {
                if ( PORTB & (1<                 {
                        PORTB &= ~(1<                 }else{
                        PORTB |= (1<                 }
        }else{
                PC_State = OFF; // ñáðàñûâàåì ñîñòîÿíèå. àññ íåò âñ¸ ðàâíî.
                if ( PORTB & (1<                 {
                        PORTB &= ~(1<                 }
        }
}

ISR(TIMER0_OVF_vect)
{
        Timer_step--;
        if ( Timer_step == 0 )
        {
                if ( PC_State == OFF )
                {
                        p_OFF();
                }

                if ( PC_State == ON_PROCESS )
                {
                        p_ON_PROCESS();
                }

                if ( PC_State == ON )
                {
                        p_ON();
                }

                if ( PC_State == OFF_PROCESS )
                {
                        p_OFF_PROCESS();
                }

                if ( PC_State == SYSTEM_FAIL )
                {
                        p_SYSTEM_FAIL();
                }

                Timer_step = initTimer;
        }
}

PS Знать бы АСМ получше, на нём бы написал ;)

yurich38 24.09.2009 06:04

За такое, огромный респект!! )
з.ы. комментарии в коде зачетные :D


Часовой пояс GMT +4, время: 19:54.

Работает на vBulletin® версия 3.8.4.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot