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

BASCOM - Wyjście z podprogramu i niechciane ponowne wejście do niego

lukasixthm 31 Paź 2014 23:12 1128 7
REKLAMA
  • #1 14091312
    lukasixthm
    Poziom 23  
    Witam. Mam problem z kodem w bascomie. W skrócie opiszę co ma robić.
    W pętli głównej bada jaka liczba przychodzi przez RS232 (A = Inkey() ).
    Jeżeli jest to 87 to wtedy ma wyskoczyć do procedury/podprogramu o nazwie "Lowandslow".
    Tam na chwilę ustawia piny od B.4 do B.7 na "1" i załączane zostają przekaźniki spuszczania powietrza z czterech poduszek.
    Później załączane są przekaźniki pompowania tych samych poduszek B.0 do B.3.
    Tu zaczyna się pętla procedury w której sprawdzane jest ciśnienie w każdej z poduszek (pomiar adc). Jeżeli wartość napięcia już przekroczyła cyfrowe 580 to zakończ pompowanie poduszki i ustaw flagę napompowania (LP, LT, PP, PT).
    Po napompowaniu wszystkich czterech ustaw flagę Koniec=1 i wyskocz z pętli Do...Loop Until Koniec = 1

    Lcd jest do poglądu flag i wartości z adc (które narazie zmieniam potencjometrem). Wskazania prawidłowe, flagi LP, LT, PP, PT ustawiają się kolejno na "jedynki" i przy ustawieniu ostatniej program wychodzi z procedury i zaczyna ją jeszcze raz.

    Problem polega na tym że po napompowaniu wszystkiego i wyskoczeniu z procedury program wchodzi do niej jeszcze raz, pomimo tego że wartość A jest wyzerowana.... Kombinowałem na różne sposoby i zamieszczam moim zdaniem najsensowniejszy.

    Może ktoś ma jakiś świeży pomysł....


    Kod: text
    Zaloguj się, aby zobaczyć kod
  • REKLAMA
  • #2 14091700
    Kuniarz
    Moderator Projektowanie
    Analiza cudzego programu to koszmar :) Kilka uwag:
    - zmienne "leweprzod" i pozostałe daj typu WORD, ponieważ ADC zwraca wartość 0-1023, więc po co tam pakować Integer
    - zmienna A spokojnie jako BYTE
    - spróbuj użyć aliasów zamiast "reset portb.0" dajesz "reset lewyprzod", możesz wówczas zrezygnować ze zmiennych bitowych np. LP, bo to sobie odczytasz ze stanu portu.

    Nie pamiętam, czy po INKEY kasuje się bufor UART, być może cały czas odczytuje Ci ten znak.
    Jesteś pewny, że wysyłasz go tylko raz ?
    Pomogłem? Kup mi kawę.
  • REKLAMA
  • #3 14092423
    yokoon
    Poziom 29  
    Witam.
    Uważam, iż wartość Timer1=64700 wpisana w sub programie Cols powinna być najpierw wpisana w programie głównym.

    Skąd taka wartość ?
  • REKLAMA
  • #4 14092842
    lukasixthm
    Poziom 23  
    Kuniarz napisał:
    Analiza cudzego programu to koszmar

    Tak wiem :) dlatego jak najwięcej opisałem słownie :)
    Kuniarz napisał:
    Nie pamiętam, czy po INKEY kasuje się bufor UART, być może cały czas odczytuje Ci ten znak.
    Jesteś pewny, że wysyłasz go tylko raz ?


    Nie kasuje się, stąd też na samym początku procedurki Lowandslow do A przypisywane jest 0 (A=0). Daną wysyłam na pewno jeden raz. Program wskakuje do Lowandslow i zmienna A dostaje już na wejściu wartość 0.
    Co do typów zmiennych to racja, rozrzutny jestem :) Ale to nie źródło problemu... Poprawię.


    yokoon napisał:
    Uważam, iż wartość Timer1=64700 wpisana w sub programie Cols powinna być najpierw wpisana w programie głównym.


    To jest obsługa przerwania od Timera1. Wartość 64700 to wartość licznika dobrana wstępnie. Chciałem żeby adc było możliwie szybko odczytywane. Odczyt ADC w pętli Do...Loop Until podprogramu Lowandslow również działał, ale myślałem, że to za wiele do roboty na podprogram i dałem do obsługi Timera.

    Gdyby coś było nie jasne to pytajcie. I dzięki za zainteresowanie problemem.
  • #5 14092865
    yokoon
    Poziom 29  
    Mimo wszystko dopisz w programie głównym Timer1=64700.
    W pod programie pozostaw.
  • #6 14102987
    lukasixthm
    Poziom 23  
    Nadal nikt nie ma świeżego spojrzenia na sprawę? Wciąż po spełnieniu warunku wyjścia z procedury wraca do niej na chwilę... Mimo że warunki wejścia (A=87) nie są spełnione...
  • #7 14103678
    Kuniarz
    Moderator Projektowanie
    Mień Inkey na Waitkey, zmień definicje zmiennych i wklej kod po modyfikacjach.
    Program nie może "wrócić na chwilę" do procedury...
    Upewnij się jeszcze na sto procent, czy wysyłasz jeden znak po UART.
    Pomogłem? Kup mi kawę.
  • REKLAMA
  • #8 14105132
    Fredy
    Poziom 27  
    proponuje ci dać printa w pętli głównej aby podglądnąć co procesor czyta z UARTA.
    Może się zdarzyć że czytasz śmieci i przy takiej pętli co się kręci miliony razy na sekundę ciągle się trafia przypadkowy znak 87.

    Albo wyślij inny znak i zobacz czy procesor czasem na niego też nie zareaguje, jeśli tak to masz pewność że jest coś nie tak sprzętowo. Albo prędkości transmisji są złe, albo inne ustawienia UARTA np ilości bitów, bity stopu itp. Może masz zanegowany sygnał RS232?

    Tak jak pisał kolega, może wysyłasz nie jeden znak, lecz wiecej.
    Możesz dodać za odczytem znaku , pętlę w której będziesz czytał do czasu gdy znak odczytany będzie zero. Wtedy masz pewność że nic w buforze nie czeka.

    A na koniec - poczytaj sobie o przerwaniach z UARTU.
    Tu aż się prosi w pętli głownej uśpić procesor, a tylko w przerwaniu analizować znak lub lepiej ciąg znaków z jakąś sumą kontrolną.
REKLAMA