8051 i 1sekunda



Masz problem? Zapytaj na forum elektroda.pl

Poprzedni Następny
Wiadomość
Spis treści
From: "Lukas" <no_at_nospam_spam.com>
Subject: 8051 i 1sekunda
Date: Sun, 14 Aug 2005 22:33:12 +0200


nie mogę wcelować 1 sekundę. Chce żeby na porcie P1 co 1s zmieniał się stan.
Wyliczyłem sobie to w ten deseń że:
11059200/12=921600 cykli w ciągu 1s zatem
0.05 (1/20 sekundy) * 921600 = 46080 cyrkli w wciągu 1/20 sekundy zatem
max wartość 65535 (16bit timer T0) - 46080 = 19456
przekładając to na HEX daje 4C00 gdzie TH0=0x4c a TL0=0
następnie odpalam zmienna inkrementując ja i jeśli będzie 20 zmieniam stan,
ale jakoś z 1 sekunda to się trochę mocno mija, czy może ktoś wie gdzie
mogłem
zrobić błąd?
Przedstawiam poniżej kod

#include <8051.h>

unsigned char zn;

void pr1() interrupt 1 using 1
{
if ( zn == 19 ) P1 = 0;
if ( zn == 38 ) {P1 = 1; zn = 0;}
TR0 = 0;
TH0 = 0x4c;
TL0 = 0;
TR0 = 1;
zn++;
}


void main(void)
{

TH0 = 0x4C;
TL0 = 0;
TMOD = 0x01;
EA = 1;
ET0 = 1;

TR0 = 1;
zn = 0;


while(1)
{
}

}






Poprzedni Następny
Wiadomość
Spis treści
From: "Paweł Cern" <name_at_nospam_surname.neostrada.pl>
Subject: Re: 8051 i 1sekunda
Date: Mon, 15 Aug 2005 00:28:16 +0200


Przedstawiam poniżej kod
...

if ( zn == 19 ) P1 = 0;
if ( zn == 38 ) {P1 = 1; zn = 0;}

Rozumiem że 20 cykli ma trwać 1 i tyle samo 0. Zatem jeśli dobrze liczę 1
będzie dla zn od 0 do 19 włącznie, a 0 dla zn od 20 do 39 włącznie.

Czyli:
if(zn==20) P1=0;
if(zn==40) {P1=1; zn=0;}

TR0 = 0;
TH0 = 0x4c;
TL0 = 0;

Tego nie powinieneś robić, dojście do tego miejsca zajmuje trochę czasu
(aczkolwiek niewiele) i wprowadzasz niedokładności (niewielkie, ale są).
Zatem lepiej jest korygować tylko bardziej znaczącą połówkę timera bez
zatrzymywania timera.

Paweł



Poprzedni Następny
Wiadomość
Spis treści
From: "Piotrek Sz." <zumek_at_nospam_NOSPAM.gazeta.pl>
Subject: Re: 8051 i 1sekunda
Date: Sun, 14 Aug 2005 22:45:46 +0000 (UTC)


Paweł Cern <name_at_nospam_surname.neostrada.pl> napisał(a):

Przedstawiam poniżej kod
....

if ( zn == 19 ) P1 = 0;
if ( zn == 38 ) {P1 = 1; zn = 0;}

Rozumiem że 20 cykli ma trwać 1 i tyle samo 0. Zatem jeśli dobrze liczę 1
będzie dla zn od 0 do 19 włącznie, a 0 dla zn od 20 do 39 włącznie.

Czyli:
if(zn==20) P1=0;
if(zn==40) {P1=1; zn=0;}

TR0 = 0;
TH0 = 0x4c;
TL0 = 0;

Tego nie powinieneś robić, dojście do tego miejsca zajmuje trochę czasu
(aczkolwiek niewiele) i wprowadzasz niedokładności (niewielkie, ale są).
Zatem lepiej jest korygować tylko bardziej znaczącą połówkę timera bez
zatrzymywania timera.

Paweł



Zgadzam się z Pawłem , ale ... nie całkowicie ;)
50 ms/1 s (5%) spóźnienia , nie uznałbym za "(niewielkie, ale są)".

void pr1() interrupt 1 using 1
{
if ( zn == 20 ) P1 = 0;
if ( zn == 40 ) {P1 = 1; zn = 0;}
// TR0 = 0;
TH0 = 0x4c;
// TL0 = 0;
// TR0 = 1;
zn++;
}
Po powyższych zmianach błąd wynosi ~20 us co myślę , że można uznać za
"(niewielkie, ale są)" ;-)

Pozdrawiam
Piotrek


--
Wysłano z serwisu Usenet w portalu Gazeta.pl -> http://www.gazeta.pl/usenet/

Poprzedni Następny
Wiadomość
Spis treści
From: "Lukas" <no_at_nospam_spam.com>
Subject: Re: 8051 i 1sekunda
Date: Mon, 15 Aug 2005 11:06:55 +0200



Użytkownik "Piotrek Sz." <zumek_at_nospam_NOSPAM.gazeta.pl> napisał w wiadomości
news:ddohiq$o0o$1_at_nospam_inews.gazeta.pl...
Paweł Cern <name_at_nospam_surname.neostrada.pl> napisał(a):

Przedstawiam poniżej kod
....

if ( zn == 19 ) P1 = 0;
if ( zn == 38 ) {P1 = 1; zn = 0;}

Rozumiem że 20 cykli ma trwać 1 i tyle samo 0. Zatem jeśli dobrze liczę
1
będzie dla zn od 0 do 19 włącznie, a 0 dla zn od 20 do 39 włącznie.

Czyli:
if(zn==20) P1=0;
if(zn==40) {P1=1; zn=0;}

TR0 = 0;
TH0 = 0x4c;
TL0 = 0;

Tego nie powinieneś robić, dojście do tego miejsca zajmuje trochę czasu
(aczkolwiek niewiele) i wprowadzasz niedokładności (niewielkie, ale są).
Zatem lepiej jest korygować tylko bardziej znaczącą połówkę timera bez
zatrzymywania timera.

Paweł



Zgadzam się z Pawłem , ale ... nie całkowicie ;)
50 ms/1 s (5%) spóźnienia , nie uznałbym za "(niewielkie, ale są)".

void pr1() interrupt 1 using 1
{
if ( zn == 20 ) P1 = 0;
if ( zn == 40 ) {P1 = 1; zn = 0;}
// TR0 = 0;
TH0 = 0x4c;
// TL0 = 0;
// TR0 = 1;
zn++;
}
Po powyższych zmianach błąd wynosi ~20 us co myślę , że można uznać za
"(niewielkie, ale są)" ;-)

dzieki, ale nadal nie jest to tak zblizone :/ zeby roznica byla malutka
minimalnie za szybko gasnie i za szybko sie zapala, co w efekcie po
"5s" powoduje ze mierzac na drugim zegarku czas te 5 sekund wypada
w 4,5s gdzies. Widac golym okiem ze jest nierowno.

na porcie P1 podpialem diode zeby testowac takie cos.
zatem zapala sie ona na 20 cylki i gasnie na 20 cylkli.
Moze trzeba skorygowac o kod ktory sie wykonuje?
No i czy tak mozna modyfikowac licznik kiedy pracuje?

Pozdrwaiam i dzieki z gory



Poprzedni Następny
Wiadomość
Spis treści
From: "Lukas" <no_at_nospam_spam.com>
Subject: Re: 8051 i 1sekunda
Date: Mon, 15 Aug 2005 11:29:33 +0200



Użytkownik "Lukas" <no_at_nospam_spam.com> napisał w wiadomości
news:ddplvj$10q$1_at_nospam_atlantis.news.tpi.pl...

Użytkownik "Piotrek Sz." <zumek_at_nospam_NOSPAM.gazeta.pl> napisał w wiadomości
news:ddohiq$o0o$1_at_nospam_inews.gazeta.pl...
Paweł Cern <name_at_nospam_surname.neostrada.pl> napisał(a):

Przedstawiam poniżej kod
....

if ( zn == 19 ) P1 = 0;
if ( zn == 38 ) {P1 = 1; zn = 0;}

Rozumiem że 20 cykli ma trwać 1 i tyle samo 0. Zatem jeśli dobrze
liczę
1
będzie dla zn od 0 do 19 włącznie, a 0 dla zn od 20 do 39 włącznie.

Czyli:
if(zn==20) P1=0;
if(zn==40) {P1=1; zn=0;}

TR0 = 0;
TH0 = 0x4c;
TL0 = 0;

Tego nie powinieneś robić, dojście do tego miejsca zajmuje trochę
czasu
(aczkolwiek niewiele) i wprowadzasz niedokładności (niewielkie, ale
są).
Zatem lepiej jest korygować tylko bardziej znaczącą połówkę timera bez
zatrzymywania timera.

Paweł



Zgadzam się z Pawłem , ale ... nie całkowicie ;)
50 ms/1 s (5%) spóźnienia , nie uznałbym za "(niewielkie, ale są)".

void pr1() interrupt 1 using 1
{
if ( zn == 20 ) P1 = 0;
if ( zn == 40 ) {P1 = 1; zn = 0;}
// TR0 = 0;
TH0 = 0x4c;
// TL0 = 0;
// TR0 = 1;
zn++;
}
Po powyższych zmianach błąd wynosi ~20 us co myślę , że można uznać za
"(niewielkie, ale są)" ;-)

dzieki, ale nadal nie jest to tak zblizone :/ zeby roznica byla malutka
minimalnie za szybko gasnie i za szybko sie zapala, co w efekcie po
"5s" powoduje ze mierzac na drugim zegarku czas te 5 sekund wypada
w 4,5s gdzies. Widac golym okiem ze jest nierowno.

na porcie P1 podpialem diode zeby testowac takie cos.
zatem zapala sie ona na 20 cylki i gasnie na 20 cylkli.
Moze trzeba skorygowac o kod ktory sie wykonuje?
No i czy tak mozna modyfikowac licznik kiedy pracuje?

Pozdrwaiam i dzieki z gory


troche cos zle pomyslalem :)
po 40cylki ustawilem i teraz wypada po oklo 1s
czasem trudno samemu zalapac oco chodzi.

Dla zainteresowanych testowaniem bez symulatora
i uruchamiania bez uzycia programatora informuje
ze kozystam z procka philipsa 89c51rd2 w polaczeniu
z max232 (HIN232). PSEN sie zwieram do 0ra, potem
plik HEX przez program Flash Magic wrzuca sie do procka
i jest cacy :)



Poprzedni Następny
Wiadomość
Spis treści
From: Pawel Tomulik <ptomulik_at_nospam_wp.pl>
Subject: Re: 8051 i 1sekunda
Date: Fri, 19 Aug 2005 12:54:15 +0200


Użytkownik Lukas napisał:
nie mogę wcelować 1 sekundę. Chce żeby na porcie P1 co 1s zmieniał się stan.
Wyliczyłem sobie to w ten deseń że:
11059200/12=921600 cykli w ciągu 1s zatem
0.05 (1/20 sekundy) * 921600 = 46080 cyrkli w wciągu 1/20 sekundy zatem
max wartość 65535 (16bit timer T0) - 46080 = 19456
przekładając to na HEX daje 4C00 gdzie TH0=0x4c a TL0=0
następnie odpalam zmienna inkrementując ja i jeśli będzie 20 zmieniam stan,
ale jakoś z 1 sekunda to się trochę mocno mija, czy może ktoś wie gdzie
mogłem
zrobić błąd?

Mocno się mija?

Może któraś z poniższych informacji pomoże:

Mode 0
Putting either Timer into Mode 0 makes it look like an 8048 Timer,
which is an 8-bit Counter with a *divide-by-32 prescaler*[...]

Jakby sugerowali dodatkowy podzial 1/32 ...

Mode 1
Mode 1 is the same as Mode 0, except that the Timer register is
being run with all 16 bits.



Jest jeszcze zdaje się rejestr CKCON i tam bit X2, który umożliwia
przestawienie procka w tryb pracy 1/6 (default jest chyba 1/12).
oraz T0X2 ktory wlacza prescaler 1/2 dla zgara T0. Warto sprawdzic jakie
mają wartości (CKCON zdaje sie moze byc tylko programowany przez
parallel programmer).

--
~~~~~~~~~~~ Pawel Tomulik ~~~~~~~~~~~
~~~~~~~~~~~ GG:2800492 ~~~~~~~~~~~

Poprzedni Następny
Wiadomość
Spis treści
From: Dylon <szukaj_at_nospam_w.naglowku>
Subject: Re: 8051 i 1sekunda
Date: Fri, 19 Aug 2005 21:35:38 +0200


Lukas napisal:

nie mogę wcelować 1 sekundę. Chce żeby na porcie P1 co 1s zmieniał się
Na studiach na laborce mialem taki fajny sprzetowy uklad z 8051 i jesli mnie
pamiec nie myli to zeby to bylo dokladnie to trzeba sobie wyliczyc ile
cykli bedzie sie wykonywal program do miejsca ustawiania timerow i ew.
odpowiednio skorygowac.. (ale to juz sugerowal ci ktos ponizej a ja
przyznam ze za bardzo nie pamietam juz jak to szlo ) :(

Wlasnie sie doszukalem jakis prostych programikow z tych laborek. tu jest
jakis przyklad z timerem ale za chiny nie przypomne sobie szczegolow.
podejrzewam ze ma mrugac diodami na wyjsciu co iles... :
CZEST EQU 50000
CZAS EQU 10
WYJSCIE BIT P5.1

DSEG AT 20H
LICZ: DS 1

CSEG AT 8000H
AJMP START
ORG 802BH
DJNZ LICZ,KON
MOV LICZ,#CZAS
INC A
MOV P4,A
SETB WYJSCIE
CLR WYJSCIE
KON: CLR TF2
RETI
NOP
NOP
ORG 8100H
START: CLR WYJSCIE
MOV LICZ,#CZAS
; USTAWIENIE T2
MOV CRCL,#LOW(10000H-CZEST)
MOV CRCH,#HIGH(10000H-CZEST)
MOV TH2,#HIGH(10000H-CZEST)
MOV TL2,#LOW(10000H-CZEST)
MOV T2CON,#91H
SETB ET2
; START
MOV A,#1
MOV P4,A
SETB WYJSCIE
CLR WYJSCIE
SETB EAL
LJMP $
NOP
NOP
END

moze ci sie przyda do czegos...

Pozdrawiam
--
Maciej Dylski
adres: szukaj w naglowku