| Forfatter | Melding |
|---|
semiconductor
Joined: 04 Apr 2003 Innlegg: 294 Hjalp: 3 Sted: Frankrike
| 27 april 2005 18:02 timeout i 89C51/89C52 | | |
|
| Jeg er tilordnet en øvelse for å programmere en AT89C51 for automatisk dør prosjektet.
Jeg står overfor et problem: TIMEOUT
Hvis den ytre sensoren oppdager folk tilgjengelig, vil det åpne døren og ventet indre sensoren oppdager folk tilgjengelig. Etter 20s, hvis ingen signaler finnes det automatisk lukke døren og gå tilbake til begynnelsen av programmet (venter på signal fra ytterdøren.
med AT89C51 Jeg programmering i C, men jeg vet ikke hvordan å designe TIMEOUT algoritmen med AT89C51 (20 sekunder).
Kan noen anbefale meg løsninger? |
|
| Tilbake til toppen | |
 |
IanP
Joined: 05 Oct 2004 Innlegg: 6490 Hjalp: 1542 Sted: West Coast
| 28 april 2005 1:25 Re: timeout i 89C51/89C52 | | |
|
| Bruk TIMER1 i MODE1 (16-bit counter) teller (Fclock/12): FFFFh. Hvis krystall er 11.0952MHz avbruddet vil skje hver (11095200/12) / 65536 = 14,108 .. ganger per sekund. Lag variabel TimeH og TimeL. Øk TimeHTimeL hvert avbrudd. For å komme til 20 sekunder vil du trenge ≈ 282 avbryter og som vil forlate TimeHTimeL = 01 1A (h) = 0282 (d). Nå kan du tilbakestille 20s counter (TimeHTimeL) og utføre hva som bør gjøres etter 20s ..
Lykke til .. |
|
| Tilbake til toppen | |
 |
mrcube_ns
Joined: 10 april 2002 Innlegg: 429 Hjalp: 11 Location: Dark side of the Moon
| 28 april 2005 21:17 Re: timeout i 89C51/89C52 | | |
|
| IanP er completly right,
men, foreslår jeg å bruke 12MHz krystall, slik at en syklus er 1US.
Deretter kan du bruke timer 1 som 16-bits timer og gjorde 50ms timer (T1H = 0x3C T1L = 0xAF), så du har 20 teller i ett sekund => til rike 20sec du trenger nøyaktig 400 teller.
Med vennlig hilsen,
Mr.Cube |
|
| Tilbake til toppen | |
 |
Google AdSense

| 28 april 2005 21:17 Annonser | | |
|
|
|
|
| Tilbake til toppen | |
 |
Hero
Joined: 06 Mar 2002 Innlegg: 145 Hjalp: 2
| 29 april 2005 3:51 Re: timeout i 89C51/89C52 | | |
|
| Hei,
For lang tidsperiode må du Sotware teller.
Bruk 16-bits maskinvare counter for periodisk intterupt generasjon.
I avbryte tjenesten rutinemessig satt CNT_FLAG variabel.
unsigned char CNT_FLAG; unsigned long cnt; unsigned char TIMEOUT; unsigned char TIMEOUT_ENABLED;
# define TIMEOUT_THRESHOLD 1024
void interrupt_routine () ( CNT_FLAG = 1; )
void main () ( init ();
mens 1 () ( ... cnt_process (); sleep (); / / gå til hvilemodus ) )
void cnt_process () ( if (CNT_FLAG) ( CNT_FLAG = 0; if (TIMEOUT_ENABLED) ( if (cnt <TIMEOUT_THRESHOLD) cnt ; TIMEOUT = (cnt == TIMEOUT_THRESHOLD); ) ) )
Når cnt nå TIMEOUT_THRESHOLD TIMEOUT vil bli satt.
En annen løsning er å øke cnt i avbruddet rutinen
void interrupt_routine () ( if (TIMEOUT_ENABLED) ( if (cnt <TIMEOUT_THRESHOLD) cnt ; TIMEOUT = (cnt == TIMEOUT_THRESHOLD); ) ) |
|
| Tilbake til toppen | |
 |