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

Jak zrealizować inkrementację zmiennej w przerwaniu INT0 na ATtiny2313?

klop07 02 Lut 2006 12:05 3672 4
REKLAMA
  • #1 2248875
    klop07
    Poziom 13  
    Posty: 92
    Pomógł: 5
    Ocena: 2
    Witam.

    Natrafiłem na pewien problem, a jestem raczej początkującym "programistą" mikrokontrolerów. Mianowicie chodzi o to, aby podczas przerwania wartość zmiennej została podniesiona o jeden, a następnie jeżeli osiągnie wartość np. 6 została wyzerowana. W dalszej części programu w pętli Do...Loop były by umieszczone instrukcje warunkowe IF warunek THEN.

    Od strony praktycznej miało by to wyglądać mniej więcej tak:

    --zmienna jest wyzerowana i wykonuje się warunek jeśli zmienna = 0 to coś tam.
    --następuje przerwanie, do zmiennej zostaje dodane 1 i wtedy wykonuje się warunek jeśli zmienna = 1 to coś tam.

    --program wykonuje cały czas warunek jeśli zmienna = 1 to coś tam
    --znowu następuje przerwanie, do zmiennej zostaje dodane 1 i zmienna ma wartość 2
    --i znowu jeśli zmienna = 2 to coś tam
    --taka sytuacja powtarza się kilka razy, dopuki zmienna nie osiągnie wartości granicznej, po której zostaje wyzerowana i cały proces zaczyna się od nowa

    Głównym problemem jest dla mnie skonfigurowanie przerwania i deklaracja całej procedury dodawania, instrukcje warunkowe to nie problem, chodzi tylko o zdekarowanie i konfigurację procedur dotyczących przerwania, oraz wprowadzenia zmiennej do głównej pętli, w której znajdują się instrukcje warunkowe

    Szukałem tu i tam, ale nie znalazłem nic, co by mi pomogło.

    Pozdrawiam
    Łukasz
  • REKLAMA
  • #2 2248930
    maxiu25
    Poziom 16  
    Posty: 190
    Pomógł: 16
    Ocena: 3
    na baskomie sie nie znam ale sprobuj zrobic tak
    ta zmienna co sie ma zmieniac do szesciu to niech bedze zminna globalna w przerwaniu sprawdzasz czy jest mniejsza od 6 jesli tak to inkrementuj jesli nie to zeruj to sa dwa warunki a w glownym programie juz wykonuj to co ma byc dla odpoiedniego przypadku
  • REKLAMA
  • Pomocny post
    #3 2249161
    M. S.
    Poziom 34  
    Posty: 2107
    Pomógł: 259
    Ocena: 680
    Napisz tak:

    Dim Zmienna As Byte
    Zmienna = 0
    Config Intx = Low Level | Rising | Falling [ | Change ]
    'Konfiguracja reakcji na sygnał przerwania
    'za x podstaw nr przerwania wybierz jeden ze sposobów pobudzenia kocówki uC
    Enable Interrupts
    'Uruchomienie przerwań globalnych
    Enable Intx
    'Uruchomienie przerwania INTx
    On Intx Obsluga_przerwania
    'wskazanie nazwy podprogramu wykonywanego podczas obsługi przerwania
    
    Do
    'Pętla główna
    If Zmienna = .... Then ....
    'Warunki
    Loop
    
    Obsluga_przerwania:
    'Podprogram obsługi przerwania
    Incr Zmienna
    'Zwiększ zmienną o 1
    If Zmienna = 6 Then Zmienna = 0
    Return
    'Koniec - powrót do pętli głównej


    BASCOM generalnie posługuje się zmiennymi globalnymi.
    W programie można by zawrzeć instrukcje eleminujące wielokrotne wejście do podprogramu obsługi przerwania (mikrokontrolery działają bardzo szybko), lecz wszystko zależy od potrzeb.
    Przerwania można wyłączyć instr. Disable
  • REKLAMA
  • #4 2249424
    wicy
    Poziom 22  
    Posty: 670
    Pomógł: 30
    Ocena: 111
    Nie do konca jest tak jak w przykladzie wyzej. Musisz pamiętać, że przerwanie przerywa wykonywanie petli glownej i wraca do niej spowrotem po wykonaniu przerwania. Więc jeśli podczas jakiegoś "długiego" i bardziej skomplikowanego warunku w pętki głównej będziesz chciał wywołać przerwanie i potem natychmiast zareagować na zmianę zmiennej w pętli, będziesz musiał wyjść z warunku do pierwszej instrukcji po DO. Inaczej nawet po zmianie zmiennej program dalej bedzie konczyl warunek dla poprzedniego stanu zmiennej i jesli jest to czasochłonne to reakcja będzie znacznie opóźniona. Dlatego proponuję przejrzeć wątek https://www.elektroda.pl/rtvforum/topic425797.html
  • #5 2249638
    klop07
    Poziom 13  
    Posty: 92
    Pomógł: 5
    Ocena: 2
    Dziękuję bardzo za pomoc. Program, który napisałem różnił się tylko paroma szczegółami od tego poprawnego. Do do tego, że po zakończeniu przerwania program będzie dalej wykonywał główną instrukcję warunkową to nawet konieczność. Jeszcze raz dziękuję za pomoc.

    Pozdrawiam
    Łukasz
REKLAMA