Показать сообщение отдельно
Старый 04.08.2010, 15:27   #4
BaGz
Старший Пользователь
 
Регистрация: 03.11.2006
Город: Казань
Регион: 16, 116
Машина: Toyota Corolla NZE121 2003
Сообщений: 259
BaGz is on a distinguished road
По умолчанию

Вот исходник, уважаемые программеры помогите перекомпилировать код под микросхему ATTiny25
//----------------------------------------------------------------------------------------------
// Программа управления блоком питания для EeeCarPc. версия 2
// Тестировано на Tiny15
//
// © Bunin.Dev, 2009
//
// Лицензия GPL
// Данная программа является свободным программным обеспечением.
// Вы вправе распространять ее и/или модифицировать в соответствии с условиями версии 2
// либо по вашему выбору с условиями более поздней версии Стандартной Общественной Лицензии GNU,
// опубликованной Free Software Foundation.
// http://www.gnu.org/copyleft/gpl.html
//
//----------------------------------------------------------------------------------------------


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

.include "TN15DEF.INC" ; include chip definition
;------------------------------
.def mig =r26 // всякая всячина
.def tmp =r28
.def temp1=r30
.def temp2=r31

.equ CalibrateValue = 0x3F

// Состояние системы
.equ ON_POCESS=1 // процесс вкл
.equ ON=2 // вкл
.equ OFF_POCESS=3
.equ OFF=4 // соответственно выкл
.equ SYSTEM_FAILURE=10 // и сбой.


// преднастройки.. примерно в секундах
.equ PowerDownDelay = 35; // время удержания питания 30сек
.equ initBeforeOFFDelay = 150; // время до отключения 150сек
.equ initBeforeOFFDelay_Multipler = 6; // множитель 6 .=> 150сек*6 = 900сек = 15мин

.equ initBeforeStartDelay = 10; // время до включения 10сек.
.equ initButtonDelay = 2; // задержка кнопки 2сек
.equ initAfterStartDelay = 50; // задержка после включения 50сек время нужное на старт винде.
.equ initPC_OFFCritical_Time = 20; // сколько ждать отключения..
.equ initPC_ONCritical_Time = 20;


// переменные
.def PowerLife=r16; // сщетчик отключения питания
.def PC_State=r17; // состояние системы

.def PC_OFF_ON_Time=r18; // сщетчик времени

.def BeforeStartDelay_Multipler=r19; // Множитель задержки перед стартом
.def BeforeStartDelay=r20; // задержка перед стартом

.def ButtonDelay=r21; // задержка нажатия кнопки
.def AfterStartDelay=r22; // задержка после нажатия кнопки
.def Waiting=r23; // бит ожидания

.def Timer_step=r24; // делитель прерывания таймера.
.def PC_Life_Time=r25; // сщетчик времени изменения PC_Life_State

.def PC_on_signal=r27; // сигнал РС жив



.MACRO WAIT ; Макрос ожидания "нуля" в переменной, для задержек
;subi @1,low(@0)
;sbci @2,high(@0)

tst @0
breq L88363
dec @0
rjmp return
L88363:
.ENDMACRO ; End macro definition


;------------------------------
rjmp RESET ; Reset Handle
rjmp INT0VECT ; External Interrupt0
rjmp NOVECT ; Pin change Interrupt
rjmp NOVECT ; Timer/Counter1 Compare Match A ATTiny15
rjmp NOVECT ; Overflow1 Interrupt ATTiny15
rjmp OVF0VECT ; Overflow0 Interrupt
rjmp NOVECT ; EEPROM ready Interrupt ATTiny12 ATTiny15 (Analog Comparator Interrupt Vector Address ATTiny11)
rjmp NOVECT ; Analog Comparator Interrupt ATTiny12 ATTiny15
rjmp NOVECT ; ADC conversion complete ATTiny15
;------------------------------
RESET:

ldi temp1, CalibrateValue
out EEAR, temp1
sbi EECR, 0
in temp1, EEDR
out OSCCAL, temp1


; init timer
ldi temp1, (1<<CS02)|(1<<CS00) ; enable timer, CLK/1024
out TCCR0, temp1
ldi temp1, (1<<TOIE0) ; enable Timer0 Overflow int
out TIMSK, temp1
; init int0
; ldi temp1, (1<<INT0) ; enable int0
; out GIMSK, temp1
; ldi temp1, (1<<ISC00) ; int0 at change
; out MCUCR, temp1
; init ports
ldi temp1, (1<<PINB0)|(1<<PINB1)|(1<<PINB3) ; 0 - output pin
out DDRB, temp1
; clear values

ldi PowerLife, 0
ldi PC_State, OFF
ldi PC_OFF_ON_Time, 0
ldi BeforeStartDelay_Multipler, initBeforeOFFDelay_Multipler
ldi BeforeStartDelay, initBeforeStartDelay
ldi ButtonDelay, initButtonDelay
ldi AfterStartDelay, initAfterStartDelay
ldi Waiting, 0
ldi PC_Life_Time, 0
ldi PC_on_signal, 1
ldi Timer_step, 0

cbi PORTB, PINB0
cbi PORTB, PINB1
; enable interrupts
sei
;------------------------------
MAIN:
rjmp MAIN
;------------------------------
OVF0VECT:
in temp1, SREG ; Store the Status register in reg temp1

//обрабатываем только каждое 6-е перерывание, т.е. раз в 1 сек.
WAIT Timer_step
ldi Timer_step, 6


in tmp, PINB // читаем состояние порта

sbrc tmp, 2 // если bit 2 = 0 т.е. от компа сигнала НЕТ
rjmp L9538
;{
ldi PC_on_signal, 0;
;}
rjmp L9539
L9538:
;{
ldi PC_on_signal, 1;
;}
L9539:

sbrc tmp, 4 // если bit 4 = 0 т.е. питания нет !ACC
rjmp L9645
;{
cpi PC_State, SYSTEM_FAILURE // если сбой
brne L7794
;{
ldi PC_State, OFF; // сбросить сбой
;}
L7794:

cpi PC_State, ON // если комп включен
brne L4759
;{ // выключаем
ldi PC_OFF_ON_Time, 0; // сброс параметров отключения
ldi BeforeStartDelay, initBeforeOFFDelay;
ldi BeforeStartDelay_Multipler, initBeforeOFFDelay_Multipler;
ldi ButtonDelay, initButtonDelay;
ldi AfterStartDelay, initAfterStartDelay;
ldi Waiting, 0;
ldi PC_State, OFF_POCESS; // переход в режим отключения
rjmp return;
;}
L4759:
; }
L9645:

cpi PowerLife, 0 // если время прошло, отрубает питание
brne L4760
;{
cbi PORTB, PINB1
;}
rjmp L4760e
L4760:;else
;{ // если нет
sbi PORTB, PINB1 // питание включено
cpi PC_State, OFF
brne L4760e
;{
dec PowerLife; // считаем время, если комп отключен.
;}
;}
L4760e:

// состояние сбоя -----------------------------------------------------------------------------

cpi PC_State, SYSTEM_FAILURE
brne L4163
;{
ldi PowerLife, 0; // отключение питания

// мигалка в режиме аварии
cpi mig, 3
breq L1874 // если mig != 0
;{
inc mig
sbi PORTB, PINB3 // погастиь светодиод
rjmp l1873
;}
L1874:
;else
;{
ldi mig, 0
cbi PORTB, PINB3 // зажечь светодиод
;}
L1873:

rjmp return;
;}
L4163:

;in temp1, PINB // читаем состояние порта

;sbrs mig, 2 // если bit 3 = 1 т.е. питания нет
// индикация режима вкл/выкл
cpi PC_State, ON
brne L4322
;{
cbi PORTB, PINB3
rjmp L1333 // зажечь светодиод
;}
L4322:
cpi PC_State, OFF
brne L4312
;{
sbi PORTB, PINB3 // погастиь светодиод
rjmp L1333
;}
L4312:
// мигалка
tst mig
breq L1234 // если tmp != 0
;{
ldi mig, 0
sbi PORTB, PINB3 // погастиь светодиод
rjmp l1333
;}
L1234:
;else
;{
ldi mig, 1
cbi PORTB, PINB3 // зажечь светодиод
;}
L1333:

//-----------------------------------------------------------------------------
in tmp, PINB // читаем состояние порта

sbrs tmp, 4 // если bit 4 = 1 т.е. питание есть ACC
rjmp L3545
;{
ldi PowerLife, PowerDownDelay; // не отключать питание
cpi PC_State, OFF // если комп отключен
brne L3545
;{
ldi PC_OFF_ON_Time, 0; // сброс параметров включеня
ldi BeforeStartDelay, initBeforeStartDelay;
ldi ButtonDelay, initButtonDelay;
ldi AfterStartDelay, initAfterStartDelay;
ldi Waiting, 0;
ldi PC_State, ON_POCESS; // переход в режим включения
rjmp return;
;}
L3545:
;}

//-----------------------------------------------------------------------------
cpi PC_State, ON_POCESS // режим включения
brne L4682
;{

cpi Waiting, 0 // если кнопка еще не нажималлась
brne L4892
;{
sbrc tmp, 4 // если bit 4 = 0 т.е. питания нет !ACC то (при отключении питания)
rjmp L4892
;{
ldi PC_State, OFF; // отменяем запуск
rjmp return;
;}
;}
L4892:

WAIT BeforeStartDelay // задержка перед

cpi Waiting, 0
brne L7921
;{
sbi PORTB, PINB0 // нажатие кнопки
ldi Waiting, 1; // запрет отмены запуска и повторного нажатия кнопки
;}
L7921:
WAIT ButtonDelay

cbi PORTB, PINB0 // восстановление

WAIT AfterStartDelay // задержка после

inc PC_OFF_ON_Time; // считаем время

cpi PC_on_signal, 1
brne L1830
;{
ldi PC_State, ON; // комп включен. процесс запуска завершен
;}
rjmp L1830e
L1830://else // комп не включился
;{
cpi PC_OFF_ON_Time, initPC_ONCritical_Time // слишком долго
brne L1830e
;{
; if(PC_OFF_ON_Time > initPC_ONCritical_Time)
ldi PC_State, SYSTEM_FAILURE; // сбой!
;}
L1830e:
rjmp return;
;}
L4682:


//-----------------------------------------------------------------------------
cpi PC_State, OFF_POCESS // режим выключения
brne L0682
;{



cpi Waiting, 0 // если кнопка еще не нажималлась
brne L0892
;{
cpi PC_on_signal, 0 // если нет сигнала
brne L19839
;{
ldi PC_State, OFF // отключение!
ldi PowerLife, 0; // отключение питания
;}

L19839:
sbrs tmp, 4 // если bit 4 = 1 т.е. питания есть ACC то (при восстановлении питания)
rjmp L0892
;{
ldi PC_State, ON; // отменяем запуск
rjmp return;
;}
;}
L0892:

WAIT BeforeStartDelay // задержка перед

tst BeforeStartDelay_Multipler // множитель задержки
breq L0963
;{
dec BeforeStartDelay_Multipler
ldi BeforeStartDelay, initBeforeOFFDelay; // повторяем задержку
rjmp return
;}
L0963:

cpi Waiting, 0
brne L0921
;{
sbi PORTB, PINB0 // нажатие кнопки
ldi Waiting, 1; // запрет отмены запуска и повторного нажатия кнопки
;}
L0921:
WAIT ButtonDelay

cbi PORTB, PINB0 // восстановление

WAIT AfterStartDelay // задержка после

inc PC_OFF_ON_Time; // считаем время

cpi PC_on_signal, 0 // выключился либо
breq L9897
cpi PC_OFF_ON_Time, initPC_OFFCritical_Time // слишком долго
brne return
;{
L9897:
; if(PC_OFF_ON_Time > initPC_ONCritical_Time)
ldi PC_State, OFF; // сбой!
;}

rjmp return;
;}
L0682:

//-----------------------------------------------------------------------------
cpi PC_State, ON // состояние включен
brne L4931
;{
ldi PowerLife, PowerDownDelay; // поддерживаем питание
cpi PC_on_signal, 0 // если нет сигнала
brne L9830
;{
ldi PC_State, SYSTEM_FAILURE // Сбой!
ldi PowerLife, 0; // отключение питания
;}
L9830:
;}
L4931:

return:

;//rjmp MAIN

EX_OVF0VECT:
out SREG, temp1 ; Restore Status register
reti

;------------------------------
INT0VECT:
in temp2, SREG ; Store the Status register in reg temp2

EX_INT0VECT:
out SREG, temp2 ; Restore Status register
reti
;------------------------------
NOVECT:
reti
BaGz вне форума   Ответить с цитированием