Witam !
Zwracam sie z prosba o rade w sprawie obslugi przerwań. Jestem na ukonczeniu projektu termometru na AT89S52 w ktorym mają działac dwa przerwania - wewnetrzne od timera ktory zapisuje wyniki 10 kolejnych pomiarow do pamieci wewnetrzej u-kontrolera oraz zewnetrzne od przycisku - microswitcha ktory powoduje wypisanie zapisanych wynikow z pamieci na ekranie LCD 2x16 w dolnej linii ekranu pozostawiajac odczyt biezacej temp. z czujnika DS 1820 w linii gornej.
Program obslugi obu przerwan wklejam ponizej. Wszystkie uzywane w programie rejestry nie sa "nadpisywane" a jesli wystepuje taka sytuacja odkladam je wczesniej na stos.
Nie potrafie dojsc dlaczego moj uklad po nacisnieciu u-switcha, ktory zwiera noge INT0 z masa, nie wchodzi do przerwania Sad
Oto Program :
RS EQU P0.7
E EQU P0.5
RW EQU P0.6
TERM EQU P1.1 ; LINIA CZUJNIKA 1-WIRE
BTN EQU P3.2 ; PRZYCISK PRZERWANIE INT0
IE_INI EQU 10000011B ; ODBLOKOWANIE PRZERWAŃ : EA - - - | - - ET0 EX0
TMOD_INI EQU 00000001B ; TRYB PRACY LICZNIKÓW : LICZNIK T0 W TRYBIE 1 (16 bit TH0 + TL0)
ORG 00H ; UMIESZCZENIE PROGRAMU OD ADRESU 00H
LJMP START
ORG 03H ; Przerwanie zewnetrzne INT0
LJMP PRZYCISK
ORG 0BH ; PRZERWANIE OD TIMERA T0
LJMP TIMER
ORG 30H
; ------------------------------ MAIN -------------------------------------
START:
;--------- USTAWIENIE REJESTROW SFR ---------
MOV TMOD,#TMOD_INI
setb ea
setb ex0
setb et0 ; tu ustawiam zezwolenoie na przerwanie od licznika T0
;--------- USTAWIENIE LICZNIKA T0 -----------
ORL TL0,#0B0H ; wartości początkowe..
MOV TH0,#3CH ; ..dla licznika TO - LICZY 50ms
CLR PT0 ; ustawiam prirytety przerwań
SETB PX0
MOV DPH,#200 ; LICZNIK 12 SEKUND
MOV R1,#64H ; WSKAZNIK POCZATKU ZAPISYWANIA WYNIKOW
LCALL INIT_LCD
SETB RS ; wpis do pamieci LCD DANYCH z portu P2
MOV P2,#'T'
SETB E
CLR E
LCALL DELAY
MOV P2,#'E'
SETB E
CLR E
LCALL DELAY
MOV P2,#'M'
SETB E
CLR E
LCALL DELAY
MOV P2,#'P'
SETB E
CLR E
LCALL DELAY
MOV P2,#':'
SETB E
CLR E
LCALL DELAY
MOV P2,#20H
SETB E
CLR E
LCALL DELAY
MOV P2,#'+'
SETB E
CLR E
LCALL DELAY
SETB TR0 ; start licznika T0
ETE:
LCALL START_PTE ; ROZPOCZNIJ POMIAR TEMPERATURY
SETB TERM
LCALL OP100M ; 50 ms
LCALL RESETDS
LCALL CZYT_TEM
MOV A,20H ; POBRANIE WYNIKU POMIARU DS1820 Z PAMIECI
CLR C ; DZIELENIE WYNIKU PRZEZ 2
RRC A
JC OMIN ; SPRAWDZANIE FLAGI PRZENIESIENIA 'C'
MOV R4,A ; WYNIK POMIARU W REJESTRZE R4
LCALL PRZELICZ
LCALL WYPISZ
SJMP ETE
OMIN:
MOV R4,A
LCALL PRZELICZ
LCALL WYPISZ1
SJMP ETE
; ------------------------------ END MAIN --------------------------------
; ---- PROCEDURA OBSLUGI PRZERWANIA LICZNIKA TO ------------
TIMER:
ORL TL0,#0B0H ; wartości początkowe..
MOV TH0,#3CH ; ..dla licznika TO - LICZY 50ms
DJNZ DPH,WYJDZ
MOV A,R4
MOV @R1,A
INC R1
CJNE R1,#6EH,WYJDZ1
MOV R1,#64H
WYJDZ1:
MOV DPH,#200
WYJDZ: RETI
; -------- PROCEDURA PRZERWANIA ZEWNETRZNEGO INT0 ---------
PRZYCISK:
EEE: LCALL DELAY ; ELIMINACJA DRGAN PRZYCISKU
JNB BTN,EEE
MOV B,R4
PUSH B
MOV R0,#64H
mov dpl,#10
MOV A,#40H ; DRUGA LINIA LCD
LCALL LCD_XY
EE1: MOV A,@R0 ; POBRANIE WYNIKU Z PAMIECI
MOV R4,A
CALL PRZELICZ
CALL WYPISZ2
SJMP KONIEC
KONIEC:
INC R0
djnz dpl,ee1
POP B
MOV R4,B
RETI
Wydaje mi sie ze obsluga przerwan jest napisana dobrze. Uklad po prostu nie reaguje w ogole na przycisk pozostajac caly czas w glownej petli wypisywania aktualnego wyniku pomiaru w pierwszej linii LCDka.
Test z umieszczeniem w obszarze przerwania $ rowniez daje brak reakcji.
ORG 03H ; Przerwanie zewnetrzne INT0
LJMP $ ----> powinno zatrzymac wypisywanie wyniku...
LJMP PRZYCISK
Prosze o pomoc..
Aktyw Forum
Zarejestruj się na forum.ep.com.pl i zgłoś swój akces do Aktywu Forum. Jeśli jesteś już zarejestrowany wystarczy, że się zalogujesz.
Sprawdź punkty Zarejestruj sięProblem z przerwaniami AT89S52
Moderatorzy:Jacek Bogusz, procesorowiec, robertw, tomasz_jablonski, r-mik, Moderatorzy
NIe wiem, czy jeszcze aktualne, ale wydaje mi się, że za długo jesteś w obsłudze przerwania od klawisza. Aby sprawdzić, czy w ogóle przerwanie jest wykonywane wyrzuciłbym na próbe wszystko z obsługi i np kazałbym zaświecić diodę led podpiętą do któregoś portu. Jeśli zadziała to ustawiłbym jakiś znacznik i sprawdzałbym go w pętli głównej programu. To tylko jedna z mozliwosci.
Pozdrowienia.
Pozdrowienia.
Kto jest online
Użytkownicy przeglądający to forum: Obecnie na forum nie ma żadnego zarejestrowanego użytkownika i 16 gości