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)





Poprzedni Następny
Wiadomość
Spis treści
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


Poprzedni Następny
Wiadomość
Spis treści
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



Poprzedni Następny
Wiadomość
Spis treści
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


Poprzedni Następny
Wiadomość
Spis treści
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




Poprzedni Następny
Wiadomość
Spis treści
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



Poprzedni Następny
Wiadomość
Spis treści
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
>
>



Poprzedni Następny
Wiadomość
Spis treści
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.


Poprzedni Następny
Wiadomość
Spis treści
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



Poprzedni Następny
Wiadomość
Spis treści
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.


Poprzedni Następny
Wiadomość
Spis treści
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.




Poprzedni Następny
Wiadomość
Spis treści
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