Różnice w działaniu programów na 89c51: Timer 0 i manipulacja stanem diody P1.7
jaka jest roznica pomiedzy tymi programami (timer 0 na 89c51)
From: kobra <kobra_at_nospam_bobo.ds5.agh.edu.pl>
Subject: jaka jest roznica pomiedzy tymi programami (timer 0 na 89c51)
Date: Thu, 04 Jan 2001 17:35:34 +0000
ten program dziala i dioda na p1.7 zmienia swoj stan
natomiast jak usune petle
NIC:
LJMP NIC
to dioda caly czas swieci
moze mi ktos powiedziec dlaczego tak jest ?
Mi sie wydawalo ze mimo to ze procesor nic nie robi to
i tak obsluzy przerwanie, moze jestem w bledzie
$MOD51
LJMP START
ORG 0BH
MOV TH0,#76
MOV TL0,#0
DJNZ R0,LOOP
CPL P1.7
MOV R0,#20
LOOP:
RETI
START:
ORG 100H
MOV TMOD,#01h ;USTAWIENIE TRYBU TIMERA 16 BITOWY
MOV TH0,#76 ;ZALADOWNIE WARTOSCI 19456 DO TIMREA0
MOV TL0,#0 ;ZALADOWNIE WARTOSCI 19456 DO TIMREA0
SETB EA ;OGOLNE ZEZWOLENIE NA PRZERWANIE
SETB ET0 ;ZEZWOLENIE NA PRZERWANIE OD TIMER'A0
SETB TR0 ;URUCHOMIENIE TIMERA
CLR P1.7 ;ZAPALENIE DIODY
MOV R0,#20D
NIC:
LJMP NIC
END
From: "Bartosz Rakowski" <rakbar_at_nospam_poczta.onet.pl>
Subject: Re: jaka jest roznica pomiedzy tymi programami (timer 0 na 89c51)
Date: Thu, 4 Jan 2001 18:04:33 +0100
Czesc
"kobra" <kobra_at_nospam_bobo.ds5.agh.edu.pl> wrote in message
news:3A54B466.7020403_at_nospam_bobo.ds5.agh.edu.pl...
ten program dziala i dioda na p1.7 zmienia swoj stan
natomiast jak usune petle
NIC:
LJMP NIC
to dioda caly czas swieci
moze mi ktos powiedziec dlaczego tak jest ?
Bo jesli usuniesz ten fragment, to po wpisaniu do R0 procesor "idzie w
krzaki"...
Nie ma powrotu do start, ani zadnego zapetlenia, po prostu wykonuje te
smieci, ktore siedza w EPROMie/FLASHu, czyli grom wie co.
Rakbar
From: kobra <kobra_at_nospam_bobo.ds5.agh.edu.pl>
Subject: Re: jaka jest roznica pomiedzy tymi programami (timer 0 na 89c51)
Date: Thu, 04 Jan 2001 18:14:30 +0000
Bartosz Rakowski wrote:
Czesc
"kobra" <kobra_at_nospam_bobo.ds5.agh.edu.pl> wrote in message
news:3A54B466.7020403_at_nospam_bobo.ds5.agh.edu.pl...
ten program dziala i dioda na p1.7 zmienia swoj stan
natomiast jak usune petle
NIC:
LJMP NIC
to dioda caly czas swieci
moze mi ktos powiedziec dlaczego tak jest ?
Bo jesli usuniesz ten fragment, to po wpisaniu do R0 procesor "idzie w
krzaki"...
Nie ma powrotu do start, ani zadnego zapetlenia, po prostu wykonuje te
smieci, ktore siedza w EPROMie/FLASHu, czyli grom wie co.
Rakbar
dzeki teraz juz rozumiem
From: "littelman" <littelman_at_nospam_wp.pl>
Subject: Re: jaka jest roznica pomiedzy tymi programami (timer 0 na 89c51)
Date: Thu, 4 Jan 2001 22:33:27 +0100
Moge tu jeszcze dodac, ze zapis do TIMERA lepiej wykonac w
nastepujacy sposób:
ORL TL0,XX
MOV TH0,XX
jezli chcesz odmierzac czas to od momentu zgloszenia przerwania do
jego przyjecia uplywa zawsze pare taktów w zaleznosci jaka
instrukcja jest aktualnie wykonywana. Przerwanie rozpoczyna sie dopiero
po zakonczeniu aktualnie wykonywanej instrukcji, która moze miec
rózna liczbe taktów procesora.
Użytkownik kobra <kobra_at_nospam_bobo.ds5.agh.edu.pl> w wiadomooci do grup
dyskusyjnych napisał:3A54B466.7020403_at_nospam_bobo.ds5.agh.edu.pl...
ten program dziala i dioda na p1.7 zmienia swoj stan
natomiast jak usune petle
NIC:
LJMP NIC
to dioda caly czas swieci
moze mi ktos powiedziec dlaczego tak jest ?
Mi sie wydawalo ze mimo to ze procesor nic nie robi to
i tak obsluzy przerwanie, moze jestem w bledzie
$MOD51
LJMP START
ORG 0BH
MOV TH0,#76
MOV TL0,#0
DJNZ R0,LOOP
CPL P1.7
MOV R0,#20
LOOP:
RETI
START:
ORG 100H
MOV TMOD,#01h ;USTAWIENIE TRYBU TIMERA 16 BITOWY
MOV TH0,#76 ;ZALADOWNIE WARTOSCI 19456 DO TIMREA0
MOV TL0,#0 ;ZALADOWNIE WARTOSCI 19456 DO TIMREA0
SETB EA ;OGOLNE ZEZWOLENIE NA PRZERWANIE
SETB ET0 ;ZEZWOLENIE NA PRZERWANIE OD TIMER'A0
SETB TR0 ;URUCHOMIENIE TIMERA
CLR P1.7 ;ZAPALENIE DIODY
MOV R0,#20D
NIC:
LJMP NIC
END
From: Romuald Bialy <romekb_at_nospam_polbox.com>
Subject: Re: jaka jest roznica pomiedzy tymi programami (timer 0 na 89c51)
Date: Fri, 05 Jan 2001 00:56:48 +0100
littelman wrote:
Moge tu jeszcze dodac, ze zapis do TIMERA lepiej wykonac w
nastepujacy sposób:
ORL TL0,XX
MOV TH0,XX
To chyba akurat nie wiele da bo jezeli w TL0 bylo by np 4h a Ty ORL'em
dal np. 27h to ta 7 "nakryje" te odliczone 4 co w wyniku da 27h a nie
oczekiwane 2Bh.
Mam nadzieje ze moje wywody sa czytelne.
Chyba jedynym wyjsciem (jezeli zalezy nam na dokladnosci) jest:
MOV A,TL0 ;POBIERZ AKTUALNE TL
ADD A,XL ;DODAJ WARTOSC ZAPISU TL
ADDC A,#3 ;DODAJ EXTRA 3 CYKLE (CZAS POMIEDZY ODCZYTEM A ZAPISEM TL0)
MOV TL0,A ;ZAPISZ SPOWROTEM TL
MOV TH0,XH ;ZAPISZ TH
JNC DALEJ ;PO DODAWANIU NIE BYLO PRZENIESIENIA
INC TH0 ;JESZCZE +1 DO TH
DALEJ: ...
Oczywiscie JNC i reszte przewaznie mozna sobie podarowac jezeli to TL
ladujemy mniej niz 240.
A najlepiej wykozystac timer w trybie autoreload.
--
Pozdrawiam.... Romuald Bialy
E'mail: romekb_at_nospam_polbox.com
WWW: http://www.polbox.com/r/romekb
From: "littelman" <littelman_at_nospam_wp.pl>
Subject: Re: jaka jest roznica pomiedzy tymi programami (timer 0 na 89c51)
Date: Fri, 5 Jan 2001 18:43:49 +0100
Oczywiście zapomniałem tu dodać, że warunkiem poprawnego działania jest
wykonanie ORL TL0,XX dla wartości TL0 mniejszej od XX.
Użytkownik Romuald Bialy <romekb_at_nospam_polbox.com> w wiadomości do grup
dyskusyjnych napisał:3A550DC0.BD7A4EE7_at_nospam_polbox.com...
littelman wrote:
Moge tu jeszcze dodac, ze zapis do TIMERA lepiej wykonac w
nastepujacy sposób:
ORL TL0,XX
MOV TH0,XX
To chyba akurat nie wiele da bo jezeli w TL0 bylo by np 4h a Ty ORL'em
dal np. 27h to ta 7 "nakryje" te odliczone 4 co w wyniku da 27h a nie
oczekiwane 2Bh.
Mam nadzieje ze moje wywody sa czytelne.
Chyba jedynym wyjsciem (jezeli zalezy nam na dokladnosci) jest:
MOV A,TL0 ;POBIERZ AKTUALNE TL
ADD A,XL ;DODAJ WARTOSC ZAPISU TL
ADDC A,#3 ;DODAJ EXTRA 3 CYKLE (CZAS POMIEDZY ODCZYTEM A ZAPISEM TL0)
MOV TL0,A ;ZAPISZ SPOWROTEM TL
MOV TH0,XH ;ZAPISZ TH
JNC DALEJ ;PO DODAWANIU NIE BYLO PRZENIESIENIA
INC TH0 ;JESZCZE +1 DO TH
DALEJ: ...
Oczywiscie JNC i reszte przewaznie mozna sobie podarowac jezeli to TL
ladujemy mniej niz 240.
A najlepiej wykozystac timer w trybie autoreload.
--
> Pozdrawiam.... Romuald Bialy
> E'mail: romekb_at_nospam_polbox.com
> WWW: http://www.polbox.com/r/romekb
>
>
From: jfox_at_nospam_friko6.onet.pl (J.F.)
Subject: Re: jaka jest roznica pomiedzy tymi programami (timer 0 na 89c51)
Date: 5 Jan 2001 18:09:59 GMT
On Fri, 05 Jan 2001 00:56:48 +0100, Romuald Bialy <romekb_at_nospam_polbox.com> wrote:
Moge tu jeszcze dodac, ze zapis do TIMERA lepiej wykonac w
nastepujacy sposób:
ORL TL0,XX
To chyba akurat nie wiele da bo jezeli w TL0 bylo by np 4h a Ty ORL'em
dal np. 27h to ta 7 "nakryje" te odliczone 4 co w wyniku da 27h a nie
oczekiwane 2Bh.
Bo to sie robi jak XX zawiera pare ostatnich bitow wyzerowanych :-)
Chyba jedynym wyjsciem (jezeli zalezy nam na dokladnosci) jest:
MOV A,TL0 ;POBIERZ AKTUALNE TL
ADD A,XL ;DODAJ WARTOSC ZAPISU TL
ADDC A,#3 ;DODAJ EXTRA 3 CYKLE (CZAS POMIEDZY ODCZYTEM A ZAPISEM TL0)
A nie przypadkiem 4 ?
Zwykle moglbys uniknac tego ADDC - gdyby wartosc XL byla o nie skorygowana...
MOV TL0,A ;ZAPISZ SPOWROTEM TL
MOV TH0,XH ;ZAPISZ TH
JNC DALEJ ;PO DODAWANIU NIE BYLO PRZENIESIENIA
INC TH0 ;JESZCZE +1 DO TH
A inc TH0 dziala?
DALEJ: ...
W zlosliwym przypadku to chyba i tak moze sie okazac ze po ADDC wyjdzie
255, ale jak wpiszemy TH0, to w TL0 juz bedzie 0 ...
J.
From: Romuald Bialy <romekb_at_nospam_polbox.com>
Subject: Re: jaka jest roznica pomiedzy tymi programami (timer 0 na 89c51)
Date: Sat, 06 Jan 2001 20:26:25 +0100
"J.F." wrote:
Bo to sie robi jak XX zawiera pare ostatnich bitow wyzerowanych :-)
No tak, ale jak zalezy nam na takiej dokladnosci to rzadko tak bywa...
Chyba jedynym wyjsciem (jezeli zalezy nam na dokladnosci) jest:
MOV A,TL0 ;POBIERZ AKTUALNE TL
ADD A,XL ;DODAJ WARTOSC ZAPISU TL
ADDC A,#3 ;DODAJ EXTRA 3 CYKLE (CZAS POMIEDZY ODCZYTEM A ZAPISEM TL0)
A nie przypadkiem 4 ?
Chyba 3, bo ADD to 1 cykl, ADDC to drugi i MOV TH0,A to trzeci (czasu
pobrania TL do ACC sie nie liczy)
Zwykle moglbys uniknac tego ADDC - gdyby wartosc XL byla o nie skorygowana...
Fakt, masz 100% racji !
A inc TH0 dziala?
A czemu by nie ? To jest w koncu rejestr specjalny i zadziala tak samo
jak np. INC P1.
W zlosliwym przypadku to chyba i tak moze sie okazac ze po ADDC wyjdzie
255, ale jak wpiszemy TH0, to w TL0 juz bedzie 0 ...
Ano moze sie zdazyc, ale to sa bardzo zlosliwe przypadki. Wtedy dla
pewnosci mozemy przed modyfikacja wylaczyc licznik poprzez CLR TR0,
a potem wlaczyc SETB'item korygujac jednoczesnie dodana wartosc czasu
wylaczenia timera.
--
Pozdrawiam.... Romuald Bialy
E'mail: romekb_at_nospam_polbox.com
WWW: http://www.polbox.com/r/romekb
From: jfox_at_nospam_friko6.onet.pl (J.F.)
Subject: Re: jaka jest roznica pomiedzy tymi programami (timer 0 na 89c51)
Date: 5 Jan 2001 17:47:46 GMT
On Thu, 4 Jan 2001 22:33:27 +0100, littelman <littelman_at_nospam_wp.pl> wrote:
Moge tu jeszcze dodac, ze zapis do TIMERA lepiej wykonac w
nastepujacy sposób:
ORL TL0,XX
MOV TH0,YY
Tylko trzeba dodac ze metoda jest dobra pod warunkiem ze warunkiem
ze XX zawiera pare zer na koncach, i nie grozi nam wyscig z czasem
w ladowaniu TH ...
Mi sie wydawalo ze mimo to ze procesor nic nie robi to
i tak obsluzy przerwanie, moze jestem w bledzie
$MOD51
LJMP START
ORG 0BH
MOV TH0,#76
MOV TL0,#0
DJNZ R0,LOOP
CPL P1.7
MOV R0,#20
LOOP:
RETI
Uwaga generalna - skoro uzywasz rejestru w przerwaniu i co gorsza
pamieta wartosc miedzy przerwaniami, to nie mozesz go uzywac w glownym
programie. Jako ze R1 i R0 bywaja niezbednie potrzebne, to
lepiej sobie wyrobic nawyk ze w przerwaniu to ich nie uzywamy .
START:
ORG 100H
MOV TMOD,#01h ;USTAWIENIE TRYBU TIMERA 16 BITOWY
MOV TH0,#76 ;ZALADOWNIE WARTOSCI 19456 DO TIMREA0
MOV TL0,#0 ;ZALADOWNIE WARTOSCI 19456 DO TIMREA0
SETB EA ;OGOLNE ZEZWOLENIE NA PRZERWANIE
SETB ET0 ;ZEZWOLENIE NA PRZERWANIE OD TIMER'A0
SETB TR0 ;URUCHOMIENIE TIMERA
CLR P1.7 ;ZAPALENIE DIODY
MOV R0,#20D
I znow generalna uwaga - najpierw wypada wszystko zainicjowac,
a dopiero potem startowac przerwanie. A nie - przerwanie
lada moment nadejdzie, a my dopiero ustawiamy do R0
prawidlowa wartosc. Tu oczywiscie dziala poprawnie ...
J.
From: "littelman" <littelman_at_nospam_wp.pl>
Subject: Re: jaka jest roznica pomiedzy tymi programami (timer 0 na 89c51)
Date: Fri, 5 Jan 2001 23:08:28 +0100
Oczywiscie proponuje spróbowac na jakims symulatorze wykonac cos takiego.
Zawsze bs blad zwiazany z dlugoscia instrukcji, w czasie której
zostalo zgloszone przerwanie.
Użytkownik J.F. <jfox_at_nospam_friko6.onet.pl> w wiadomooci do grup dyskusyjnych
napisał:slrn95c261.akf.jfox_at_nospam_mars.planconsult.com.pl...
On Thu, 4 Jan 2001 22:33:27 +0100, littelman <littelman_at_nospam_wp.pl> wrote:
Moge tu jeszcze dodac, ze zapis do TIMERA lepiej wykonac w
nastepujacy sposób:
ORL TL0,XX
MOV TH0,YY
Tylko trzeba dodac ze metoda jest dobra pod warunkiem ze warunkiem
ze XX zawiera pare zer na koncach, i nie grozi nam wyscig z czasem
w ladowaniu TH ...
Mi sie wydawalo ze mimo to ze procesor nic nie robi to
i tak obsluzy przerwanie, moze jestem w bledzie
$MOD51
LJMP START
ORG 0BH
MOV TH0,#76
MOV TL0,#0
DJNZ R0,LOOP
CPL P1.7
MOV R0,#20
LOOP:
RETI
Uwaga generalna - skoro uzywasz rejestru w przerwaniu i co gorsza
pamieta wartosc miedzy przerwaniami, to nie mozesz go uzywac w glownym
programie. Jako ze R1 i R0 bywaja niezbednie potrzebne, to
lepiej sobie wyrobic nawyk ze w przerwaniu to ich nie uzywamy .
START:
ORG 100H
MOV TMOD,#01h ;USTAWIENIE TRYBU TIMERA 16 BITOWY
MOV TH0,#76 ;ZALADOWNIE WARTOSCI 19456 DO TIMREA0
MOV TL0,#0 ;ZALADOWNIE WARTOSCI 19456 DO TIMREA0
SETB EA ;OGOLNE ZEZWOLENIE NA PRZERWANIE
SETB ET0 ;ZEZWOLENIE NA PRZERWANIE OD TIMER'A0
SETB TR0 ;URUCHOMIENIE TIMERA
CLR P1.7 ;ZAPALENIE DIODY
MOV R0,#20D
I znow generalna uwaga - najpierw wypada wszystko zainicjowac,
a dopiero potem startowac przerwanie. A nie - przerwanie
lada moment nadejdzie, a my dopiero ustawiamy do R0
prawidlowa wartosc. Tu oczywiscie dziala poprawnie ...
J.
From: Romuald Bialy <romekb_at_nospam_polbox.com>
Subject: Re: jaka jest roznica pomiedzy tymi programami (timer 0 na 89c51)
Date: Thu, 04 Jan 2001 19:16:39 +0100
kobra wrote:
Bo jezeli usuniesz ta petle to program sie skonczy, obleci dookola i
znowu sie wykona od poczatku czyli fragment od etykiety START ktoryto
zapala diode (CLR P1.7). To zrobi sie znacznie szybciej, zamim dioda
zdazy zgasnac.
--
Pozdrawiam.... Romuald Bialy
E'mail: romekb_at_nospam_polbox.com
WWW: http://www.polbox.com/r/romekb