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

[atmega88][bascom] czasami pomija warunek IF THEN

armo1 02 Mar 2011 13:00 1618 13
REKLAMA
  • #1 9225079
    armo1
    Poziom 10  
    Mam taki mały dziwny problem ze sterownikiem na atmedze88 który ma sterować między innymi grzałką zależnie od temperatury, problem polega na tym że raz na kilka włączeń sterownika (czasem kilka razy pod rząd) sterownik przestaje włączać grzałkę a także nie wyświetla na wyświetlaczu G – która oznacza że właśnie grzałka jest włączona, po za tym wszystko inne działa normalnie, temperatura zmienia się na wyświetlaczu, pokazuje aktualną godzinę więc nie jest zawieszony. Funkcje pomiaru temperatury i funkcję termostatu realizuje w podprogramie do którego skakam z pętli głównej, oto on

    Kod: text
    Zaloguj się, aby zobaczyć kod

    Jeszcze jedna sprawa to że gdy wejdę w menu i wyjdę to funkcja termostatu się odwiesza. Robi to takie dziwne wrażenie jakby sterownik pomijał czasami te dwa warunki IF THEN? Proszę o jakieś wskazówki
  • REKLAMA
  • #2 9225247
    otapi
    Poziom 25  
    Prześledźmy kod....
    przyjmijmy ze:

    G=20
    temperatura jest 19
    sprawdzasz warunek
    If Temperatura(1) < G Then
    temp jest < G wiec załączasz grzałkę
    ale dalej zwiększasz G+1 więc G=20
    sprawdzasz następny warunek
    If Temperatura(1) >= G Then
    który też jest spełniony bo G=20 jest >=temperatura i wyłączasz grzałkę

    jak to zrobić? pomyśl jeszcze trochę podpowiem żeby użyć Elseif
  • REKLAMA
  • #3 9225319
    armo1
    Poziom 10  
    otapi napisał:
    Prześledźmy kod....
    przyjmijmy ze:

    G=20
    temperatura jest 19
    sprawdzasz warunek
    If Temperatura(1) < G Then
    temp jest < G wiec załączasz grzałkę
    ale dalej zwiększasz G+1 więc G=20
    sprawdzasz następny warunek
    If Temperatura(1) >= G Then
    który też jest spełniony bo G=20 jest >=temperatura i wyłączasz grzałkę

    jak to zrobić? pomyśl jeszcze trochę podpowiem żeby użyć Elseif


    dzięki za zainteresowanie, tylko mi się wydaje że chyba nie oto chodzi, bo tu się chyba pomyliłeś bo G + 1 będzie 21 a nie 20 (grzałka włączy się poniżej 20 a wyłączy przy 21 stopniach) a po za tym tak jak pisałem wcześniej wystarczy że wejdę w menu (nic tam nie zmieniam) i wyjdę i już termostat pracuje prawidłowo, dziś np. włączyłem sterownik i temperaturę miałem
    11 stopni a zadaną miałem 22 stopnie i też wystąpił ten błąd
  • #4 9225414
    otapi
    Poziom 25  
    hmm masz racje cos pokręciłem, ale myślę że tak było by lepiej:


    
     If Temperatura(1) < G Then 
          Portb.0 = 1 
          Locate 2 , 15 
          Lcd "G " 
      Elseif Temperatura(1) >= G+1 Then 
          Portb.0 = 0 
          Locate 2 , 15 
          Lcd "  " 
      End If 
    


    hmm przyszło mi coś do głowy, ten kod powinien działać więc... to tylko moje przypuszczenia, być może masz gdzieś zadeklarowaną jakąś zmienną, tablicę do której wpisujesz coś co wychodzi poza jej zakres i nadpisuje część pamięci w której jest zadeklarowana zmienna G, wyświetl G na LCD i zobacz jaką ona ma wartość w momencie wykrzaczenia programu. Być może wchodząc do menu odczytujesz konfiguracje zmiennych w tym G z eeproma w ten sposób je odświeżając.... ale jak pisałem to tylko moje gdybanie.
  • REKLAMA
  • #5 9225756
    armo1
    Poziom 10  
    dobra spróbuje jak piszesz, z eepromu odczytuje tylko podczas gdy się włączy sterownik przed wejściem do pętli głównej , a w menu następuje tylko zapis wszystkich zmiennych przed wyjściem
  • #6 9228510
    armo1
    Poziom 10  
    Wyświetliłem zmienną G i pokazała się liczba 255, jedna zagadka się rozwiązała bo w menu jest warunek że jeśli G jest większe od 35 to G = 22 i dla tego wejście w menu rozwiązywało problem. Zauważyłem jeszcze jedną ciekawą sprawę , problem występuje tylko przy dłuższym wyłączeniu sterownika (ponad kilka godzin) i tylko z tą jedną zmienną, może robię jakiś błąd przy odczycie bądź zapisie do eeprom? Wszystkie zmienne są typu byte
    odczyt:
    
           Readeeprom G , 1
           Readeeprom A1 , 2
           Readeeprom A2 , 3
           Readeeprom B1 , 4
           Readeeprom B2 , 5

    zapis:
    
           Writeeeprom G , 1
           Writeeeprom A1 , 2
           Writeeeprom A2 , 3
           Writeeeprom B1 , 4
           Writeeeprom B2 , 5
    
  • #7 9228742
    otapi
    Poziom 25  
    Tak jak wcześniej pisałem sprawdź deklarację zwłaszcza tablic, może masz tablicę np temperatura 8 elementową a wpisujesz do niej 9 elementów...? 9ty element zostaje wpisany w miejscu gdzie może być zadeklarowana np zmienna G.... ale bez kodu to tylko gdybanie, zadeklaruj G na samym początku wtedy nic jej nie nadpisze, ale to nie rozwiąże problemu do końca bo jeżeli jest tak jak myślę to coś innego może zostać zamazane.
  • #8 9228766
    armo1
    Poziom 10  
    Jestem w pracy nie mam jak wkleić całego kodu, ale nie mam żadnych tablic w programie
  • #9 9228779
    otapi
    Poziom 25  
    a Temperatura(1) to co to jest? ID DSa odczytujesz? to niby w czym je trzymasz? stringi jakieś jak masz określoną długość i coś z nimi robisz w trakcie działania programu....
  • #10 9228916
    armo1
    Poziom 10  
    fakt temperatura(1) to tablica, sam pomiar temp nie jest mojego autorstwa ,daje cały program:
    Kod: text
    Zaloguj się, aby zobaczyć kod
  • #11 9229191
    otapi
    Poziom 25  
    hmmm ciężko coś wywnioskować ze względu na małą czytelność kodu ( nazwy zmienny) ciężko wyczaić za co one odpowiadają, ale mimo to w zasadzie nie ma sie czego przyczepić jedyne miejsce w którym mogły by być jakieś zgrzyty to

    
            If P2 = 0 And I = 0 Then
            I = 1
            Incr G
            Locate 1 , 1
            Lcd G ; " - temperatura "
            End If
            If G > 35 Then
            G = 22
    


    jednak 2 if powinien wszystko naprawić nawet gdyby coś było nie tak....
    jeszcze jedna myśl jest taka - gdzieś kiedyś czytałem że nie zaleca się zapisywania danych pod 1 adres w eeprom bo moze być do czegoś używany przez procesor, nie pamiętam o co dokładnie chodziło ale jak nie ma innego pomysłu ta zawsze można sprawdzić i zapisać pod inny adres.
  • REKLAMA
  • #12 9229253
    piotr5000
    Poziom 21  
    Sprawdź czy jeżeli zamiast

    if Temperatura(1) < G then
    ....
    ....
    end if


    zastosujesz zmienną pomocniczą np. P
    i zrobisz tak

    P= G-Temperatura(1)
    if P > 0 then
    ...
    ....
    end if

    nie będzie działać prawidłowo ?
  • #13 9229334
    armo1
    Poziom 10  
    właśnie też czytam o eeprom i też spotkałem się z tym żeby pod adresem 1 nic nie wstawiać więc zmieniłem adres o jeden w górę i zobaczę czy to pomoże? Napotkałem jeszcze coś takiego przeszukując neta
    "Wrażenie uszkadzania
    początkowych komórek pamięci eeprom bierze się stąd, że procesor po
    załączaniu napięcia startuje już przy napięciu 1.8V, ładuje
    konfigurację z eeprom do ram przy napięciu VCC mniejszym od 2.7V, co
    skutkuje uszkodzeniem pierwszej, lub kilku pierwszych komórek pamięci.
    Efekt ten jest widoczny dla wolno narastającego napięcia zasilania
    połączonego z umieszczonym na początku kodu odczytem pamięci eeprom"
    może wstawie jakieś
    Kod: text
    Zaloguj się, aby zobaczyć kod
    przed odczytaniem eeproma?
  • #14 9241200
    elav
    Poziom 11  
    Witam

    Wstaw warunek że jeśli G jest większe od 35 to G = 22 nie w menu ale w głównym programie zaraz po odczycie "G" z eepromu.
REKLAMA