********************************************************************
Program
Sequetial_Timer;
Type
PByte = ^
Byte
;
Type
TValvula =
Record
Koha_Ndeze :
Word
;
Koha_Fike :
Word
;
End
;
Type
TSeq_Timer =
Record
Valvula : TValvula;
Butoni :
Byte
;
Koha_Butonit :
Byte
;
Koha_Ndeze :
Word
;
Koha_Fike :
Word
;
Dalja :
Byte
;
End
;
Const
NDEZE =
1
;
FIKE =
0
;
BUTONI_OK =
0
;
BUTONI_PLUS = BUTONI_OK +
1
;
BUTONI_MINUS = BUTONI_PLUS +
1
;
KOHA_PUNE_MAX =
10
;
KOHA_PUNE_MIN =
1
;
KOHA_PUSHIM_MAX =
2000
;
KOHA_PUSHIM_MIN =
10
;
BAITET_EE = SizeOf(TValvula);
ADRESA_EE :
Byte
=
$00
;
Var
butoni_pin_p : sbit at PINB
.0
;
butoni_pin_o : sbit at PINB
.1
;
butoni_pin_m : sbit at PINB
.2
;
led_pune : sbit at PORTB
.3
;
led_pushim : sbit at PORTB
.4
;
led_buton : sbit at PORTD
.6
;
Seq_Timer : TSeq_Timer;
Procedure
Shkruaj_EEprom(Ptr_Data : PByte); Forward;
Procedure
Lexo_EEprom(Ptr_Data : PByte); Forward;
Procedure
Gjendja_Valvulat(Gjendja :
Byte
); Forward;
Procedure
Rinis_Valvulat(); Forward;
Procedure
Shkruaj_EEprom(Ptr_Data : PByte);
Var
i :
Byte
;
Begin
For
i :=
0
To
(BAITET_EE -
1
)
Do
Begin
While
((EECR)
And
(
1
Shl
EEPE))
Do
begin
end
;
EECR := (
0
Shl
EEPM1)
Or
(
0
Shl
EEPM0);
EEAR := ADRESA_EE + i;
EEDR := Ptr_Data^;
EECR := (EECR
Or
(
1
Shl
EEMPE));
EECR := (EECR
Or
(
1
Shl
EEPE));
Inc(Ptr_Data);
End
;
End
;
Procedure
Lexo_EEprom(Ptr_Data : PByte);
Var
i :
Byte
;
Begin
For
i :=
0
To
(BAITET_EE -
1
)
Do
Begin
While
((EECR)
And
(
1
Shl
EEPE))
Do
begin
end
;
EEAR := ADRESA_EE + i;
EECR := (EECR
Or
(
1
Shl
EERE));
Ptr_Data^ := EEDR;
Inc(Ptr_Data);
End
;
End
;
Procedure
Gjendja_Valvulat(Gjendja :
Byte
);
Begin
If
(Gjendja = NDEZE)
Then
Seq_Timer
.
Dalja :=
2
;
If
(Seq_Timer
.
Dalja >
5
)
Then
Inc(Seq_Timer
.
Dalja);
PORTD
.
Seq_Timer
.
Dalja := Gjendja;
End
;
Procedure
Rinis_Valvulat();
Begin
for
Seq_Timer
.
Dalja :=
2
To
5
Do
PORTD
.
Seq_Timer
.
Dalja :=
0
;
Seq_Timer
.
Koha_Ndeze :=
0
;
Seq_Timer
.
Koha_Fike :=
0
;
Seq_Timer
.
Dalja :=
1
;
End
;
Procedure
T0_OVF_Int(); iv IVT_ADDR_TIMER0_OVF;
Begin
If
(Seq_Timer
.
Koha_Butonit >=
10
)
Then
Begin
If
(butoni_pin_o =
0
)
Then
Seq_Timer
.
Butoni := BUTONI_OK;
If
(butoni_pin_p =
0
)
Then
Seq_Timer
.
Butoni := BUTONI_PLUS;
If
(butoni_pin_m =
0
)
Then
Seq_Timer
.
Butoni := BUTONI_MINUS;
If
(Seq_Timer
.
Butoni <>
0
)
Then
Begin
TIMSK := %
00000010
;
Seq_Timer
.
Koha_Butonit :=
0
;
Rinis_Valvulat();
TIMSK := %
01000010
;
End
;
End
;
Inc(Seq_Timer
.
Koha_Butonit);
TCNT0 :=
0
;
End
;
Procedure
T1_CMPA_ISR(); iv IVT_ADDR_TIMER1_COMPA;
Begin
If
(Seq_Timer
.
Koha_Ndeze >= Seq_Timer
.
Valvula
.
Koha_Ndeze)
Then
Begin
Gjendja_Valvulat(FIKE);
Seq_Timer
.
Koha_Fike :=
0
;
End
;
Inc(Seq_Timer
.
Koha_Ndeze);
If
(Seq_Timer
.
Koha_Fike >= Seq_Timer
.
Valvula
.
Koha_Fike)
Then
Begin
Gjendja_Valvulat(NDEZE);
Seq_Timer
.
Koha_Ndeze :=
0
;
End
;
Inc(Seq_Timer
.
Koha_Fike);
End
;
Begin
DDRA := %
00000000
;
PORTA := %
11111111
;
DDRB := %
00011000
;
PORTB := %
11110111
;
DDRD := %
01111100
;
PORTD := %
10000011
;
TCCR0B := %
00000101
;
OCR1AH :=
$30
;
OCR1AL :=
$D4
;
TCCR1B := %
00001011
;
TIMSK := %
01000010
;
Lexo_EEProm(@Seq_Timer
.
Valvula);
If
(Seq_Timer
.
Valvula
.
Koha_Ndeze > KOHA_PUNE_MAX)
Or
(Seq_Timer
.
Valvula
.
Koha_Ndeze < KOHA_PUNE_MIN)
Or
(Seq_Timer
.
Valvula
.
Koha_Fike > KOHA_PUSHIM_MAX)
Or
(Seq_Timer
.
Valvula
.
Koha_Fike < KOHA_PUSHIM_MIN)
Then
Begin
Seq_Timer
.
Valvula
.
Koha_Ndeze :=
0
;
Seq_Timer
.
Valvula
.
Koha_Fike :=
10
;
End
;
Seq_Timer
.
Butoni :=
0
;
Rinis_Valvulat();
Asm
Sei
End
;
While
(
True
)
Do
Begin
butoni_pin_o :=
0
;
Case
Seq_Timer
.
Butoni
Of
BUTONI_OK :
Begin
If
(PINB3_bit =
0
)
Then
Begin
led_pushim :=
0
;
led_pune :=
1
;
End
Else
Begin
led_pune :=
0
;
led_pushim :=
1
;
End
;
Delay_Ms(
500
);
Seq_Timer
.
Butoni :=
0
;
End
;
BUTONI_PLUS :
Begin
If
(PINB3_bit =
1
)
Then
Begin
If
(Seq_Timer
.
Valvula
.
Koha_Ndeze < KOHA_PUNE_MAX)
Then
Begin
Seq_Timer
.
Valvula
.
Koha_Ndeze := Seq_Timer
.
Valvula
.
Koha_Ndeze +
1
;
Shkruaj_EEprom(@Seq_Timer
.
Valvula);
led_buton :=
Not
led_buton;
End
;
End
Else
Begin
If
(Seq_Timer
.
Valvula
.
Koha_Fike < KOHA_PUSHIM_MAX)
Then
Begin
Seq_Timer
.
Valvula
.
Koha_Fike := Seq_Timer
.
Valvula
.
Koha_Fike +
5
;
Shkruaj_EEprom(@Seq_Timer
.
Valvula);
led_buton :=
Not
led_buton;
End
;
End
;
Seq_Timer
.
Butoni :=
0
;
End
;
BUTONI_MINUS :
Begin
If
(PINB3_bit =
1
)
Then
Begin
If
(Seq_Timer
.
Valvula
.
Koha_Ndeze > KOHA_PUNE_MIN)
Then
Begin
Seq_Timer
.
Valvula
.
Koha_Ndeze := Seq_Timer
.
Valvula
.
Koha_Ndeze -
1
;
Shkruaj_EEprom(@Seq_Timer
.
Valvula);
led_buton :=
Not
led_buton;
End
;
End
Else
Begin
If
(Seq_Timer
.
Valvula
.
Koha_Fike > KOHA_PUSHIM_MIN)
Then
Begin
Seq_Timer
.
Valvula
.
Koha_Fike := Seq_Timer
.
Valvula
.
Koha_Fike -
5
;
Shkruaj_EEprom(@Seq_Timer
.
Valvula);
led_buton :=
Not
led_buton;
End
;
End
;
Seq_Timer
.
Butoni :=
0
;
End
;
End
;
End
;
End
.