Elektroda.pl
Elektroda.pl
X

Search our partners

Find the latest content on electronic components. Datasheets.com
Elektroda.pl
Please add exception to AdBlock for elektroda.pl.
If you watch the ads, you support portal and users.

[bascom] [mega8]- ładowarka problem z Lcd

06 Jul 2008 14:18 3734 22
  • Level 25  
    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.

    Code:


      $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
    [Szkolenie 22.06.2021, g.9.30] Zabezpieczenia Internetu Rzeczy (IoT) programowe i sprzętowe. Zarejestruj się za darmo
  • Level 24  
    A masz moze schemat? Czy w ukladzie masz ceramika 100nF i moze jakis elektrolit kilka uF? Ja mialem kiedys podobny problem z LCD. Jak wlaczalem podswietlanie to na LCD pokazywaly sie jakies smieci. Zastosowanie wyzej wymienionych kondensatorow rozwiazalo problem.
  • Level 25  
    W zasilaczu 4x47n na diodach mostka 1000uf i po 100n za i przed stabilizatorem. na resecie jest 2,2 i 10k do+5,lcd ma podświetlanie przez bc557.
    Właśnie problem polega na tym, iż wszytko działa i lcd pokazuje, co powinien ale do czasu tak jak by się coś przepełniało, ale nie mam pojęcia co :)

    Sadze że to wina programu bo jeśli zostawię tylko automat bez liczenia czsu to działa ok
  • Level 24  
    A podswietlanie caly czas wlaczone? Jesli tak to odlacz na czas testow... i zobaczymy czy to cokolwiek zmieni. A co do kondensatorow to zawsze jest dobrze wcisnac 100nF jak najblizej zasilania uC.

    A zamiast czegos takiego:

    Code:
    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

    {...}

    Writeeeprom B , 2
    Writeeeprom C , 3
    Writeeeprom D , 4
    Writeeeprom E , 5
    Writeeeprom F , 6
    Writeeeprom G , 7


    Proponowalbym zrobic tablice i w petli robic zapis i odczyt bo to troche "razi" w oczy :D

    I jeszcze w sumie widze, ze czesto to powtarzasz:

    Code:
    Writeeeprom B , 2
    
    Writeeeprom C , 3
    Writeeeprom D , 4
    Writeeeprom E , 5
    Writeeeprom F , 6
    Writeeeprom G , 7


    wiec wrzuc to w jakiegos np. Sub'a lub funkcje i pozniej tylko wywolanie. Zyskasz troche miejsca w uC.
  • Level 25  
    To tylko kosmetyka:) do poprawienia. Mnie martwi sprawa Wyświetlacza.
    Schemat jest banalnie prosty na napięcie - dzielnik 4 do 1 za im 100uf przy nodze uc
    Prąd z bocznika na Lm358 i na 1000uf przy nodze uc. Przyciski maja 1k do +5v.

    Zostawiłem tylko to i działa już ponad 10 godzin z podświetlaniem

    Code:

      $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 Sek As Integer
    Dim A1 As Integer
    Dim A As Integer

    Dim Krok 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 P As Single
    Dim N As Single
    Dim N1 As Single
    Dim N2 As Single
    Dim Licznik As Integer


    Dim Odczyt1 As Word

    Dim Odczyt2 As Word
    Enable Interrupts
    On Timer0 Timer0_int                                        'ustawienie dla zegatów

    Timer0 = 6
    Licznik = 0


    Config Pind.0 = Input                                       'opto bateria jest
    Set Pind.0

    Config Pind.7 = Output                                      'przekaznik
    Reset Portd.5                                               'led lcd


    Config Pind.1 = Input
    P2 Alias Pind.1
    Set Pind.1

    Config Pind.2 = Input
    P3 Alias Pind.2
    Set Pind.2

    Config Pind.3 = Input
    P4 Alias Pind.3
    Set Pind.3

    Config Pind.4 = Input
    S1 Alias Pind.4
    Set Pind.4

    Config Pind.6 = Input
    P1 Alias Pind.6
    Set Pind.6

    Deflcdchar 1 , 4 , 14 , 14 , 14 , 4 , 32 , 4 , 32
    Deflcdchar 2 , 4 , 2 , 17 , 1 , 1 , 17 , 2 , 4
    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


    Goto Poczatek

    Poczatek:

    Set Portd.7
    Disable Timer0
    Bitwait P1 , Reset
    Enable Timer0

    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
    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
    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 Program
    End If

    Loop




    Program:
    Cls
    Locate 1 , 1
    Lcd "Zaczynam ladowac"
    Wait 2
    Cls
    Set Portd.5
    Programx:
    Do
    If Pind.0 = 1 Then
    Goto Home
    End If

    If P3 = 0 Then
    Reset Portd.5
    Goto Wyj
    End If

    P = 0
    N = 0
    N1 = 0
    N2 = 0
    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


    P = Warprad1 * 0.1
    N = Warnap1 * 0.032
    N1 = Warnap * 0.032
    N2 = N1 / 12

    Warpradx = Fusing(p , "#.##")
    Locate 2 , 1
    Lcd "A = " ; Warpradx ; " "

    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
    Goto Koniec1
    End If
    Loop




    Koniec1:

    Cls
    Warnap1 = 0
    Warprad1 = 0
    Reset Portd.5
    Disable Timer0
    For Krok = 1 To 5
    Set Pind.7
    Locate 1 , 1
    Lcd "  BATERIA "
    Locate 2 , 1
    Lcd " NALADOWANA" ; Chr(2);

    Reset Pind.7
    Waitms 10
    Next Krok
    Goto Poczatek


    Wyj:
    Cls
    Lcd " stop ladowania"
    Writeeeprom B , 2
    Writeeeprom C , 3
    Writeeeprom D , 4
    Writeeeprom E , 5
    Writeeeprom F , 6
    Writeeeprom G , 7
    Cls
    Locate 1 , 1
    Lcd "calkowity czas "
    Locate 2 , 1
    Lcd ; G ; F ; E ; D ; C ; B ;
    Wait 2
    Cls
    Goto Poczatek




    Timer0_int:                                                 ' zegary i liczniki



    Counter0 = Counter0 + 6
    Incr Licznik
    If Licznik = 500 Then
    Incr A
    Licznik = 0
    End If



    If A > 59 Then
    Incr B
    A = 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

  • Level 25  
    Przepełniasz stos .... zwiększ dla kompilera wielkość pamięci na stos ( oczywiście w opcjach kompilera). Z bascomem tak jest mówi o wszystkim tylko nie o błędzie przepełnienia stosu. ( np Pascal informuje ale nie ma go na AVR). I jak w pętlach wyświetlasz coś na lcd to za każdym wykonaniem funkcji LCD daj Waitms 10 bo niektóre wyświetlacze słabo sobie radzą jak im w pętli pchasz tysiące bajtów na sekundę :D
  • Level 33  
    W opcjach kompilatora to było chyba HWStack, dawno Bascoma nie odpalałem...
  • Level 25  
    Jednak posiadam wersję Bascoma 1.11.7.4 która niema ograniczeń co do wielkości kodu wynikowego jednak
    w tej wersji kompilator nie chce rozpoznać tych instrukcji:


    Czy tyle wystarczy??

    $hwstack = 32
    $swstack = 10
    $framesize = 40

    zgłacza taki error:
    Assigment error [$hwstack:112 32:112]
    Assigment error [$swstack:112 10:112]
    Assigment error [$framesize:112 40:112]

    a wersja 1.11.9.1 ma ograniczone działanie.
    Może ktoś ma pełną wersję i mógł by skompilować mi kod
  • Level 35  
    Witam.
    nouki wrote:
    ....dzielnik 4 do 1 za im 100uf przy nodze uc
    Prąd z bocznika na Lm358 i na 1000uf przy nodze uc....
    Napięcie z dzielnika, czy też z bocznika, podajesz na wejście ADC. Czy tak? To po co te elektrolity?
    nouki wrote:
    ....Przyciski maja 1k do +5v....
    Zbyt mała wartość rezystorów.
    Bez schematu to się raczej nie obędzie. Kondensator w resecie nie jest do niczego potrzebny a czasem wręcz przeszkadza w normalnej pracy.
  • Level 25  
    program rusza bez rezystorów,przycisków czy... -samoczynnie. Nie dotykam niczego i dzieje się jak opisałem.
    Jeśli jest ta uboga wersja programu (podana w poście) to działa. Więc nie sądzę że to wina elementów. Bo działo by się tak za każdym razem a nie tylko na programie długim.
    Pytałem czy takie wartości wystarczą :
    $hwstack = 32
    $swstack = 10
    $framesize = 40

    Próbowałem policzyć tak jak podane w pomocy ale .... nie mogę dojść do tego.

    p.s elektrolity. zrób ten układ i zobacz jak skacze pomiar bez nich!
  • Level 35  
    nouki wrote:
    ...elektrolity. zrób ten układ i zobacz jak skacze pomiar bez nich!
    Jak mam zrobić bez schematu :?:
    Żeby pomiar nie skakał trzeba zrobić uśrednianie wyniku, a nie dokładać kondensatory. I to jeszcze o takich pojemnościach. Już na podstawie tego widać że cały układ jest.....daleki od poprawności.
  • Level 25  
    jak Byś zobaczył program to Byś nie pytał:) pomiar jest z 50 i średnią podaje
    Ile mam pisać że pomiary są ok. Bez elektrolitu wynik średniej ma rozpiętość 50A na 5 wynikach:)
    Ładowarka daje 150A więc:
    weź pomiar z bocznika daj na lm358 i dokonaj pomiaru a przekonasz się czemu elektrolit jest taki a nie inny.
    To nie wina elementów lecz programu! i właśnie o tym mowa.

    Jeśli chcesz sprawdzić to :
    -weź trafo i podłącz mostek
    -podłącz elektrolit za mostkiem
    -daj opornik 0,1ohma i opornik(halogen) jako obciążenie
    Dokonaj pomiaru prądu (pomiar spadku napięcia na 0,1ohma) i napięcia na(halogenie) i zobacz wtedy co daje elektrolit za dzielnikiem (przy nodze adc)
  • Level 42  
    Witam,

    próbowałem przeanalizować ten kodzik ale naprawdę , uwierz - jest to baardzo ciężkie. Robisz narazie wszystko niezgodnie z zasadami programowania. Rozumiem oczywiście, że dopiero się uczysz ale postaraj się przestrzegać kilku zasad o których za chwilę a będzie nie tylko tobie łatwiej analizować napisany kod ale co najważniejsze szukać błędów. Bo wg mnie - przy tak zagmatwanym kodzie - pies leży pogrzebany właśnie w nim.

    1. podziel kod na wyraźne bloki jak:

    - nagłówek - czyli wyraźne deklaracje procesora, częstotliwości taktowania, ustawienia stosu sprzętowego, programowego i ramki , konfiguracji LCD

    - deklaracje zmiennych, stałych, aliasów itp

    - deklaracje funkcji czy procedur (ty z nich w ogóle nie korzystasz !!! i to jest twój największy błąd)

    - ZAPOMNIJ o poleceniu GOTO - wymaż je ze swojej pamięci i nigdy go nie używaj, zamiast tego funkcje i/lub procedury

    - główna pętla programu DO --- LOOP

    - definicje ciał procedur i funkcji

    - definicje ew przerwań

    - STOSUJ wcięcia !!! bo nic nie widać w twoim kodzie

    dzięki mniej więcej takim zasadom zobaczysz, że szybciej nauczysz się nie tylko Bascoma to po pierwsze.

    - u ciebie główny problem może być taki, że rzeczywiście stos się przepełnia i to nie tylko ze względu na brak deklaracji odnośnie stosu i ramki. Ale właśnie dlatego, że wyskakujesz z różnych pętli za pomocą GOTO i robi się ogólna masakra - ciężko cokolwiek przewidzieć . A oczywiście może być tak, że na początku wszystko ci długo działa, bo stos zjada się powoli aż w końcu wszystko idzie w maliny

    czyli korzystaj z takich konstrukcji programowych jak:


    ... nagłówek (np taki - oczywiście zrób go po swojemu)
    $regfile = "m8def.dat"

    $crystal = 8000000
    $hwstack = 128
    $swstack = 128
    $framesize = 128

    Config Lcd = 16 * 2
    Config Lcdpin = Pin , Db4 = Portc.2 , Db5 = Portc.3 , Db6 = Portc.4 , Db7 = Portc.5 , E = Portc.1 , Rs = Portc.0


    Declare Sub Procedura_01
    Declare Function Funkcja_02(parametr as byte)


    .... inicjalizacja zmiennych itp

    Do

    ... jakieś operacje w pętli
    call Procedura_01
    ....
    ....
    call Funkcja_02
    ....
    ....

    Loop

    Sub Procedura_01

    .... tu ciało procedury

    End Sub 'tu powrót do miejsca skąd skoczyłeś do niej


    Function Funkcja_02(parametr as byte)

    .... ciało funkcji

    End Function 'tu powrót do miejsca skąd skoczyłeś do niej


    .... tutaj procedury obsługi przerwań


    ... poczytaj w helpie Bascoma o zasadach stosowania odpowiednich parametrów dla $hwstack itp - jest to tam gdzieś już nie pamiętam gdzie ale jest - opisane

    i nie licz na to, że masz takie sprawy zdeklarowane w kompilatorze - w tym np LCD - najlepiej to zrobić w ten sposób "ręcznie" - jak wyżej pokazałem

    myślę, że jak się do tego zastosujesz to napiszez tak ten sofcik , że wszystko będzie ładnie śmigało że hej

    pozdrawiam
  • Level 36  
    Nie czytałem wypowiedzi - za dużo jak na tę godzinę, przeczytałem tylko pierwszy post.

    Jak dla mnie, na pierwszy rzut oka jest to typowe zawieszanie się uP pod wpływem szpilek / anomaliów na zasilaniu. A tutaj, jak widzę mamy sterowanie dużymi prądami, i, jak się spodziewam - zasilanie układu z uP prawdopodobnie też z zakłócanego źródła.

    1. Sprawdź, czy nie pozostawiłeś jakichś wyprowadzeń uP w powietrzu
    2. Zainteresuj się filtrami emi
  • Level 38  
    Popieram kolegę mirekk:)
    Ten soft próbowałem dobrą godzinę rozgryźć i dramatycznie wygląda.
    Nie mam nic przeciw goto *wszakże jmp dobry jest* ale nie wszędzie a tam gdzie to konieczne i logiczne.

    A poza tym, straszny syf w tym kodzie;)
  • Level 25  
    Dziś przerobie Program jak piszecie.
    Zasilanie jest brane z osobnego tsa. Ten układ działa zawsze i czeka na naciśniecie "on" podłączenie baterii. Jeśli spełnione są te dwa parametry uruchamia trafo ładowarki.
    Jak zwykle ktoś czyta połowicznie :) a jest napisane na krótkim kodzie działa ok:) wiec zasilanie ok:) wszystkie nogi które są niepotrzebne podłączone do masy i porty ustawione odpowiednio:)


    P.s próbowałem jeszcze licznik Amperogodzin ale pokazuje imi jakieś bzdety:
    lm358 jest wyskalowany tak że przy 100mA na wejściu daje 1000(blisko 5v) na adc (docelowa ładowarka będzie do 200mA) tutaj jest wszystko dla ułatwienia zrobione:)

    x=wynik z adc*0,1
    y=x /60

    i w timerku co minutę dodawałem wynik
    ah=x+x