Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

[BASCOM] Wyświetlanie kilku alarmów na raz

Mad Jaro 11 Lip 2012 15:48 1615 19
  • #1 11 Lip 2012 15:48
    Mad Jaro
    Poziom 16  

    Mam napisaną taką obsługę wyświetlania:

    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod


    Mam tam jak widzisz zrobione trzy flagi alarmów:
    oil
    bat
    glaze

    i odpowiednio do nich case 5, case 6, case 7

    I teraz wszystko jest w porządku do puki włącza się tylko jeden alarm, wtedy na LCD miga mi co sekundę na zmianę napis alarmu (case 7) i zapamiętana pozycja wyswietlacza Cas (od 0-4)

    Sprawa komplikuje się gdy włączone są 2 lub 3 alarmy. wtedy w sekundę przelatują mi te 3 wartości (case 5,6,7) i zapamiętana pozycja wyświetlacza Cas (od 0-4)

    Chciałbym to rozwiązać tak, aby w przypadku jednego alarmu pojawił się np:
    1sek napis alarmu (case 5)
    2sek zapamiętana pozycja wyświetlacza Cas (od 0-4)
    3sek napis alarmu (case 5) i tak w kółko

    W przypadku 2 i 3 alarmów analogicznie:
    1sek napis alarmu (case 5)
    2sek zapamiętana pozycja wyświetlacza Cas
    3sek napis alarmu (case 6)
    4sek zapamiętana pozycja wyświetlacza Cas
    5sek napis alarmu (case 7)
    6sek zapamiętana pozycja wyświetlacza Cas
    5sek napis alarmu (case 5) i tak w kółko

    Nie wiem jak sobie z tym poradzić.

    0 19
  • #2 11 Lip 2012 16:08
    MArSTER_1
    Poziom 18  

    Czy zamiast struktury select case nie mógłbyś napisać po kolei trzech takich bloków, oczywiście dla każdego alarmu inny napis.

    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod

    0
  • #3 11 Lip 2012 17:12
    Mad Jaro
    Poziom 16  

    Procedury wait kompletnie odpadaja, opozniaja program, pozatym mam tam przerwania i zaklucaly by mi odczyty. Ogolnie jest to prosty program z prostym wyswietlaniem na select case wlasnie. Case 0 pokazuje temperature oleju, case 1 temp powietrza, case 2 paliwo, case 3 napiecie, case 4 obroty. Normalnie podczas pracy operuje tylko na tych case'ach od 0 do 4. Przelaczam miedzy nimi przyciskiem (mam tylko jeden przycisk). Natomiast case od 5 do 7 pojawiac maja sie tylko gdy spelniony jest warunek i flaga aktywna. Gdy pojawia sie jeden alarm czyli flaga_alarm_oil i case pozostawione bylo powiedzmy na 2 to po prostu miga mi na przemian: case 2, case 5.....
    Zas gdy sa dwie flagi alarmow i wiecej to przelatuja wszystkie naraz a potrzebuje aby migaly na przemian tak jak pisalem wczesniej.
    Sory ze tak mieszam ale ciezko to tak wytlumaczyc w slowach.

    0
  • #4 11 Lip 2012 17:21
    MArSTER_1
    Poziom 18  

    Co 100 milisekund wywołujesz podprogram wyświetlania! Jeśli jest jeden alarm to ten alarm jest wyświetlany cały czas ( a przynajmniej przez 1 sekundę). Skolei co 1 sekundę wywołujesz sprawdzenie alarmów. Gdybyś wyświetlanie przeniósł do pętli głównej to program krążył by sprawdzając flagi i wyświetlając odpowiednie komunikaty. Instrukcja Wait nie blokuje wykonywania przerwań, więc nadal co sekundę badał byś alarmy w przerwaniu od Timera.

    0
  • #5 12 Lip 2012 16:28
    Mad Jaro
    Poziom 16  

    Czyli mówisz cały sekect case display_lcd przenieść do pętli głównej ?

    I wtedy napisać tak:

    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod


    Ale czy te waity nie będą zatrzymywać programu ?

    0
  • #6 12 Lip 2012 16:49
    MArSTER_1
    Poziom 18  

    Sugerował bym abyś struktury Select Case nie przenosił a po prostu usunął podprogram wyświetlania. Czyli zrezygnował z podprogramu Disp_Lcd.
    W pętli głównej zaś wyrzucić sprawdzanie, czy minęło juz 100 milisekund. No i do petli głównej wstawić TRZY warunki If then. Takie jak opisałem dla alarmu od oleju. Musisz powielić te warunki jeden pod drugim i zmienić teksty wyświetlane. Raz będzie to "temp_oil"
    w drugim If bedzie to "alarm_bat"
    w trzecim If będzie to "alarm_glaze".
    Oczywiście każdy z IF musi mieć inny warunek. Pierwszy IF bedzie miał warunek taki jak napisałem czyli Flaga_alarm_oli
    drugi będzie miał warunek Flaga_alarm_bat
    trzeci będzie miał warunek Flaga_alarm_glaze.
    Instrukcje Wait będą zatrzymywać program główny na wyświetlanym tekście. Nie będą zatrzymywać Timera i badania alarmów. Alarmy zawsze będą badane co 1 sekundę tak jak masz teraz.

    0
  • #7 12 Lip 2012 16:55
    Mad Jaro
    Poziom 16  

    Rozumiem, ale co z moimi pozostałymi wyświetlaniami, wspominałem wcześniej, że mam jeszcze case od 0 do 4 i je przełączam przyciskiem. A gdy wyrzucę mój select case display_lcd to nie będę miał możliwości ich wyświetlania...

    0
  • #8 12 Lip 2012 17:06
    MArSTER_1
    Poziom 18  

    Czy twoja obsługa zwiekszania zmiennej cas jest zawarta w obsłudze przerwania PrzTimer0?
    Bo nie widzę Return. Mógłbyś uzupełnić?

    0
  • #9 12 Lip 2012 17:37
    Mad Jaro
    Poziom 16  

    Nie, wkradł się błąd jednak. Poprawny kod:

    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod

    0
  • Pomocny post
    #10 12 Lip 2012 18:15
    MArSTER_1
    Poziom 18  

    Do pętli głównej przenieś w takim razie fragment struktury Select Case a zmienną niech będzie cas.Wartości jedynie od 0 do 4. Dlatego, że pozostałe wartości będą wyświetlane z instrukcji If then (alarmy). Do każdego jednak warunku case musisz wstawic Wait 1. Inaczej informacja wyświetli się na czas tak mały, że jej nie zauważysz.

    Ta strukturę Select Case cas uruchamiaj jedynie wtedy warunkiem If then gdy nie bedzie ustawiona jakakolwiek flaga alarmu.

    0
  • #11 12 Lip 2012 19:23
    Mad Jaro
    Poziom 16  

    Trochę się zagmatwałem, jak miałbyś chwilkę przybliżyć coś w kodzie.

    0
  • #12 12 Lip 2012 20:47
    MArSTER_1
    Poziom 18  

    [code]

    Kod: vb
    Zaloguj się, aby zobaczyć kod


    Program ma jeszcze wadę związaną z obsługą timera badającego alarmy. W skrajnym przypadku alarmy mogą być badane nie co 1 a co 3 sekundy. Ale to można zrobić później. Spróbuj czy zadziała. Nie wiedziałem jakiego procesora używasz więc wstawiłem ATmega 32.

    Dodano po 8 [minuty]:

    Dopiero zauwazyłem, że co 100 ms wywołujesz podprogram Button wobec czego warunku tak nie można wyciąć bo nie będziesz mógł wywołać tego podprogamu. Zaraz coś zaproponuje.

    Dodano po 1 [minuty]:

    Jakiej częstotliwości masz kwarc i jaki procesor?

    0
  • #13 13 Lip 2012 06:53
    Mad Jaro
    Poziom 16  

    Kwarc wewnetrzny atmegi16 czyli 8000000. Button sprawdzam co 100ms aby szybko reagowal na wcisniecie. Wczesniej jak mialem co 1s to przelaczal za wolno.

    0
  • #14 13 Lip 2012 09:31
    MArSTER_1
    Poziom 18  

    Aby ten program, który napisałem zadziałał, trzeba urchomić dwa Timery. Timer0 do odliczania 100 milisekund a Timer1 do odliczania 1 sekundy. Czy można użyć Timera1 czy planujesz jego użycie do czegoś innego?

    0
  • #15 13 Lip 2012 09:56
    LordBlick
    VIP Zasłużony dla elektroda

    MArSTER_1 napisał:
    Aby ten program, który napisałem zadziałał, trzeba urchomić dwa Timery. Timer0 do odliczania 100 milisekund a Timer1 do odliczania 1 sekundy.
    Albo tylko 1 timer cyklicznie co 100 ms i liczymy do 10... ;)

    0
  • #16 13 Lip 2012 11:05
    MArSTER_1
    Poziom 18  

    Można spróbować z jednym timerem. Ale wtedy było by więcej zmian w programie. Dlatego, że co każde przerwanie (co 100ms) wykonywała by się obsługa przycisku a co 10 przerwań także obsługa odczytania alarmów. Czyli istniejące teraz dwa podprogramy trzeba by było połączyć w jedną obsługę przerwania od timera0 lub timera1. Jeśli zaś program ma nie korzystać z Timera1 to można go przejąć i odpowiednio napisane już podprogramy obsługi przycisku i pozyskania alarmów zrobić podprogramami ale obsługi przerwań od naciśnięcia przycisku (Timer0) i pozyskania alarmów (Timer1). Decyzja należy do zakładającego temat.

    0
  • #17 13 Lip 2012 16:20
    Mad Jaro
    Poziom 16  

    Sprawa jest tego typu, że Timer1 mam już użyty do Capture na ICP.

    0
  • #18 13 Lip 2012 17:45
    MArSTER_1
    Poziom 18  

    No to pozostaje Timer0.

    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod


    Spróbuj wgrać ten program ale bez zmiennych, które musiałem dołożyć aby u mnie program się skompilował. Jak widzisz zostawiłem deklaracje podprogramów z instrukcjami Return. To po to abyś nie musiał odznaczać komentarzem deklaracji podprogramów. Jeśli zechcesz to wyrzucić to będziesz musiał usunąć deklaracje podprogramów u siebie w programie.

    0
  • #19 16 Lip 2012 16:44
    Mad Jaro
    Poziom 16  

    Zobaczcie, a gdyby zastosować takie warunki ?

    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod


    Tylko martwią mnie te wait w instrukcji wait wyrażnie napisano:
    "Instrukcja wstrzymuje działanie programu na podaną ilość sekund"
    Czyli program się zatrzyma...a tego chce uniknąć, ponieważ rozjedzie mi się reszta.

    0
  • #20 16 Lip 2012 18:22
    MArSTER_1
    Poziom 18  

    Czy w pętli głównej masz coś jeszcze? Czy tylko te instrukcje, które ci napisałem? Jeśli nie potrzebujesz pętli głównej do innych funkcji to nic ci się nie zatrzyma, gdyż przerwania wykonują się z określonym rytmem. Niezależnym od instrukcji Wait. Jeśli zaś używasz jeszcze pętli głównej do czegoś innego, to można to przeprogramować, ale musisz napisać co jeszcze ma robić pętla główna.

    0