AT89C2051 i przerwania
Masz problem? Zapytaj na forum elektroda.pl z bramką pl.misc.elektronika!
From: Piotr Laskowski <Piotr.Laskowski_at_nospam_f117.n480.z2.fidonet.org>
Date: Tue, 08 Dec 98 23:26:49 +0100
Subject: AT89C2051 i przerwania
Czesc Olgierd!
Dzieki Tobie juz dziala :))
>> Pomiar predkosci zrobilem na dwoch fotorezystorach oswietlanych
>> przez jadacy wozek. Generuje to dwa ujemne impulsy, ktore podaje na
>> wejscia INT0 i INT1 Atmelka 2051. Jedno przerwanie uruchamia a
>> drugie zatrzymuje licznik T0, ktory zlicza do 250 generujac
>> przerwania co 0.5ms (kwarc 6MHz). Znajac droge wylicze sobie
>> predkosc.
OC> Nie powiem, żebym się wyspał, może w związku z niewyspaniem właśnie
OC> nie całkiem rozumiem Twój program, np. nie wiem do czego używasz
OC> licznika T1 .
Nie chcialem zaciemniac sprawy i dlatego skrobnelem o nim tylko cos na koncu.
Generalnie zrobilem z niego licznik pomocniczy, sluzacy do "resetowania" flag
maskujacych przerwania. Sytuacja wyglada tak: wozek jedzie, pojawia sie np. INT0
- start, wiec maskuje INT0 a zezwalam INT1, jedzie dalej pojawia sie INT1 - stop
po czym maskuje je (w procedurze obslugi przerwania).
Wozek teraz bedzie jechal w druga strone, wiec pierwsze pojawi sie INT1 a ono
jest zablokowane. Dlatego przy przerwaniu "stop" uruchamiam T1, tak aby po
jakims przyzwoitym czasie zezwolil na obydwa przerwania.
OC> Na wstępie chciałbym zauważyć, że przyczyną Twojego problemu
OC> może być niekasowanie znaczników zgłoszenia przerwań INT1 i INT0 .
[...]
OC> ale być może popełniasz błędne założenia co do "kasowania flagi
OC> zezwolenia na przerwanie". Samo zamaskowanie przerwań przez wpisanie
OC> zera do odpowiednich bitów rejestru IE nie wystarczy !!!
Wlasnie tu byl pies pogrzebany.
OC> A zatem, jeśli twój fotorezystor uruchomi INT0 , to procedura obsługi
OC> zablokuje maskę w celu zapobieżenia ponownemu przyjęciu przerwania,
OC> po czym zakończy działanie i SPRZĘTOWO wyłączy znacznik zgłoszenia
OC> IE0 w TCON .
Z tym sprzetowym kasowaniem zgloszenia mialem zagwozdke. Niby wszedzie o tym
pisze, ale jak ten tonacy z brzytwa sprobowalem dodatkowo recznie ja zerowac.
Teoretycznie nie powinno sie nic dziac, bo jezeli zeruje wyzerowana sprzetowo
flage... ale program na to reagowal. Okazuje sie ze na wskutek drgan zglaszalo
sie kilka przerwan juz w momencie gdy zabronilem obslugi tego przerwania i jak
piszesz, w zatrzasku bylo juz zgloszenie nastepnego przerwania - ta dodatkowa
instrukcja je kasowala, a bez niej gdy tylko odblokowalem zgloszenie sie danego
przerwania od razu przystepowal do jego obslugi - stad ta sekwencja trzech
przerwan INT0, INT1, INT0.
OC> A zatem przed odmaskowaniem przerwania INT0 w procedurze
OC> obsługi przerwania INT1 należe WYZEROWAĆ znacznik zgłoszenia
OC> przerwania INT0 instrukcją CLR IE0 i na odwrót.
Wlasnie. Juz chyba zapamietam to do konca zycia :-)
OC> Tak poza tym, możnaby - chyba - rozwiązać sprawę prościej,
OC> wykorzystując obydwa liczniki. Przerwanie INT0 uruchamiałoby licznik
OC> T0 i kasowało T1, zaś przerwanie INT1 kasowaloby T0 i uruchamialo T1,
OC> czyli na odwrót . Dzięki temu w zależności od zwrotu prędkości wynik
OC> pomiaru czasu przelotu byłby albo w zmiennych inkrementowanym przez
OC> przerwanie T0, albo przez T1 .
OC> Pełna symetria, i na dodatek blokowanie przerwań byłoby zbędne -
OC> nic się przecież nie stanie, jeśli uruchomią się kilka razy pod rząd
Rzeczywiscie, to wyglada niezle. Troche mnie martwi tylko alternatywne
wykorzystanie licznika do innych celow. To troche skomplikuje obsluge licznikow.
W sumie pewnie na jedno by wyszlo.
OC> Nie wiem, czy czasem również w Twoim programie jest konieczne
OC> blokowanie przerwań. Być może jest niepotrzebne - stanie się coś,
OC> jeśli INT0 lub INT1 uruchomi się kilka razy ?
Nie powinno. Moja obawa wynikala z uproszczenia warunkow testowania. W
rzeczywistosci czujniki beda oddalone o metr, natomiast u mnie na biurku byly o
kilka centymetrow - wtedy pewne nieistotne rzeczy zaczynaly miec znaczenie.
Jednoczesne oswietlenie dwoch czujnikow powodowalo wystepowanie zjawiska
hazardu, dzialy sie rozne dziwne rzeczy, stad pomysl z blokowaniem przerwan.
Jeszcze raz dziekuje za pomoc :)
Piotrek.
÷:)