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

[BASCOM] Jak przyśpieszyć program - przerwania

Mad Jaro 18 Mar 2011 13:38 2918 29
  • #1 9291316
    Mad Jaro
    Poziom 16  
    Mam napisany program, który obsługuje pomiar temperatury oraz napięcia.

    Problem polega na tym, że umieszczając w pętli głównej procedurę odczytu temperatury z opóźnieniem (w przypadku DS18B20 jest to minimum 750ms) pomiar napięcia w podprogramie jest również wyświetlany z takim opóźnieniem.

    Da się tego uniknąć?
    Jak zrobić, aby pomiar napięcia i inne podprogramy były odczytywane powiedzmy co 50ms, a pomiar temperatury co 750ms?
  • #2 9291349
    janbernat
    Poziom 38  
    Wziąć timer i ustawić przerwanie np. co 50ms.
    W przerwaniu ustawić dwie- albo więcej flag.
    W pętli głównej sprawdzać czy flaga ustawiona.
    Jeśli tak- to wykonujemy coś co ma być wykonane co 50ms i skasować pierwszą flagę.
    Potem sprawdzać drugą flagę i zwiększać o 1.
    Jak osiągnie 750ms to odczytać temperaturę i ustawić żądanie pomiaru.
    Skasować drugą flagę.
  • #3 9293039
    Mad Jaro
    Poziom 16  
    Nie wiem czy dobrze kobinuję, przy takiej konfiguracji bardzo szybko odświerza mi LCD prawie nic nie widać.

    Nie wiem też jak ugryść wyświetlanie poszczególnych podprogramów jednym przyciskiem. Zastosowałem skoki opisywane Tutaj


    Kod: text
    Zaloguj się, aby zobaczyć kod
  • #4 9296524
    Mad Jaro
    Poziom 16  
    Nikt nic nie pomoże ?

    Chcę zrobić tak, żeby po przyciskaniu przycisku na wyświetlaczu pojawiały się kolejne wyświetlenia Case'ów. Case 1 temperatura, Case 2 Napięcie z zapętlaniem do początku po przełączeniu wszystkich.

    Czasy odświeżania prawdopodobnie mi działają, lecz program wgrany w tej postaci wyświetla jedynie na 2 sekundy powitanie Temp Nap i potem już tak jakby Case 1 ale miga strasznie szybko nie da się odczytać.

    Kod: text
    Zaloguj się, aby zobaczyć kod
  • Pomocny post
    #5 9296760
    jan1996
    Poziom 24  
    Aby ci nie mrygał wyświetlacz nie robisz cls tylko możesz nadpisywać teksty
    np.
    Kod: text
    Zaloguj się, aby zobaczyć kod

    zamiast
    Kod: text
    Zaloguj się, aby zobaczyć kod

    a tu masz fragment z trybami menu

    Kod: text
    Zaloguj się, aby zobaczyć kod

    i oczywiście
    Kod: text
    Zaloguj się, aby zobaczyć kod
  • #6 9296817
    Mad Jaro
    Poziom 16  
    A czy przy takim zapisie:
    Kod: text
    Zaloguj się, aby zobaczyć kod

    Będzie mi się odświeżała zmienna Wart_nap2 ? Tak aby wynik z napięcie był odświeżany co 100ms (zmienna obliczana w przerwaniach)

    Jeśli nie to jak to najlepiej rozwiązać ?
  • #7 9296880
    jan1996
    Poziom 24  
    tak nawet większa ale tego nie będzie widać bo dany tekst jest nadpisywany ale trzeba pamiętać że przy tej metodzie tekst i tekst który nadpisujemy musza mieć taką samą ilość znaków więc musisz zrobić np. coś takiego
    Kod: text
    Zaloguj się, aby zobaczyć kod
  • #8 9297028
    Mad Jaro
    Poziom 16  
    Właśnie zastanawiam się jak to najprościej rozwiązać. A zerkałeś może jeszcze na ten poprzedni kod z tym jednoprzyciskowym menu gosub ?
  • #9 9301235
    Mad Jaro
    Poziom 16  
    Kurcze nie wiem jak to rozwiązać.

    Najwięcej trudności mam z tym wyświetlaniem i odświeżaniem wyniku na LCD.

    Potrzebował bym pomocy jak zrobić, aby akcje przycisku były zczytywane co 4ms.

    Następnie pomiar temperatury był zczytywany co 1s, i wyświetlany na LCD, odświeżanym co 1s.

    Pomiar napięcia byłby zczytywany z przetwornika co 100ms i wynik wyświetlany na LCD, odświeżanym co 1s. (wynik na LCD będzie tylko pogodowy dlatego odświeżanie co 1s, ważniejszym dla mnie jest zczytywanie z przetwornika co 100ms ponieważ potrzebuję szybkiego wyniku do dalszego przetwarzania)

    Przycisk jest tylko jeden, ma służyć do przełączania między wyświetlaniem pomiaru napięcia, a pomiarem temperatury w kółko.

    Jak to rozwiązać ? prośba o jakieś kawałki kodu.
  • #10 9301760
    jan1996
    Poziom 24  
    Co do odświeżania masz gotowy kawałek w moim drugim poście. Po co sprawdzanie stanu przycisku co 4 ms? Jak chcesz pomiar temperatury co 1s, to dorzucasz odpowiednio skonfigurowane przerwanie z timer1. Zczytywanie co 100ms masz przecież zrobione flagą chyba że nie działa. co do przyciska masz w moim pierwszym poście. Jeżeli coś jest nie zrozumiałe to pisz co.
  • #11 9301822
    ^Rachel
    Poziom 21  
    Jak przyśpieszyć ? To proste ! Naucz się C i w nim napisz, albo lepiej w assemblerze. Te uC programowane w BASCOMIE są takie zamulone...
  • #12 9309016
    Mad Jaro
    Poziom 16  
    Nie wiem czy dobrze ustawiłem dim'y Wyswietlanie,Trybprzycisk, Trybpomocnicza1 mają być Byte ?

    W takim układzie przyciski będzie zczytywało co 4ms, ale co z odświerzaniem LCD co 100ms i 1sek ?

    Aha i gdzie mam określić port przycisku PORTA.7.

    Kod: text
    Zaloguj się, aby zobaczyć kod
  • #13 9309191
    ^Rachel
    Poziom 21  
    Mad Jaro napisał:
    Nie wiem czy dobrze ustawiłem dim'y Wyswietlanie,Trybprzycisk, Trybpomocnicza1 mają być Byte ?

    W takim układzie przyciski będzie zczytywało co 4ms, ale co z odświerzaniem LCD co 100ms i 1sek ?

    Aha i gdzie mam określić port przycisku PORTA.7.


    Mogą być typu byte ale po co? z tego co widzę to zmienna Trybprzycisk przyjmuje tylko dwa stany prawda lub fałsz, więc lepiej zastosować tu typ bit, ale zreszta co Ci tam zależy, posiadając 16kB pamięci jedna zmienna typu byte w tą czy w tamtą nie robi różnicy, gorzej jak tej pamięci zacznie brakować...

    Cytat:

    Aha i gdzie mam określić port przycisku PORTA.7.


    gdzieś na początku programu, tam gdzie deklarujesz te wszystkie zmienne. Zaraz za tym wpisz na PINA.7 jedynkę logiczną, aby przyciskiem zwierać go do masy.
  • #14 9312689
    jan1996
    Poziom 24  
    wyświetlanie byte chyba że masz 2 tryby tylko to wtedy bit
    Trybprzycisk, Trybpomocnicza1 to bit a i wyświetlanie musisz dorzucić w twoim przypadku zamiast poz_menu i zmienić case 1: na case 0: i case 2: na case 1:
  • #15 9320142
    Mad Jaro
    Poziom 16  
    Pozmieniałem teraz kod wygląda tak:
    Kod: text
    Zaloguj się, aby zobaczyć kod


    Niestety po uruchomieniu, wyświetla się powitanie na 2 sekundy i pusty LCD, przyciskanie przyciskiem nie przynosi efektu.
  • #16 9321952
    jan1996
    Poziom 24  
    musisz jeszcze przypisać trybprzycisk do przycisku czyli piszesz na początku pętli
    trybprzycisk=pinX.X
  • #17 9324486
    Mad Jaro
    Poziom 16  
    Dodałem Trybprzycisk=PINA.7 bo na tym porcie mam przycisk, niestety dalej nic to samo pusty LCD.

    Dodałem na początku pętli, próbowałem też na początku programu bez skutku.
  • #18 9325153
    jan1996
    Poziom 24  
    durny błąd
    Nap: 
          Wart_u2 = Getadc(4) 
          U2 = Wart_u2 * 0.004887585533 
          V2 = U2 * 4.83 
          Wart_nap2 = Fusing(v2 , "#.#" ) 
          Wart_nap2 = Format(wart_nap2 , "     ") 
    Return 'to wywalić
    
    Select Case Wyswietlanie 
        Case 0: 
  • #19 9325220
    Mad Jaro
    Poziom 16  
    A przy Temp: tez wywalić return ?
  • #20 9325584
    jan1996
    Poziom 24  
    nie tylko tam bo return powoduje po wykonaniu danej etykiety powrót i dalsze wykonywanie programu a tam program kończył się wykonywać
  • #21 9328962
    Mad Jaro
    Poziom 16  
    Poprawiłem, po usunięciu return faktycznie zadziałało.

    Teraz mam problem z wyświetlaniem wyniku, przykładowo jeśli jestem na wyświetlaniu Nap, podłączam baterie 1,4V wynik wyświetla się, ale po odłączeniu baterii dalej zostaje 1,4V. Dopiero po przełączeniu na Temp i znów na Nap pokazuje 0.0V.

    Jak zrobić, żeby wynik na bieżąco był odświeżany i zczytywany z przetwornika. Wydaje mi się, że przez usunięcie tego Return wynik teraz zczytywany jest z przetwornika tylko raz.

    To samo mam z temperatura, wynik zmienia się jedynie, gdy przełączę na chwile na Nap i z powrotem na Temp.
  • #22 9338831
    jan1996
    Poziom 24  
    ni w ząb nie wiem co to może być to z reszta dość dziwne bo skoro nie działa i jedno i drugie to sugeruje to że to kod z wyświetlaniem lub przyciskiem a i przyciski i wyświetlanie w nap ma ok kod
  • #23 9339400
    Mad Jaro
    Poziom 16  
    Rozwiązałem ten program, błędy wynikały z mojej nieuwagi.

    Teraz mam problem z wyświetlaniem, próbuję korzystać z tego warunku, ale nic to nie daje:

    Kod: text
    Zaloguj się, aby zobaczyć kod

    Wynik dalej jest taki jak przed (znaki z poprzedniego case nie zostają zmazane)
  • #24 9340410
    jan1996
    Poziom 24  
    bo nie jest on dostosowany do liczb ułamkowych można go łatwo zmodyfikować napisze ci go tylko podaj jaka dokładność jest tzn. ile liczb po przecinku
  • #25 9341560
    Mad Jaro
    Poziom 16  
    Miałby wyświetlać liczby w zakresie od 0.0 do 20.0

    Wyświetlacz jest 2x8 znaków w dolnej linii ma być wynik w postaci:
    _ _15.4V_ lub _ _ _5.3V_

    A jeszcze mam takie pytanko o zaokrąglenia ponieważ funkcja ROUND nie do końca prawidlowo działa.

    Powidzmy otrzymuję wynik liczbowy z przetwornika ADC, dzielę go przez powiedzmy 3 i mnożę przez 100. Liczba po przeliczeniu to powiedzmy 325.4286.
    Jeśli zastosuję na tej liczbie funkcje ROUND mój wynik to 325.0 Nie mam pojęcia jak się pozbyć tej kropki i zera.
  • #26 9413018
    Mad Jaro
    Poziom 16  
    Może ktoś inny wie jak rozwiązać ten problem ?
  • #27 9416757
    asembler
    Poziom 32  
    Ustaw kursor na kropce i wyświetl dwie spacje :-)
  • #28 9420277
    Mad Jaro
    Poziom 16  
    Czyli po prostu jak mam w pierwszej linii i prewreszej pozycji ta wartość to tylko dopisuje pod spodem:
    Kod: text
    Zaloguj się, aby zobaczyć kod
  • Pomocny post
    #29 9420511
    Konto nie istnieje
    Poziom 1  
  • #30 9469409
    Mad Jaro
    Poziom 16  
    Dzięki emarcus pomogło.
REKLAMA