این منطقی که شما شرح دادی یه کوچولو با اون چیزی که در ابتدا گفتی فرق فوکوله!!
من بسکام ندارم. ببین این کد جواب میده یا نه (همون کد قبلی ولی با فرم جدید.) فرض رو بر این میذارم که میکروی شما مگا هشت هست و با سرعت 8 مگا هرتز.
$regfile = "m8def.dat"
$crystal = 8000000
Enable Int0
On Interrupt Int0 Int_test
Config Int0 = Rising
Config Portc = Output
Config Pind.2 = Input
Config Timer0 = Timer, Prescale = 64 ' 8000 / 64 => 125 KHz
On Ovf0 Tim0_isr
Dim F As Byte
Dim RemainTime As Word
RemainTime = 0
Tcnt0 = 255 - 125
Start Timer0
Enable Interrupts
Main:
Do
Loop
End
Tim0_isr:
Tcnt0 = 255 - 125
If RemainTime = 0 Then
Reset Portc.1
Else
RemainTime = RemainTime - 1
EndIf
Return
Int_test:
RemainTime = 10000
Set Portc.1
Return
تایمر صفر برای سرعت 125 کیلو هرتز ست شده. و هر بار پس از 125 مرحله شمارش یکبار وقفه میده. در حین وقفه تایمر رو ریست میکنه و چک میکنه اگه زمانی برای صبر کردن هست از این زمان یکی کم میکنه. اگر زمان سپری شده باشه پورت خروجی رو صفر میکنه. از طرفی با بروز وقفه IRQ0 زمان 10 ثانیه یا همون 10000 میلی ثانیه ست میشه.
به این صورت مادامی که قبل از 10 ثانیه دوباره وقفه فعال بشه باز پورت مربوطه ست میشه و زمان باقی مانده به 10 ثانیه افزایش پیدا میکنه. اما در انتهای 10 ثانیه پورت مربوطه صفر میشه.