Varför oönskad försening är introuduced i Timer1 av PIC16F877A?

U

umery2k75

Guest
Jag är nöjd med koden, den kod som fungerar bra och jag vet det enkla logiska fungerande avbryter och hur man ställer in värden för att få önskad respons, men den sak som stör mig är att, varför Timer 1 startar den verksamhet mycket sent?Jag har tittat på det här i
sin databladet också, men jag kunde inte hitta någonting.Om du folk vet om detta, så säg mig, men jag kan inte hoppas att det här problemet kan besvaras.Jag tror på det här sättet, eftersom jag kunde inte hitta någonting om PIC16F877A datasheet som en faktor som har sin effekt på Timer1 drift.Jag har två koder en som gjordes runt Timer0 8-bitars och andra byggdes runt Timer1 16-bitars.

TIMER 0 (8-bit)
==========

Kod:

# include <16F877A.H>

# include <string.h>

# använda dröjsmål (clock = 03579545)

# säkringar NODEBUG, XT, NOWDT, PUT, NOPROTECT, NOLVP

# använda RS232 (baud = 2400, xmit = PIN_C6, ONU = PIN_C7)

# define INTS_PER_SECOND 6

int8 int_counts;

int8 ledstate = 0;

int8 Hun_Milli_Seconds_Count = 0;# int_rtcc

void clock_isr ()

(

if (- int_counts == 0)

(

Hun_Milli_Seconds_Count;

int_counts = INTS_PER_SECOND;

)

)void Main ()

(

set_tris_b (0x00);

output_low (PIN_B0);

setup_counters (RTCC_INTERNAL, RTCC_DIV_64);

enable_interrupts (INT_RTCC);

enable_interrupts (GLOBAL);

samtidigt (1)

(

if (Hun_Milli_Seconds_Count == 0) / / utgör ca.
en sek

(

output_high (PIN_B0);

)if (Hun_Milli_Seconds_Count == 1) / / utgör ca.
en sek

(

output_low (PIN_B0);

)if (Hun_Milli_Seconds_Count == 2) / / utgör ca.
en sekHun_Milli_Seconds_Count = 0;

))
 
Hej,
Tilldela Int_Count värden på 6 för första rutinmässiga och 1 för andra rutin i början av programmet.

Hälsningar,
Laktronics

 
Citat:

Tilldela Int_Count värden på 6 för första rutinmässiga och 1 för andra rutin i början av programmet.
 
Hej,
Du tilldela 1 för samma variabel i 16bit timer rutin.
Hälsningar,
Laktronics

 
Hej Laktronics,to you and secondly I was thinking what would I do, if you didn't read my post?

Vet du vad, den sak som du berättade för mig att tilldela variabel int räknas = 1 bara fungerat perfekt i Timer1 och nu min kod fungerar bra i Timer1.The första jag vill säga är ett stort tack
till dig och det andra jag tänkte vad skulle jag göra, om du inte läst mina inlägg?
du skulle inte ha svarat mig och jag kan ännu inte lösa detta problem.The hur du detta problem was great! Approaching ett problem är ett konstverk måste jag säga.Enligt matematikern George Polya det finns ett bästa sätt att närma sig ett problem och han skrev tre böcker om den

<img src="http://www.edaboard.com/images/smiles/icon_biggrin.gif" alt="Very Happy" border="0" />

Läggas till efter 6 minuter:Första sak att lägga märke till i mitt program var att den rörliga int_counts inte initieras till en konstant, så det kunde ha något okänt värde i det.

I Timer0 programmera variabel int_counts måste ha mindre värde såsom 1,5
mm

Så när jag runned detta program.I såg lysdioden arbetar ON / OFF rätt direkt.

I Timer1 programmera variabel int_counts måste ha några stora värde gillar 50,60
mm

Så när jag runned det programmet jag såg den enorma försening, sedan min timer började arbeta ordentligt.

 
Hej,
Glömma att initiera variabler är ett vanligt problem med C och många gånger kommer det inte att visa upp eftersom C tilldelar nollvärde att dessa variabler.I ditt fall, eftersom du subtrahera första och kontroll för noll, den rörliga int_counts blir INT8 Max värde (255) efter avdrag och du behöver så många avbryter innan du increment 100_msec register, hela lampan fortfarande på.

Dessutom anser jag att lysdioden blinkar är inte densamma i båda timern fall.Om så är fallet kan du göra det samma med int_counts_persec till 32 timer 0-program, om jag inte har missat someyhing annat i koden.

Hälsningar,
Laktronics

 

Welcome to EDABoard.com

Sponsor

Back
Top