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

cyber
-
-
Posty: 5
Rejestracja: 11 paź 2006, o 19:58
Lokalizacja: Gdansk

Problem z przerwaniami AT89S52

Postautor: cyber » 19 wrz 2007, o 19:47

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..

akos
-
-
Posty: 10
Rejestracja: 20 paź 2005, o 14:44
Lokalizacja: Siedlce
Kontaktowanie:

Postautor: akos » 26 paź 2007, o 14:29

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.

Wróć do „8051”

Kto jest online

Użytkownicy przeglądający to forum: Obecnie na forum nie ma żadnego zarejestrowanego użytkownika i 51 gości