Witam
Utknąłem z moim kodem i plątam sie w koło ciągle, dlatego proszę o pomoc.
W podprogramie "przyciski" przerwania od timer0 mam zrealizowany odczyt przycisków i zrobiłem sobie "flagi czasowe"
Główny mój problem polega na tym, że chciałbym odczytać np. w procedurze lub podprogramie wartość napięcia z ADC i wynik wyświetlać co te 500 ms wykorzystując flagę z przerwania.
Ale nie wiem czemu warunek „IF” wykonywany jest za każdym przejściem programu, a nie tylko wtedy kiedy flaga_500ms=0 kod:
potem oczywiście wyświetlam zmienną wynik w odpowiednim miejscu:
i tu tez pojawia sie mniejszy juz problem od poprzedniego ale jest.
Jeśli wyświetla sie liczba przeformatowana przez „fusing”, to obserwuje migotanie różnych znaków na ostatniej cyfrze co jakiś czas - znaki ascii np :,>,? i inne tez tego nie rozumiem.
Teraz opisze jeszcze kilka założeń pomocnych w analizie:
- żadnych waitms'ów w kodzie programu głównego (program zasuwa ile fabryka), tylko przy warunkach wyboru podmenu wykonywane jednorazowo przy naciśnięciu przycisku celem uniknięcia przeskoku do dalszych podmenu.
- unikanie instrukcji CLS w programie głównym, jest tylko przed pętla programu głównego Do…Loop - obrazy wymazuje natpisujac kolejne z pełna obsada znaków i pustych pól
- wyświetlanie wyników pomiaru z ADC co 0,5 sekundy za pomocą flagi z przerwania , a nie z opóźnień instrukcją waitms
To tak pokrótce – problemy:
1.
czyli program smiga z pełną szybkością odczytując ADC i uśredniając wyniki a co ok. 0,5 sek flaga_500ms od przerwania ma wykonać warunek if , w którym następuje przypisanie wartości zmierzonej do zmiennej wyświetlanej na LCD. No i to jak już wspomniałem nie dokona mi działa bo zachowuje się tak jakby na „pełnej prędkości „ wyświetlał mi wyniki, a nie co 0,5 s
2. Drugim problemem jest wyświetlanie , prześwitywanie różnych znaków na ostatniej cyfrze zmiennej konwertowanej przez Fusing; problem ten już zauważyłem jeszcze zanim powstał problem nr 1. Może to efekt nadpisywania ekranów bez użycia CLS , ale gdy przełączam Menu to nie ma żadnych takich efektów lub wyświetlam wartości zmiennej bez użycia Fusing. To pojawia się jak używam Fusing(zmienna , "#.&&").
Przyznam się, że to pierwszy w ten sposób przez ze mnie robiony program, ale jeśli wszystko zadziała to spełni moje oczekiwania.
Proszę o pomoc i dziękuję.
Utknąłem z moim kodem i plątam sie w koło ciągle, dlatego proszę o pomoc.
W podprogramie "przyciski" przerwania od timer0 mam zrealizowany odczyt przycisków i zrobiłem sobie "flagi czasowe"
przyciski: 'przerwanie co 26ms
.
kod sprawdzania przycisków
.
incr licz
if licz=19 then ' flaga co ok 0,5 s
flaga_500ms=0 ' w warunkach początkowych flaga_500ms =1 czyli u mnie wyłączona
licz = 0
end if
Return
Główny mój problem polega na tym, że chciałbym odczytać np. w procedurze lub podprogramie wartość napięcia z ADC i wynik wyświetlać co te 500 ms wykorzystując flagę z przerwania.
Ale nie wiem czemu warunek „IF” wykonywany jest za każdym przejściem programu, a nie tylko wtedy kiedy flaga_500ms=0 kod:
sub odczytaj
for i = 0 to 99 ' robie srednia ze 100 pomiarów
wart_adc=getadc(0)
bufor=bufor * wart_adc
next i
bufor=bufor / 100
bufor=bufor * 0,0049
bufor=bufor * 4
if flaga_500ms=0 then ' nie wiem czemu ale ten warunek wykonuje sie za
wynik=bufor każdym przejsciem programu a nie kiedy flaga = 0
flaga_500ms=1
end if
end subpotem oczywiście wyświetlam zmienną wynik w odpowiednim miejscu:
wys=fusing(wynik , "#.&&")i tu tez pojawia sie mniejszy juz problem od poprzedniego ale jest.
Jeśli wyświetla sie liczba przeformatowana przez „fusing”, to obserwuje migotanie różnych znaków na ostatniej cyfrze co jakiś czas - znaki ascii np :,>,? i inne tez tego nie rozumiem.
Teraz opisze jeszcze kilka założeń pomocnych w analizie:
- żadnych waitms'ów w kodzie programu głównego (program zasuwa ile fabryka), tylko przy warunkach wyboru podmenu wykonywane jednorazowo przy naciśnięciu przycisku celem uniknięcia przeskoku do dalszych podmenu.
- unikanie instrukcji CLS w programie głównym, jest tylko przed pętla programu głównego Do…Loop - obrazy wymazuje natpisujac kolejne z pełna obsada znaków i pustych pól
- wyświetlanie wyników pomiaru z ADC co 0,5 sekundy za pomocą flagi z przerwania , a nie z opóźnień instrukcją waitms
To tak pokrótce – problemy:
1.
czyli program smiga z pełną szybkością odczytując ADC i uśredniając wyniki a co ok. 0,5 sek flaga_500ms od przerwania ma wykonać warunek if , w którym następuje przypisanie wartości zmierzonej do zmiennej wyświetlanej na LCD. No i to jak już wspomniałem nie dokona mi działa bo zachowuje się tak jakby na „pełnej prędkości „ wyświetlał mi wyniki, a nie co 0,5 s
2. Drugim problemem jest wyświetlanie , prześwitywanie różnych znaków na ostatniej cyfrze zmiennej konwertowanej przez Fusing; problem ten już zauważyłem jeszcze zanim powstał problem nr 1. Może to efekt nadpisywania ekranów bez użycia CLS , ale gdy przełączam Menu to nie ma żadnych takich efektów lub wyświetlam wartości zmiennej bez użycia Fusing. To pojawia się jak używam Fusing(zmienna , "#.&&").
Przyznam się, że to pierwszy w ten sposób przez ze mnie robiony program, ale jeśli wszystko zadziała to spełni moje oczekiwania.
Proszę o pomoc i dziękuję.
