Witam!
Slecze nad programem dla procka AT89c2051 24PC. Pisze w asemblerku i natrafilem na problem.
Po zainicjowaniu zmiennych program glowny wykonuje skok na samego siebie:
ajmp $
W inicjacji znajduja sie rozkazy, ktore uruchamiaja 2 rodzaje przerwan
1. przerwanie INT0, gdzie dodatkowo wlaczam wysoki priorytet
2. przerwanie dla T0 w trybie 1 jako czasomierz z ustawionym niskim priorytetem
Przerwania z INT0 wykonuja sie zawsze i nie ma z nim problemow.
Natomiast przerwanie z T0 wchodzi w pewnych sytuacjach w stan, gdzie zostaje ustawiona flaga zgloszenia przerwania, lecz przerwanie nie wykonuje sie. Tyle moge stwierdzic, piszac odpowiednie programy.
Co wiecej, to przerwanie zostaje jakby "zablokowane". Przypuszczam, ze gdy w jednym momencie zostanie zgloszone przerwanie od INT0 i od T0, to zostanie wykonane przerwanie od INT0 (wyzszy priorytet), natomiast dla przerwania z T0 zostaje tylko ustawiona flaga TF0 i jako ze jest ono na nizszym priorytecie, nie zostaje wykonane. Ta flaga caly czas jest ustawiona i nie ma ja kto skasowac aby wszystko wrocilo do normy. Normalnie flaga ta byla by skasowana, gdyby nastapilo przyjecie przerwania, ale takie przyjecie nie nastepuje.
Mysle ze w miare przejrzyscie opisalem problem, z jakim sie spotkalem. Na podstawie tego mozna wnioskowac, ze piszac programy wykorzystujace jednoczesnie przerwanie T0 i INT0 mozemy spodziewac sie niewytlumaczalnych problemow.
Jesli ktos spotkal sie z takim problemem, zapraszam do dyskusji.
Slecze nad programem dla procka AT89c2051 24PC. Pisze w asemblerku i natrafilem na problem.
Po zainicjowaniu zmiennych program glowny wykonuje skok na samego siebie:
ajmp $
W inicjacji znajduja sie rozkazy, ktore uruchamiaja 2 rodzaje przerwan
1. przerwanie INT0, gdzie dodatkowo wlaczam wysoki priorytet
2. przerwanie dla T0 w trybie 1 jako czasomierz z ustawionym niskim priorytetem
Przerwania z INT0 wykonuja sie zawsze i nie ma z nim problemow.
Natomiast przerwanie z T0 wchodzi w pewnych sytuacjach w stan, gdzie zostaje ustawiona flaga zgloszenia przerwania, lecz przerwanie nie wykonuje sie. Tyle moge stwierdzic, piszac odpowiednie programy.
Co wiecej, to przerwanie zostaje jakby "zablokowane". Przypuszczam, ze gdy w jednym momencie zostanie zgloszone przerwanie od INT0 i od T0, to zostanie wykonane przerwanie od INT0 (wyzszy priorytet), natomiast dla przerwania z T0 zostaje tylko ustawiona flaga TF0 i jako ze jest ono na nizszym priorytecie, nie zostaje wykonane. Ta flaga caly czas jest ustawiona i nie ma ja kto skasowac aby wszystko wrocilo do normy. Normalnie flaga ta byla by skasowana, gdyby nastapilo przyjecie przerwania, ale takie przyjecie nie nastepuje.
Mysle ze w miare przejrzyscie opisalem problem, z jakim sie spotkalem. Na podstawie tego mozna wnioskowac, ze piszac programy wykorzystujace jednoczesnie przerwanie T0 i INT0 mozemy spodziewac sie niewytlumaczalnych problemow.
Jesli ktos spotkal sie z takim problemem, zapraszam do dyskusji.