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

Samoistne zerowanie zmiennej

Mimitron 20 Mar 2010 18:21 1559 9
  • #1 7857376
    Mimitron
    Poziom 20  
    Witam.
    Zliczam sobie odcinki czasu i nagle program sam od siebie zeruje wynik i zlicza z powrotem od 0.
    Poniżej zamieszczam część programu odpowiedzialną za zliczanie, może ktoś ma pomysł czemu się tak dzieje?

    '****timer1********
    Config Timer1 = Timer , Prescale = 64
    On Timer1 Pomiar_czasu                                 
    Load Timer1 , 50
    Enable Timer
    Stop Timer1
    
    
    '*****wtrysk*****
    On Int1 Wtrysk
    Config Int1 = Change
    Disable Int1
    
    On Interrupts
    Enable Interrupts
    
    
    Dim Wart_spal As String * 6
    Dim Co_400us As Long
    Dim Spalone_paliwo As Single
    Dim Sekunda As Long
    
    do
    
    Spalone_paliwo = Sekunda * 0.0088
    Wart_spal = Fusing(spalone_paliwo , "#.&")
    Cls
    
    
    
    
    Locate 2 , 1
    Lcd Wart_spal 
    Wait 3
    
     Loop
    
    End
    
    
    
    
    Wtrysk:
    
    If Pind.3 = 1 Then
    
        Start Timer1                                            'wl timera
    
    End If
    
    If Pind.3 = 0 Then
    
    
       Stop Timer1                                              'wyłaczenie timera
    
    End If
    
    
    Return
    Pomiar_czasu:
    
    Incr Co_400us                                               'zwiększanie o jeden co 400us
    Load Timer1 , 50
     If Co_400us = 2500 Then
       Incr Sekunda
       Co_400us = 0
     End If
    Return
    
  • #2 7858310
    LED5W
    Poziom 34  
    Tego nie rozumiem:

    i nie wiem jak to kompilator rozumie.

    Chyba przypadkiem skasowało Ci się 1 przy "enable timer".

    Nie wiem, czy to jest dostępne w twoim uC:
    Config Int1 = Change


    Z kodu wnioskuję że taktowanie masz 8MHz.

    Przy jakiej wartości zmienna się zeruje?
    Możliwe, że uC się resetuje. Sprawdź to.
  • #3 7860203
    Mimitron
    Poziom 20  
    Tak kwarc to 8MHz i pisze w bascom.

    jest zbędne, mój błąd.

    Timer jest włączaniu w przerwaniu int1.
    
    
    Wtrysk:
    
    If Pind.3 = 1 Then
    
        Start Timer1                                            'wl timera
    
    End If
    
    If Pind.3 = 0 Then
    
    
       Stop Timer1                                              'wylaczenie timera
    
    End If
    
    
    Return

    Samo zliczanie czasu trwania stanu wysokiego na wejściu int1 działa poprawnie ,
    tylko co jakiś czas wynik się zeruje i nie jest zależny od tego do ilu dojdzie.
    Już kombinuje czy pomiar poziomu paliwa w baku przy wykorzystaniu ADC nie resetuje mi uC gdy pomiar wyjdzie poza zakres.
  • #4 7862074
    Mimitron
    Poziom 20  
    Teraz zauważyłem że to wina termometru, gdy zaczyna pokazywać głupoty w temperaturze zewnętrznej i wewnętrznej to zeruje się też pomiar spalonego paliwa.
    Jutro kupię nowe czujniki DS18B20 i zobaczymy co i jak. Już dostaję z tym apopleksji.
  • #5 7862259
    LED5W
    Poziom 34  
    Jeżeli nie używasz nigdzie indziej zmiennej "Spalone_paliwo" ani "Sekunda" to nie może się ona zerować. Chyba, że resetuje się µC.
    Możesz to sprawdzić podłączając LED lub buzzer do wolnego portu i włączyć go na sekundę na początku programu. Jeżeli LED zaświeci, albo buzzer zadźwięczy to znaczy, że µC się zresetował.

    Nie widzę sensu kupowania od razu nowych czujników, bo co ma piernik itd.
  • #6 7864003
    Mimitron
    Poziom 20  
    Wykorzystuje te zmienne do pomiaru ilości spalonego paliwa.
    Układ to komputerek do samochodu mierzący temperaturę, napięcie, spalone paliwo, sprawdzanie włączenia świateł, sygnalizujący włączenie alarmu zamiast diody i parę innych w przyszłości.
    Odłączyłem te czujniki, przejechałem 20 km i wygląda na to że wszystko gra, czyli któryś z nich może być uwalony.
    uC raczej się nie resetuje bo na początku programu jest powitanie a nie wyświetla się w momencie zerowania licznika spalonego paliwa.
    Problem polega na tym że nagle zerował się odczyt spalonego paliwa a temu zjawisku towarzyszy wskazanie temperatury np zew:0 a wew: -128 lub inne pierdoły
  • #7 7865175
    LED5W
    Poziom 34  
    Skoro µC się nie resetuje to coś musisz mieć nie tak w programie.
    Coś Ci musi zmieniać tą zmienną.
    Sprawdź całość programu.
    No chyba, że to kosmici. :P
  • #8 7865663
    Mimitron
    Poziom 20  
    Też zaczynam ich oskarżać :P
    Zmienne które są odpowiedzialne za pomiar spalonego paliwa nie występują nigdzie indziej, tylko tam gdzie napisałem i narazie obwiniam ds18b20 bo po ich usunięciu ładnie wszystko jest zliczane i nic się nie zeruje, a czemu to nie wiem.
  • #9 7866526
    ZbeeGin
    Poziom 39  
    Tu też masz błąd:
    Dim Wart_spal As String * 6
    Jesteś pewien, że zmieścisz się z wynikiem mnożenia w 4 cyfrach, z jednym przecinkiem i wartością dziesiętną?
  • #10 7866744
    Mimitron
    Poziom 20  
    Wynik jest zaokrąglany do jednego miejsca po przecinku.

    Wart_spal = Fusing(spalone_paliwo , "#.&") 


    Dokładność pomiaru do 100ml w zupełności wystarczy.

    Może źle kombinuje ale żeby zapełnić 6 liter musiał bym osiągnąć stan licznika spalania ponad 9999.9 litrów
REKLAMA