Cześć.
Postanowiłem zrobić sterownik do ładowarki, który to ma dwa tryby
-automat - ładuje aż prąd nie spadnie na mniej niż 15A z możliwością przerwania i wyświetlania parametrów ładowania
-ustawianie na czas, w którym ładowarki nie interesują parametry tylko czas, jaki pozostał
Wszystko działa tylko problem polega na tym, że LCD przestaje reagować, tzn. po jakimś czasie znika wszystko z niego i po naciśnięciu klawisza z menu pojawiają się krzaki- sytuacja ta utrzymuje się aż do czasu, gdy wyłączę wtyczkę bądź zresetuje procesor.
Kombinowałem już chyba wszystkiego, ale jednak nie wpadłem na nic konkretnego raz zawiesza się po 30 mi n a innym razem po 4h.
Ładowarka po zawieszeniu wykonuje wszystkie funkcje (zapisuje dane, działają klawisze....)
Kod jest troszkę długi ale powinno być wszystko jasne a jak nie to dopowiem.
Postanowiłem zrobić sterownik do ładowarki, który to ma dwa tryby
-automat - ładuje aż prąd nie spadnie na mniej niż 15A z możliwością przerwania i wyświetlania parametrów ładowania
-ustawianie na czas, w którym ładowarki nie interesują parametry tylko czas, jaki pozostał
Wszystko działa tylko problem polega na tym, że LCD przestaje reagować, tzn. po jakimś czasie znika wszystko z niego i po naciśnięciu klawisza z menu pojawiają się krzaki- sytuacja ta utrzymuje się aż do czasu, gdy wyłączę wtyczkę bądź zresetuje procesor.
Kombinowałem już chyba wszystkiego, ale jednak nie wpadłem na nic konkretnego raz zawiesza się po 30 mi n a innym razem po 4h.
Ładowarka po zawieszeniu wykonuje wszystkie funkcje (zapisuje dane, działają klawisze....)
Kod jest troszkę długi ale powinno być wszystko jasne a jak nie to dopowiem.
$crystal = 8000000
$regfile = "m8def.dat"
Config Lcdbus = 4
Config Lcd = 16 * 2
Config Lcdpin = Pin , Db4 = Pb.3 , Db5 = Pb.2 , Db6 = Pb.1 , Db7 = Pb.0 , E = Pb.4 , Rs = Pb.5
Cursor Off
Cursor Noblink
Config Timer0 = Timer , Prescale = 64
Config Adc = Single , Prescaler = Auto , Reference = Avcc
Start Adc
Dim Min1 As Byte
Dim Sek1 As Byte
Dim Godzina1 As Byte
Dim Sek As Byte
Dim Minuta As Byte
Dim Godzina As Byte
Dim W As Byte
Dim Krok As Byte
Dim A1 As Byte
Dim A As Byte
Dim B As Byte
Dim C As Byte
Dim D As Byte
Dim E As Byte
Dim F As Byte
Dim G As Byte
Dim X As Byte
Dim Y As Byte
Dim Warprad As Integer
Dim Warnap As Integer
Dim Warprad1 As Integer
Dim Warnap1 As Integer
Dim Warnapx As String * 3
Dim Warpradx As String * 3
Dim Ogniwo As Single
Dim K2 As Single
Dim K1 As Single
Dim P As Single
Dim N As Single
Dim N1 As Single
Dim N2 As Single
Dim Licznik As Integer
Dim Licznik1 As Integer
Dim Odczyt1 As Word
Dim Odczyt2 As Word
Config Pind.0 = Input 'opto bateria jest
Set Pind.0
Config Pind.7 = Output 'przekaznik
Reset Portd.5 'led lcd
Config Pind.1 = Input 'przycisk 2
P2 Alias Pind.1
Set Pind.1
Config Pind.2 = Input
P3 Alias Pind.2 'przycisk 3
Set Pind.2
Config Pind.3 = Input
P4 Alias Pind.3 'przycisk 4
Set Pind.3
Config Pind.4 = Input
S1 Alias Pind.4 'przelacznik 1
Set Pind.4
Config Pind.6 = Input
P1 Alias Pind.6
Set Pind.6 'przycisk 1
Deflcdchar 1 , 4 , 14 , 14 , 14 , 4 , 32 , 4 , 32
Deflcdchar 2 , 4 , 2 , 17 , 1 , 1 , 17 , 2 , 4
Enable Interrupts
On Timer0 Timer0_int 'ustawienie dla zegatów
Timer0 = 6
Licznik = 0
N = 0
P = 0
Minuta = 0
Godzina = 0
Ogniwo = 0
Readeeprom B , 2 'czytanie czasu calkowitego
Readeeprom C , 3
Readeeprom D , 4
Readeeprom E , 5
Readeeprom F , 6
Readeeprom G , 7
Readeeprom X , 8
Readeeprom Y , 9
If P2 = 0 Then ' kasowanie czasu calkowitego
Locate 1 , 1
Lcd " kasuje czas"
Locate 2 , 1
Lcd "calkowity"
Wait 2
B = 0
C = 0
D = 0
E = 0
F = 0
G = 0
Writeeeprom B , 2
Writeeeprom C , 3
Writeeeprom D , 4
Writeeeprom E , 5
Writeeeprom F , 6
Writeeeprom G , 7
Cls
End If
Wait 1
Goto Poczatek
Poczatek:
Disable Timer0
Set Portd.7
Bitwait P1 , Reset ' czekanie na odpalenie
N = 0
P = 0
Cls
Reset Portd.7
Lcd " inicjacja"
Wait 1
Set Portd.7
Wait 1
Reset Portd.7
Cls
Locate 1 , 1
Lcd " W i t a m"
Wait 1
Cls
Locate 1 , 1
Lcd "****************"
Locate 2 , 1
Lcd "** Nouki 2008 **"
Wait 2
Cls
Locate 1 , 1
Lcd " Ladowarka 24V "
Locate 2 , 2
Lcd " * Ver. 1.01 * "
Wait 2
Home:
Cls
Do
If E > 5 Then 'czas przekroczony
For Krok = 1 To 10
Locate 1 , 1
Lcd ; Chr(1) ; " USZKODZENIE " ; Chr(1) ;
Locate 2 , 1
Lcd " LADOWARKI "
Wait 1
Next Krok
Goto Poczatek
End If
If Pind.0 = 1 Then ' wykrywanie baterii
Reset Portd.5
Locate 1 , 1
Lcd ; Chr(1) ; " BLAD BATERII " ; Chr(1) ;
Locate 2 , 1
Lcd " PODLACZ BATERIE"
Waitms 500
Elseif Pind.0 = 0 Then
Cls
Locate 1 , 1
Lcd " Bateria O.K"
Locate 2 , 1
Lcd " " ; Chr(2);
Wait 2
Goto Wej
End If
Loop
Wej:
If S1 = 0 Then
Goto Menu
End If
Goto Program
Program:
Cls
Locate 1 , 1
Lcd "Zaczynam ladowac"
Wait 2
Enable Timer0
Godzina = 0
Minuta = 0
Sek = 0
Ogniwo = 0
Cls
Programx: 'ladowanie automat
Do
If Pind.0 = 1 Then
Goto Home
End If
If P2 = 0 Then
Waitms 500
Goto Czas
End If
If P3 = 0 And P4 = 0 Then
Goto Stop_prog:
End If
Set Portd.5
Odczyt1 = 0
Odczyt2 = 0
For Krok = 1 To 50 '
Warprad = Getadc(5) ' odczyt 50 wynikow do sredniej
Warnap = Getadc(3)
Odczyt1 = Odczyt1 + Warprad ' dodanie do siebie 50 wynikow
Odczyt2 = Odczyt2 + Warnap
Waitms 20
Next Krok
Warprad1 = Odczyt1 / 50 ' uzyskanie sredniej
Warnap1 = Odczyt2 / 50 '
P = Warprad1 * 0.1 ' przsuniecie przecinka
Warpradx = Fusing(p , "#.##")
Locate 2 , 1
Lcd "A = " ; Warpradx ; " "
N = Warnap1 * 0.032
N1 = Warnap * 0.032
N2 = N1 / 12
Warnapx = Fusing(n , "#.##")
Locate 1 , 1
Lcd "V = " ; Warnapx ; " "
Locate 3 , 1
If Pind.0 = 1 Then
Goto Home
End If
If Warprad1 < 150 Then ' prad mniejszy od skoncz ladowac
Goto Koniec1
End If
Loop
Na_czas: 'ladowanie na czas
Cls
Locate 1 , 1
Lcd "Zaczynam ladowac"
'Wait 2
Enable Timer0
Cls
Godzina = 0
Minuta = 0
Sek = 0
Ogniwo = 0
Na_czasx: 'ladowanie na czas
Do
If Pind.0 = 1 Then
Goto Home
End If
Odczyt1 = 0
Odczyt2 = 0
For Krok = 1 To 50
Warprad = Getadc(5)
Warnap = Getadc(3)
Odczyt1 = Odczyt1 + Warprad
Odczyt2 = Odczyt2 + Warnap
Waitms 20
Next Krok
Warprad1 = Odczyt1 / 50
Warnap1 = Odczyt2 / 50
N = Warnap1 * 0.032
N1 = Warnap * 0.032
N2 = N1 / 12
Set Portd.5
Locate 1 , 1
Lcd "Zadany h:" ; X ; " m:" ; Y ; " "
Locate 2 , 1
Lcd " h:" ; Godzina ; " m:" ; Minuta ; " s" ; Sek ; " "
If Godzina = X And Minuta = Y Then
Goto Koniec:
End If
If P3 = 0 And P4 = 0 Then
Goto Stop_czas:
End If
If P2 = 0 Then
Waitms 500
Goto Czas2
End If
If Pind.0 = 1 Then
Minuta = 0
Godzina = 0
Sek = 0
Goto Home
End If
Loop
Czaslad: 'ustawianmie czasu ladowania
Locate 1 , 1
Lcd "CZAS LADOWANIA"
Wait 1
Cls
Do
Cls
Locate 1 , 1
Lcd "P3+m P4+h P2zap"
Locate 2 , 1
Lcd "Godz:" ; X ; " Minut:" ; Y ; " "
If P3 = 0 Then
Waitms 500
Y = Y + 30
If Y > 59 Then
Cls
Y = 0
Incr X
If X > 10 Then
Cls
X = 0
End If
End If
End If
If P4 = 0 Then
Waitms 500
Incr X
If X > 10 Then
Cls
X = 0
End If
End If
If P2 = 0 Then
Cls
Lcd "Zapis danych"
Writeeeprom X , 8
Writeeeprom Y , 9
Wait 2
Goto Wej
End If
Loop
Menu: 'przerwanie ladowania
Do
Locate 1 , 1
Lcd "P2-START "
Locate 2 , 1
Lcd "P3-CZAS LADOWANIA"
If P2 = 0 Then
Goto Na_czas
End If
If P3 = 0 Then
Cls
Goto Czaslad:
End If
Papa: 'wyjscie do poczatku z zapisem danych
If P1 = 0 Then
Cls
Locate 1 , 1
Lcd " Zapisuje dane"
Writeeeprom B , 2
Writeeeprom C , 3
Writeeeprom D , 4
Writeeeprom E , 5
Writeeeprom F , 6
Writeeeprom G , 7
Waitms 500
Cls
Locate 1 , 1
Lcd " przechodze na"
Locate 2 , 1
Lcd " czuwanie "
Wait 2
Cls
Locate 2 , 1
Lcd " Do Zobaczenia"
Wait 1
Cls
Goto Poczatek
End If
Loop
Czas:
'parametry ladowania automat
Cls
For Krok = 1 To 5
Locate 1 , 1
Lcd " nap. ogniwa"
Locate 2 , 1
Lcd " " ; Ogniwo ; " V"
Wait 1
Next Krok
Cls
For Krok = 1 To 5
Locate 1 , 1
Lcd "calkowity czas "
Locate 2 , 1
Lcd ; G ; F ; E ; D ; C ; B ;
Wait 1
Next Krok
Cls
For Krok = 1 To 8
Locate 1 , 1
Lcd "czas ladowania"
Locate 2 , 1
Lcd " h:" ; Godzina ; " m:" ; Minuta ; " s" ; Sek ; " "
Next Krok
Wait 1
Cls
Goto Programx
Czas2: 'parametry ladowania na czas
Cls
For Krok = 1 To 5
Locate 1 , 1
Lcd " nap. ogniwa"
Locate 2 , 1
Lcd " " ; Ogniwo ; " V"
Wait 1
Next Krok
Cls
For Krok = 1 To 5
Locate 1 , 1
Lcd "calkowity czas "
Locate 2 , 1
Lcd ; G ; F ; E ; D ; C ; B ;
Wait 1
Next Krok
Cls
Goto Na_czasx
Koniec: 'czas ladowania skonczyl sie
Cls
Warnap1 = 0
Warprad1 = 0
Reset Portd.5
Disable Timer0
For Krok = 1 To 5
Set Pind.7
Locate 1 , 1
Lcd " KONIEC CZASU "
Locate 2 , 1
Lcd " LADOWANIA"
Wait 1
Writeeeprom B , 2
Writeeeprom C , 3
Writeeeprom D , 4
Writeeeprom E , 5
Writeeeprom F , 6
Writeeeprom G , 7
Reset Pind.7
Waitms 10
Next Krok
Goto Poczatek
Koniec1:
' bateria naladowala sie
Cls
Warnap1 = 0
Warprad1 = 0
Reset Portd.5
Disable Timer0
Set Pind.7
Locate 1 , 1
Lcd " BATERIA "
Locate 2 , 1
Lcd " NALADOWANA" ; Chr(2);
Wait 1
Writeeeprom B , 2
Writeeeprom C , 3
Writeeeprom D , 4
Writeeeprom E , 5
Writeeeprom F , 6
Writeeeprom G , 7
Reset Pind.7
Waitms 10
Goto Poczatek
Koniec2: 'stop ladowania auto
Cls
Warnap1 = 0
Warprad1 = 0
Reset Portd.5
Disable Timer0
Set Pind.7
Locate 1 , 1
Lcd " STOP "
Locate 2 , 1
Lcd " LADOWANIA"
Wait 1
Writeeeprom B , 2
Writeeeprom C , 3
Writeeeprom D , 4
Writeeeprom E , 5
Writeeeprom F , 6
Writeeeprom G , 7
Reset Pind.5
Goto Stop_prog
Koniec3:
'stop ladowania na czas
Cls
Warnap1 = 0
Warprad1 = 0
Reset Portd.5
Disable Timer0
For Krok = 1 To 5
Set Pind.7
Locate 1 , 1
Lcd " STOP "
Locate 2 , 1
Lcd " LADOWANIA"
Wait 1
Reset Pind.5
Waitms 10
Next Krok
Goto Stop_czas
Stop_prog: 'po stopie co zrobic dalej auto
Cls
Do
Reset Portd.5
Locate 1 , 1
Lcd "P2-Start ponowny"
Locate 2 , 1
Lcd "P1-Wylacz"
If P2 = 0 Then
Goto Program
Wait 1
End If
If P1 = 0 Then
Goto Papa
End If
Loop
Stop_czas: ' 'po stopie co zrobic dalej na czas
Cls
Do
Reset Portd.5
Locate 1 , 1
Lcd "P2-Start ponowny"
Locate 2 , 1
Lcd "P1-Wylacz"
If P2 = 0 Then
Goto Na_czas
Wait 1
End If
If P1 = 0 Then
Goto Papa
End If
Loop
Timer0_int: ' zegary i liczniki
Counter0 = Counter0 + 6
Incr Licznik
If Licznik = 500 Then
Incr A
Incr Sek
Incr Sek1
Incr A1
Licznik = 0
End If
If A1 > 6 Then
A1 = 0
Ogniwo = N2
End If
If Sek1 > 59 Then
Cls
Sek1 = 0
End If
If Sek > 59 Then
Cls
Incr Minuta
Sek = 0
End If
If A > 59 Then
Incr B
A = 0
End If
If Minuta > 59 Then
Incr Godzina
Minuta = 0
End If
If B > 9 Then
Incr C
B = 0
End If
If C > 9 Then
Incr D
C = 0
End If
If D > 9 Then
Incr E
D = 0
End If
If E > 9 Then
Incr F
E = 0
End If
If F > 9 Then
Incr G
F = 0
End If
If G > 9 Then
G = 0
End If
Return
