8051 i 1sekunda

Aug 14, 2005 6 Replies

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) { }



}



...

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;}

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³

Paweł Cern snipped-for-privacy@surname.neostrada.pl> napisał(a):

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

U¿ytkownik "Piotrek Sz." snipped-for-privacy@NOSPAM.gazeta.pl> napisa³ w wiadomo¶ci news:ddohiq$o0o$ snipped-for-privacy@inews.gazeta.pl...

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

U¿ytkownik "Lukas" snipped-for-privacy@spam.com napisa³ w wiadomo¶ci news:ddplvj$10q$ snipped-for-privacy@atlantis.news.tpi.pl...

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 :)

Użytkownik Lukas napisał:

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

Lukas napisal:

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

Join the Discussion

Have something to add? Share your thoughts — no account required.

Didn't find your answer?

Ask the community — no account required