logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

[mega8][bascom] odliczanie czasu

nouki 07 Paź 2008 15:10 3233 7
REKLAMA
  • #1 5608091
    nouki
    Poziom 25  
    Cześć.

    Mam taki problem napisałem sobie program który steruje ładowarką.
    Jeśli ustawie mu:
    cksel=0100 , sut=00 to nie działa program - nic sie nie dzieje.

    a jeśli ustawię:
    cksel=0100 , sut=10 wtedy działa ale źle liczy czas

    Program robiony na szybko wiec może ma gdzieś błąd ewentualnie co poprawić w nim??




    
    
    $crystal = 8000000
    
    $regfile = "m8def.dat"
    
    
    Config Timer0 = Timer , Prescale = 64
    Config Adc = Single , Prescaler = Auto , Reference = Avcc
    Start Adc
    
    Dim Sek As Byte
    Dim Minuta As Byte
    Dim Godzinaa As Byte
    Dim Minutaa As Byte
    Dim Godzina As Byte
    Dim Krok As Byte
    Dim X As Byte
    Dim Y As Byte
    Dim Warnap As Integer
    Dim N As Single
    Dim Warnap1 As Integer
    Dim Licznik As Integer
    Dim Odczyt2 As Word
    Declare Sub Pomiar_nap
    
    
    
    Config Portb.6 = Output                                     'przekaźnik 1
    P1 Alias Portb.6
    Reset Portb.6
    
    Config Portb.0 = Output                                     'przekaznik 2
    P2 Alias Portb.0
    Reset Portb.0
    
    
    Config Pind.7 = Input                                       'czas a
    Ta Alias Pind.7
    Set Pind.7
    Config Pind.6 = Input                                       'czas b
    Tb Alias Pind.6
    Set Pind.6
    Config Pind.5 = Input                                       'czas c
    Tc Alias Pind.5
    Set Pind.5
    
    
    Config Portb.2 = Output                                     ' pulsujace led
    Pulse Alias Portb.2
    Reset Portb.2
    
    Config Portb.1 = Output                                     'pilnuje naladowania
    Pilnuje Alias Portb.1
    Reset Portb.1
                                                                  'STANY NALADOWANIA
    
    Config Portb.5 = Output                                     'czerwona led
    Cz Alias Portb.5
    Reset Portb.5
    Config Portb.4 = Output                                     ' zolta led
    Zo Alias Portb.4
    Reset Portb.4
    Config Portb.3 = Output                                     ' zielona led
    Zi Alias Portb.3
    Reset Portb.3
    
    
    Wait 1
    Set Cz
    Waitms 500
    Set Zo
    Waitms 500
    Set Zi
    Waitms 500
    Set Pulse
    Waitms 500
    Set Pilnuje
    Wait 1
    
    Reset Cz
    Waitms 200
    Reset Zo
    Waitms 200
    Reset Zi
    Waitms 200
    Reset Pulse
    Waitms 200
    Reset Pilnuje
    
    Home:
    
    On Timer0 Timer0_int
    Enable Interrupts
    Timer0 = 6
    Licznik = 0
    
    
    Godzina = 0
    Minuta = 0
    Godzinaa = 0
    Minutaa = 0
    Krok = 0
    Odczyt2 = 0
    N = 0
    
    
    If Ta = 0 And Tb = 0 And Tc = 0 Then Y = 2                  ' czas 2 min
    If Ta = 1 And Tb = 1 And Tc = 1 Then X = 12                 ' czas 12 h
    If Ta = 1 And Tb = 1 And Tc = 0 Then X = 10                 ' czas 10 h
    If Ta = 0 And Tb = 1 And Tc = 1 Then X = 8                  ' czas 8 h
    If Ta = 1 And Tb = 0 And Tc = 1 Then X = 6                  ' czas 6 h
    If Ta = 1 And Tb = 0 And Tc = 0 Then X = 4                  ' czas 4 h
    If Ta = 0 And Tb = 1 And Tc = 0 Then X = 2                  ' czas 2 h
    If Ta = 0 And Tb = 0 And Tc = 1 Then X = 1                  ' czas 1 h
    
    
    
    
    
    
    
    
    Do   
    
    Odczyt2 = 0
    For Krok = 1 To 50
    Warnap = Getadc(3)
    Odczyt2 = Odczyt2 + Warnap
    Waitms 20
    Next Krok
    Warnap1 = Odczyt2 / 50
    N = Warnap1                                                       'pomiar stanu baterii
    
    If N < 480 Then                                             'mniejsza od
    Toggle Cz
    Gosub Home
    End If
    
    If N > 682 Then                                             'wieksza od
    Toggle Zo
    Gosub Home
    End If
    
    If N > 480 Then                                             'wieksza od
    Set P1
    Reset Cz
    Reset Zo
    Reset Zi
    Gosub Program
    End If
    
    Loop
    
    
    
    Program:                                                    'pomiar usrednienie
                                                                ' 50 pomiarow
    Do
    Enable Timer0
    Odczyt2 = 0
    For Krok = 1 To 50
    Warnap = Getadc(3)
    Odczyt2 = Odczyt2 + Warnap
    Waitms 20
    Next Krok
    Warnap1 = Odczyt2 / 50
    N = Warnap1
    
    If Minutaa = 10 Then
    Minutaa = 0                                    'co 10 min skacz do wskazan
    Call Pomiar_nap
    End If
    
    Loop
    
    
    Sub Pomiar_nap:
    
    If Godzina = X Then
    Reset P1                                   'czas ladowania przekroczony
    Reset P2
    Gosub Zla_bateria2
    End If
    
    If N < 682 Then                 'bateria mniej niz zmien kolor diody czerwona
    Set Cz
    Reset Zo
    Reset Zi
    End If
    
    If N > 670 Then                      'bateria wiecej niz zmien kolor diody zolta
    Reset Cz
    Reset Zi                                    'przejdz na ladowanie mniejszym pradem
    Set Zo
    Reset P1
    Wait 5
    Set P2
    End If
    
    If N > 752 Then                    'bateria wiecej niz zmien kolor diody zielona
    Reset Cz
    Reset Zo
    Set Zi
    Godzinaa = 0
    Minutaa = 0
    Gosub 2faza
    End If
    
    End Sub
    
    
    
    
    
    
    
    2faza:                                           'ladowanie trwa dalej jeszcze godzine
    
    
    Do
    
    If Godzinaa = 1 Then
    Godzina = 0
    Minuta = 0
    Minutaa = 0
    Godzinaa = 0
    X = 10
    Gosub Pilnuj:
    End If
    Loop
    
    
    
    Pilnuj:                              'ladowarka laduje 10 min i 50 min przerwy
                                           ' ale tylko 10 godzin
    Do
    
    Set Pilnuje
    Toggle Pulse
    Odczyt2 = 0
    For Krok = 1 To 50
    Warnap = Getadc(3)
    Odczyt2 = Odczyt2 + Warnap
    Waitms 20
    Next Krok
    Warnap1 = Odczyt2 / 50
    N = Warnap1
    
    Reset P2
    Reset P1
    
    If Godzina = X Then                                         'naładowana koniec czasu
    Do
    Toggle Zi
    Reset P2
    Reset P1
    Loop
    End If
    
    If Minutaa = 50 Then                                        '50 przerwy w ladowaniu
    Minutaa = 0
    Gosub Doladuj
    End If
    
    
    Loop
    
    
    Doladuj:                                                    '10 min ladowania
    
    Do
    Set P2
    If Minutaa = 10 Then
    Minutaa = 0
    Gosub Pilnuj
    End If
    Loop
    
    
    
    
    
    
    
    
    Zla_bateria2:
    Reset P1
    Reset P2
    Reset Cz
    Reset Zo
    Reset Zi
    Reset Pulse
    
    Do
    Toggle Cz
    Toggle Zo
    Toggle Zi
    Toggle Cz
    Toggle Pilnuje
    Toggle Pulse
    Waitms 500
    Loop
    
    
    
    
    
    Timer0_int:
    
    Counter0 = Counter0 + 6
    Incr Licznik
    If Licznik = 500 Then
    Incr Sek
    Licznik = 0
    End If
    
    
    If Sek > 59 Then
    Incr Minutaa
    Incr Minuta
    Sek = 0
    End If
    
    
    
    If Minutaa > 59 Then
    Incr Godzinaa
    Incr Godzina
    Minutaa = 0
    End If
    
    Return
    
    
  • REKLAMA
  • #2 5608437
    Freddie Chopin
    Specjalista - Mikrokontrolery
    nouki napisał:

    Jeśli ustawie mu:
    cksel=0100 , sut=00 to nie działa program - nic sie nie dzieje.

    a jeśli ustawię:
    cksel=0100 , sut=10 wtedy działa ale źle liczy czas

    sprobuj wiec innych kombinacji tych fusebitow - np

    cksel=RT, a opt=FM
    cksel=ST, a opt=FW
    cksel=UT, a opt=FG

    kombinacji nie jest tak duzo - strzelaj dalej na slepo, w koncu zacznie dzialac [;

    4\/3!!
  • REKLAMA
  • #3 5608736
    nouki
    Poziom 25  
    hmmm nie musze bawic sie bo wiem ze powinno być tak :)
    cksel=0100 , sut=00 lecz nie działa.

    Link


    Proszę na przyszłość korzystać ze znaczników "[url]" , a nie wklejać kilometrowe linki.
    [zumek]
  • REKLAMA
  • #4 5609379
    wojnar
    Poziom 17  
    Jak masz ustawiony Int RC osc. to się nie dziw, że źle liczy czas.
    Daj kwarc, ustaw CKSEL=1110 albo CKSEL=1111 (Ext Crystal/Resonator High Freq).
    SUT (Start Up Timer) wybierz jakiś dłuższy czas dla startu.
  • REKLAMA
  • #5 5609974
    nouki
    Poziom 25  
    Tu nie chodzi o aż taka dokładność 20 min na 10h to w tym przypadku nic strasznego tylko o nie ruszanie programu:).
    na ustawieniach 2 liczy czas 2 min jako 1:38 min
    pierwsze ustawienia działają tylko na jednym z 5 procesorów jakie mam i jest w miarę dokładnie:) na pozostałych program nie startuje:)
    Wszytkie są nowe :)
  • #6 5610191
    Pijopic
    Poziom 17  
    Ustawienie SUT decyduje o starcie ukladu, a dokladnie o tym ile ma uklad czekac na start od wlaczenia zasilania i dlatego wpierw moze sprawdz co moze mieszac w lini zasilania a dopiero szukaj przyczyny w programie jak zasilanie bedzie OK.
  • #7 5610383
    nouki
    Poziom 25  
    zasilanie raczej ok L) pisałem ze ustawiając fuse bit ta: cksel=0100 , sut=00 działa tylko na jednym z 5 procesorów tej samej serii jak odczytałem z tego samego sklepu
  • #8 5610478
    Pijopic
    Poziom 17  
    Raczej nie znaczy napewno, a uwzgledniajac jeszcze fakt ze przy ustawieniu 00 masz wlaczony BOD, to bardzo prawdopodobne jest kiepskie zasilanie, nie mowie ze pewne, ale bardziej prawdopodobne jest to niz mozliwosc, ze ten sam program na jednym ukladzie bedzie zle dzialal a na innym dobrze...
REKLAMA