Wentylator + getrc na '51


witam

Chciałem zapytać czy ma kto doświadczenia praktyczne w wykorzystaniu tej funkcji. jestem w trakcie wykonania inteligentnego sterowania wentylatora. układ "sprawdza" wilgotność za pomocą prostego (rezystancyjnego) czujnika wilgoci i na tej podstawie wylicza czas wietrzenia i steruje wentylatorem. Praktycznie na sam koniec budowy zaczęły się dziać cuda. Wentylator zaczyna się załączać "kiedy chce" (i nie wiem czym to jest spowodowane). Jak wiadomo getrc (bascom 2051) wykorzystuje timer0, a do odmierzania czasu wykorzystałem timer1, i zastanawiam się czy z tego tytułu czegoś nie sknociłem. Zauważyłem że jeśli getrc było często wykorzystywane cuda występowały równie często, jeśli getrc wywoływane jest rzadziej problemy występują z mniejszą częstotliwością. Jeśli ktoś doświadczony będzie zainteresowany problemem proszę dać znać.




Portret użytkownika mirley

Re: Wentylator

Przedstaw jakiś kod do tego twojego projektu, żeby można było zerknąć

-

UWAGA! Możliwy jest zakup zaprogramowanych uC i zestawów elementów itp. do niektórych projektów. O dostępność proszę pytać via email. Konkretne oferty pojawiają się w cenniku.

Portret użytkownika kaktus

oczywiście $regfile =

oczywiście

$regfile = "89c4051.dat"
'$large
Config Timer0 = Timer , Gate = Internal , Mode = 1
Config Timer1 = Timer , Gate = Internal , Mode = 1
Config Lcd = 16 * 2
Config Getrc = 20
Priority Set Timer0
On Timer1 Chops
'Load Timer1 , t4150
Const Mno_cz = 5                                    ' punkt wilgoci przemnazamy przez ten czas i wychodzi czas wiania
Const Zwloka = 2                                    ' zwłoka (min) po której obliczy czas wiania i będzie możliwe off
Const T4150 = 4150
Counter1 = T4150
Enable Interrupts
Enable Timer1
Start Timer1
 
Dim Tik As Byte , Seku As Byte , Minu As Byte       'odmierzanie czasu
Dim Wynik As Byte , Wilgoc As Byte                  'wilgotnosc
Dim Switch As Byte , Wianie As Byte
Dim Onn As Bit
Dim Cos As Byte                                     'pierdoly
Wiatrak Alias P3.7
Mryg Alias P3.5

i teraz esencja

Do
  'Cos = Seku Mod 10
  If Seku = 0 Or Seku = 20 Or Seku = 40 Then
'     Cos = 1
     Reset Mryg
     Wynik = Getrc(p1.1)
 
     If Wynik > 238 Then : Wilgoc = 1
       Elseif Wynik > 221 And Wynik < 239 Then : Wilgoc = 2
         Elseif Wynik > 204 And Wynik < 222 Then : Wilgoc = 3
           Elseif Wynik > 187 And Wynik < 205 Then : Wilgoc = 4
             Elseif Wynik > 170 And Wynik < 188 Then : Wilgoc = 5
               Elseif Wynik > 153 And Wynik < 171 Then : Wilgoc = 6
                 Elseif Wynik > 136 And Wynik < 154 Then : Wilgoc = 7
                   Elseif Wynik > 119 And Wynik < 167 Then : Wilgoc = 8
                     Elseif Wynik > 102 And Wynik < 120 Then : Wilgoc = 9
                       Elseif Wynik > 85 And Wynik < 103 Then : Wilgoc = 10
                         Elseif Wynik > 68 And Wynik < 86 Then : Wilgoc = 11
                           Elseif Wynik > 51 And Wynik < 69 Then : Wilgoc = 12
                             Elseif Wynik > 34 And Wynik < 52 Then : Wilgoc = 13
                               Elseif Wynik > 17 And Wynik < 35 Then : Wilgoc = 14
                                 Elseif Wynik < 18 Then : Wilgoc = 15
       End If
     Set Mryg
    End If
  Locate 1 , 1 : Lcd Seku ; " " : Locate 1 , 5 : Lcd Minu ; " "
  Locate 2 , 1 : Lcd "wil:" ; Wilgoc ; " " : Locate 2 , 8 : Lcd "sw: " ; Switch ; " "
 
  If Wiatrak = 1 And Wilgoc >= Switch Then          'wilgoć wzrosnie do stanu niepożądanego
     Reset Wiatrak
     Gosub Zeruj_czas                               ' zacznij liczyć
    End If
  If Minu = Zwloka And Onn = 0 And Wiatrak = 0 Then       'gdy miną dwie minuty po załaczeniu wiatraka
       Onn = 1
       If Wilgoc > Switch Then : Cos = Wilgoc - Switch       'gdy wilgoć wzrosła lub się utrzymuje wysoko
          Else
           Cos = 0
         End If
       Wianie = Switch * Mno_cz                     'oblicza czas wiania
       Wynik = Cos * Mno_cz
       Wianie = Wianie + Wynik                      ' Ze Switcha + Ewentualna Korekta Wilgotności - gdy bardziej wilgotno wydłuży czas wiania
    End If
  If Wianie < Minu And Wiatrak = 0 Then             'wiatrak wentyluje a czas wiania upłynął
     Gosub Koniec_wia
    End If
  Decr Switch                                       'mała histereza
  If Wilgoc < Switch And Wiatrak = 0 And Minu >= Zwloka Then       ' wiatrak pracuje a wilgoś wywietrzona
     Gosub Koniec_wia
    End If
  Incr Switch
 
Loop
End
 
Koniec_wia:
  Set Wiatrak
  Onn = 0
  Gosub Zeruj_czas
Return
 
Zeruj_czas:
  Minu = 0
  Seku = 0
Return
 
Chops:
  Counter1 = T4150
  Incr Tik
  If Tik = 15 Then
       Tik = 0
       Incr Seku
    End If
  If Seku = 60 Then
       Seku = 0
       Incr Minu
    End If
  If Minu = 255 Then
       Minu = 0
    End If
    Start Timer1
Return

-

"Cierpliwym być musisz, by wiedzę zgłębiać tajemną, gdyż ciemna strona mocy niszczącą i silną jest.".

Portret użytkownika kaktus

schemat układu i płytka czujnika wilgoci który zmajstrowałem

schemat nie jest w 100% spójny z listingiem, gdy powstał problem program ewaluował, w opublikowanym listingu brakuje kawałka z odczytem dip switch-a i przesunięcia wyniku na środek 15-sto punktowej skali, bo taką rozpoznaje uP (co widać na listingu), wyświetlacz jest tylko i wyłącznie do celów diagnostycznych, gdy uda się rozwiązać problem wyświetlacz będzie zbędny i kod zmieści się wtedy do 2051.

no i czujnik który wykonałem na PCB,

problem dokładnie polega na tym, że (przykład):
próg załączenia wynosi np 6, uP rozpoznaje wilgotność na poziomie 1, a wiatrak jakimś czarodziejskim sposobem zostaje uaktywniony

-

"Cierpliwym być musisz, by wiedzę zgłębiać tajemną, gdyż ciemna strona mocy niszczącą i silną jest.".

Portret użytkownika mirley

Re: Wentylator

A po wywaleniu getRc i wstawieniu np wynik = jakaś stała wszystko jest ok? nie ma przypadkowego włączenia? Czemu wszystko masz bezpośrednio w do loop, może cały kod wykonuje się za szybko. Może się okazać że wynik będzie jednorazowo błędny, np masz rezultaty 1, 1,1,1,15,1,1,1.... i nawet nie zauważysz że coś jest nie tak.... zrób na timerze opóźnienie, albo chociaż jakiegos waita dodaj

-

UWAGA! Możliwy jest zakup zaprogramowanych uC i zestawów elementów itp. do niektórych projektów. O dostępność proszę pytać via email. Konkretne oferty pojawiają się w cenniku.

Portret użytkownika kaktus

problem rozwiązany

Quote:
A po wywaleniu getRc i wstawieniu np wynik = jakaś stała wszystko jest ok? nie ma przypadkowego włączenia?

przed dodaniem getrc było ok, ale dla testu wywaliłem ponownie i wszystko działało jak zaplanowałem

Quote:
Czemu wszystko masz bezpośrednio w do loop, może cały kod wykonuje się za szybko. Może się okazać że wynik będzie jednorazowo błędny, np masz rezultaty 1, 1,1,1,15,1,1,1.... i nawet nie zauważysz że coś jest nie tak.... zrób na timerze opóźnienie, albo chociaż jakiegos waita dodaj

no i tu myśleliśmy podobnie z tym że nowicjusz jestem, (doświadczenie dopiero zdobywam, to mój drugi projekt) owocem mojego myślenia było:

If Seku = 0 Or Seku = 20 Or Seku = 40 Then
     Reset Mryg
     Wynik = Getrc(p1.1)

seku to licznik sekund

z tym że dzięki koledze uświadomiłem sobie ze sekunda to cała wieczność dla uC - heheheeee
bo zacietrzewiłem się tym że po dodaniu leda który mrygał przy wykonywaniu pomiaru i jego klasyfikacji, obserwowałem lcd z wynikami i zastanawiałem się czemu to tyle trwa (pomiar), wyszło na to te w sekundowym okienku pomiar był wykonywany wielokrotnie i tak jak sugerowałeś przy błędnym pomiarze nawet go nie zauważyłem na LCD.
Problem został definitywnie rozwiązany po doświadczalnym dobraniu parametru Config Getrc, co mnie trochu zdziwiło ze przy kondensatorze 2n2 mój układ stabilnie działa przy wartości 30 (domyślnie ta wartość ustawiona jest na 10 bądź 20 - różne źródła różnie podają, a kondensator dobrany na 10n, jest to stała czasowa na naładowanie się kondensatora).
Stabilną pracę i prawidłowe wyniki otrzymywałem jeśli pomiar nie był wykonywany częściej niż co 1 sek.

W chwili obecnej dopracowuję dodatkową funkcję: załączanie zewn. przyciskiem/załącznikiem, z wyborem praca czasowa, lub tryb "ręczny",
powinno się dać upchnąć w 2KB po wywaleniu wyświetlacza, a jak starczy miejsca to wsadzę drugi dip switch do wyboru czasu przy pracy czasowej. Wyjdzie całkiem niezły kombajn ((-; .
Na czas obecny układ potrafi odczytać z ośmiopunktową precyzją nastawienia usera, i odpowiednio zareagować przekładając je na piętnastostopniową skalę wilgotności jaką zmierzy, po czym po dwuminutowym wentylowaniu sprawdza ponownie wilgotność i wylicza czas pracy wentylatora bazując znowu na piętnastopunktowej skali, podstawą w tej chwili jest pięć minut. Wiatrak zostaje wyłączony po upłynięciu wyliczonego czasu, bądź opadnięciu wilgotności poniżej ostawień usera, z jednopunktową histerezą.
Nastawy te muszę potestować w praktyce i odnieść choć orientacyjnie do higrometru.

Podziękowania za poświęcenie swojego czasu dla mnie, dla Panów mirley z tego forum oraz browar z poza forum.
może się moje uwagi komuś przydadzą w przyszłości - kaktus

-

"Cierpliwym być musisz, by wiedzę zgłębiać tajemną, gdyż ciemna strona mocy niszczącą i silną jest.".