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

[ATmega][Bascom] Proszę o podpowiedź co robię źle, polecenie incr.

marcinek.p 13 Sty 2012 22:51 2178 11
REKLAMA
  • #1 10393464
    marcinek.p
    Poziom 12  
    Witam

    Proszę o wskazówki dotyczące polecenia incr. W celu poznania i zrozumienia przerwań (jak to wygląda, z czym się je i jak liczy) od kilku dni wertuję co możliwe i czytam, czytam, a następnie próbuję...
    "Urodził" mi się taki oto programik:
    Kod: text
    Zaloguj się, aby zobaczyć kod


    I w zasdzie nie przerwania sprawiają mi trudności(jak na razie) a nieszczęsne polecenie incrementacji.

    Portd.7 sobie "miga" z jakąś tam częstotliwością. Nie za szybko. Chciałbym zliczać te impulsy. Niestety gdy
    Case 1 :
    Reset Portd.1
    Set Portd.2
    Set Portd.3
    If Portd.7 = 0 Then Incr Czas
    Czas kilkakrotnie "przeskakuje" całą wartość byte. Dochodzę do wniosku że INCR zlicza mi ilość cykli w czasie gdy portd.0=0.
    Jak temu zapobiec?

    Myślę kombinuję i nic z tego nie wychodzi... Zastosowałem takie coś:
    Kod: text
    Zaloguj się, aby zobaczyć kod


    I powiedzmy że spełnia założenia, poza tym że wystawia jedynkę na portd.7 na stałe. Ale jest to nie "eleganckie", wręcz brzydkie i nie funkcjonalne (w jakiejś większej aplikacji, nie testowej zamiast portd.7 zastosował bym przecież zmienną, a tego DEBOUNCE już nie przełknie). Zaczyna brakować mi pomysłów. Proszę o jakiekolwiek sugestie...
  • REKLAMA
  • #2 10394265
    Mundi1970
    Poziom 24  
    marcinek.p napisał:
    I w zasdzie nie przerwania sprawiają mi trudności(jak na razie) a nieszczęsne polecenie incrementacji.


    Jak chcesz odliczyć 1 sekundę, musisz wiedzieć co jaki czas wykonuje się to przerwanie. Można np. ustawić timer0 tak żeby przerwanie od przepełnienia było co 2ms, wtedy w przerwaniu liczysz do 500 i masz 1 sekundę (2ms*500=1000ms=1s).

    Pomoce naukowe: Link, Link.
  • #3 10394601
    Konto nie istnieje
    Konto nie istnieje  
  • REKLAMA
  • Pomocny post
    #4 10394816
    arktik1
    Poziom 27  
    "Portd.7 sobie "miga" z jakąś tam częstotliwością. Nie za szybko. Chciałbym zliczać te impulsy"
    Oczywiście że możesz je liczyć, potrzebujesz tylko zmiennej pomocniczej która będzie powodowała że program skoczy tylko raz do liczenia gdy PORTX będzie w stanie wysokim lub niskim, np:
    
    Do
    
    If Portd.7 = 0 And Zmiennapomocnicza = 0 Then Gosub Plus_jeden_czas
    If Portd.7 = 1 Then Zmiennapomocnicza = 0
    
    Loop
    
    Plus_jeden_czas:
    Incr Czas
    Zmiennapomocnicza = 1
    Return
    
    
  • REKLAMA
  • #5 10394891
    Konto nie istnieje
    Konto nie istnieje  
  • Pomocny post
    #7 10395371
    Konto nie istnieje
    Konto nie istnieje  
  • #8 10395438
    marcinek.p
    Poziom 12  
    Witam

    Dziękuję wszystkim za zainteresowanie. Co prawda tylko kolega arktik1 doczytał w czym problem tkwi i podsunął pomysł jak go zrealizować. Chociaż jednak przy pierwotnej wersji programu i dodaniu zaproponowanych zmian myślę że skok będzie i tak wykonywany co cykl. Najlepszym rozwiązaniem było by gdyby skok był wykonywany przy "zboczu narastającym lub opadającym" dla portd.7. Jak napisałem w zasadzie powinna być to zmienna typu BIT. Mimo to wszelkie inne wskazówki wezmę sobie do serca :).
    Wersja bliska prawidłowemu działaniu:
    Kod: text
    Zaloguj się, aby zobaczyć kod

    Chociaż to tylko takie moje przemyślenia, sprawdzone na płycie testowej evbavr04.

    Właśnie zauważyłem że dotarła jeszcze jedna odp. kol Saabotaz jeszcze nie czytałem...


    Przebrnąłem. Biorąc pod uwagę że czasy z założenia nie miały byś super dokładne, bez żadnych opuźnień typu "wait" i tak dla zabawy, to gotowiec wygląda tak:
    Kod: text
    Zaloguj się, aby zobaczyć kod


    Pomysł był taki żeby układ (program) działał podobnie do regulatora wycieraczek w autku.(miałem kiedyś peugeota 106 w którym klepnięcie "wajchy" wycieraczek w dół dawało jedno machnięcie wycieraczek, "wajcha" na sprężynie wracała sama)

    I tu tak to wygląda:
    jeden impuls-liczę czas
    drugi macham wycieraczką co wyliczony czas
    trzeci resetuje czasy.

    Dziękuję za pomoc i wyrozumiałość. Układu nie buduję bo jest to przerost formy nad treścią. Ale może się komuś przyda...
    Pozdrawiam Marcin
    jedno
  • REKLAMA
  • #9 10409989
    marcinek.p
    Poziom 12  
    Witam ponownie.

    Jeszcze jedno małe pytanko do powyższego kodu:
    Czemu jeżeli dodam do niego np. obsługę PWM program strasznie zwalnia, zauważalnie gołym okiem. Czy jest to wina ograniczeń mikroklocka? Czy też baskoma i jego elementów?


    Od razu przepraszam że post pod postem. Ale to tylko dlatego że pytanie mogło by być nie zauważone. Jak tylko pojawi się jakakolwiek odpowiedź obiecuję poprawić i scalić na ile to będzie możliwe z postem powyżej.
  • #10 10493069
    arktik1
    Poziom 27  
    A jaki timer stosujesz do PWM?
    No i prędkość Uc "$crystal = 1000000" tez nie jest za wielka.
  • #11 10503595
    marcinek.p
    Poziom 12  
    W zasadzie było to takie ćwiczenie dla siebie... I niestety padł mi dysk, więc wszystko straciłem. No prawie wszystko bo to co jest tu można dalej wykorzystać.

    A co się pytań tyczy to:
    Timer1 wykorzystywałem dla PWM
    $crystal = 1000000 to też uległo zmianie na 8000000 z zewnątrz.
    Co nie zmienia faktu że czasy uległy widocznej zmianie. Co ciekawe Led podobnie jak "Portd.6" pulsowała ze "zmienną" częstotliwością w zależności co program w danej chwili wykonywał. Wydawało mi się że powinno być to w miarę stabilne.
  • #12 10513343
    arktik1
    Poziom 27  
    Bo powinno być, jeśli Timer1 przez przypadek nie jest jeszcze do czegoś zaprzęgany w programie.
REKLAMA