Witam!
Wykonałem układ do włączania silnika AC lecz mam problem przy sterowaniu. Zadaniem układu jest włączanie silnika na czas ustawiony dowolnie w sterowniku. Układ działa bardzo dobrze bez obciążenia, lecz po podłączeniu przekaźnika pod stycznik uruchomiający silnik czasem zdarza tak, iż po naciśnięciu przycisku "start/stop" przekaźnik zewrze się po czym od razu się rozłączy. Początkowo myślałem, iż jest to sprawa zakłóceń - sprawdziłem - atmega nie resetuje się. Zauważyłem jednak dziwną rzecz, a mianowicie: wygląda to tak jakby timer zliczający czas w dół resetował się w momencie załączenia się stycznika. Drganie styków włącznika też można wyeliminować gdyż flaga zmiany stanu włącznika podczas samoczynnego wyłączenia pozostaje w stanie jak po włączeniu. Czy ktoś spotkał się może z taki zachowaniem? I ma może pomysły co można by z tym zrobić? Poniżej kod programu oraz schemat.
Sterowanie
Zasilanie
[/img]
Wykonałem układ do włączania silnika AC lecz mam problem przy sterowaniu. Zadaniem układu jest włączanie silnika na czas ustawiony dowolnie w sterowniku. Układ działa bardzo dobrze bez obciążenia, lecz po podłączeniu przekaźnika pod stycznik uruchomiający silnik czasem zdarza tak, iż po naciśnięciu przycisku "start/stop" przekaźnik zewrze się po czym od razu się rozłączy. Początkowo myślałem, iż jest to sprawa zakłóceń - sprawdziłem - atmega nie resetuje się. Zauważyłem jednak dziwną rzecz, a mianowicie: wygląda to tak jakby timer zliczający czas w dół resetował się w momencie załączenia się stycznika. Drganie styków włącznika też można wyeliminować gdyż flaga zmiany stanu włącznika podczas samoczynnego wyłączenia pozostaje w stanie jak po włączeniu. Czy ktoś spotkał się może z taki zachowaniem? I ma może pomysły co można by z tym zrobić? Poniżej kod programu oraz schemat.
$regfile = "m8def.dat"
$crystal = 16000000
Config Portd = Output
Config Pinc.0 = Output ' tranzystory
Config Pinc.1 = Output
Config Pinc.2 = Output
Config Pinc.3 = Output
Config Pinc.4 = Output
Config Pinc.5 = Output
Config Pinb.0 = Input 'przyciski
Config Pinb.1 = Input
Config Pinb.2 = Input
Config Pinb.3 = Input
Config Pinb.4 = Input
Config Pinb.5 = Output
Config Debounce = 100
Set Portb.0
Set Portb.1
Set Portb.2
Set Portb.3
Set Portb.4
Reset Portc.4
Reset Portc.5
Config Timer0 = Timer , Prescale = 256
Declare Sub Pobr_znaku(cyfra As Byte)
Config Timer1 = Timer , Prescale = 256
On Timer0 Mult_wysw
On Timer1 Odmierz_1s
Dim S As Integer
Dim M As Integer
Dim Nowa_w As Bit
Dim S_e As Integer
Dim M_e As Integer
Dim Wart_bcd As Byte
Dim A As Byte
Dim B As Byte
Dim C As Byte
Dim D As Byte
Dim X As Byte
Dim Y As Byte
Dim Z As Byte
Dim W As Byte
Dim P As Byte
X = 0
Z = 0
W = 0
Dim Nr_wysw As Byte
W1 Alias Portc.3
W2 Alias Portc.2
W3 Alias Portc.1
W4 Alias Portc.0
S1 Alias Pinb.0
S2 Alias Pinb.1
S3 Alias Pinb.2
S4 Alias Pinb.3
Mg Alias Pinb.4
Enable Interrupts
Enable Timer0
Load Timer0 , 125
Counter1 = 3036
Set Nowa_w
Readeeprom S_e , 9
S = S_e
Readeeprom M_e , 7
M = M_e
Set Portc.5
Wait 5
Reset Portc.5
Do
Portb.2 = 1
Portb.3 = 1
Select Case Mg
Case 1 : Gosub Alarm
Case 0 : Gosub Wysw_czas
If W = 0 Then Debounce S4 , 0 , Ustawienia , Sub
End Select
Loop
End
Ustawienia:
Set Portc.5
Disable Timer1
Readeeprom S_e , 9
S = S_e
Readeeprom M_e , 7
M = M_e
Do
If S2 = 0 Then
Waitms 125
Incr S
If S > 59 Then
S = 0
Incr M
If M > 10 Then
M = 10
S = 59
End If
End If
End If
If S3 = 0 Then
Waitms 125
Decr S
If S < 0 Then
S = 59
Decr M
If M < 0 Then
M = 0
S = 0
End If
End If
End If
Debounce S4 , 0 , Ustaw , Sub
D = M / 10
C = M Mod 10
B = S / 10
A = S Mod 10
Loop Until Y = 1
Reset Y
Reset Portc.5
S_e = S
Writeeeprom S_e , 9
M_e = M
Writeeeprom M_e , 7
Return
Odmierz_1s:
Counter1 = Counter1 + 3036
Decr S
Set Nowa_w
If S < 0 Then
S = 59
Decr M
If M < 0 Then
M = 0
S = 0
Disable Timer1
Reset Portc.4
Reset X
Reset W
Readeeprom S_e , 9
S = S_e
Readeeprom M_e , 7
M = M_e
End If
End If
Return
Sub Pobr_znaku(cyfra As Byte)
Portd = Lookup(cyfra , Kody7seg)
End Sub
Mult_wysw:
Load Timer0 , 150
Set W1
Set W2
Set W3
Set W4
Select Case Nr_wysw
Case 0:
Call Pobr_znaku(a)
Reset W1
Case 1:
Call Pobr_znaku(b)
Reset W2
Case 2:
Call Pobr_znaku(c)
Reset W3
Case 3:
Call Pobr_znaku(d)
Reset W4
End Select
Incr Nr_wysw
If Nr_wysw = 4 Then
Nr_wysw = 0
End If
Return
Kody7seg:
Data &B01000000 , &B01111001 , &B00100100 , &B00110000 , &B00011001 ,
Data &B00010010 , &B00000010 , &B01111000 , &B00000000 , &B00010000 ,
Data &B10010010 , &B11001110 , &B11000000 , &B10001100
Wysw_czas:
Select Case W
Case 0 : Debounce S1 , 0 , Pr , Sub
Case 1 : Debounce S1 , 0 , Pr1 , Sub
End Select
D = M / 10
C = M Mod 10
B = S / 10
A = S Mod 10
If Nowa_w = 1 Then
Wart_bcd = Makebcd(m)
Locate 1 , 4
Wart_bcd = Makebcd(s)
Locate 1 , 7
Reset Nowa_w
End If
Return
Alarm:
Disable Timer1
D = 10
C = 11
B = 12
A = 13
Reset Portc.4
Reset X
Do
Loop Until Mg = 0
Readeeprom S_e , 9
S = S_e
Readeeprom M_e , 7
M = M_e
Return
Pr:
Set W
Enable Timer1
Set Portc.4
Return
Pr1:
Disable Timer1
Reset Portc.4
Readeeprom S_e , 9
S = S_e
Readeeprom M_e , 7
M = M_e
Reset W
Return
Ustaw:
Set Y
ReturnSterowanie
Zasilanie
