اطلاعیه

Collapse
No announcement yet.

خطای سرریزی ISR تایمر، کانتر در بسکام

Collapse
X
 
  • فیلتر
  • زمان
  • Show
Clear All
new posts

    خطای سرریزی ISR تایمر، کانتر در بسکام

    با سلام
    روی یک پروژه سنسور رطوبت HS1101 دارم کار می کنم و بابت راه اندازی آن مشکلی نیست ولی زمانی که خواستم روی برنامه آن دستکاری کنم به یه مشکل عجیب بر خوردم.
    شاید خیلی از دوستان از این برنامه راه اندازی رطوبت سنج و کار با تایمر صفر و کانتر 1 آن استفاده کرده باشند در بخشی از این دستور در زمان سرریزی تایمر با دستور
    on ovf0 lable و on ovf1 Pulsecount به lable مورد نظر پرش کرده و ISR سرریزی را اجرا می کند. این حالت در یک LOOP به فرض از F1 شروع و با دستور GOTO F1 بر می گردد .
    ولی زمانی که خواستم دوباره در یک LOOP دیگر به فرض از F2 شروع و با دستور برگشت GOTO F2 بر گردم خطای 249 یعنی ISR از قبل تعیین شده را می دهد. حتی نام LABLE را عوض کردم باز این خطا را داد.

    اینم برنامه من

    F1:
    Config Timer1 = Counter , Edge = Rising
    Config Timer0 = Timer , Prescale = 1024
    Enable Interrupts
    Enable Timer0
    Enable Timer1
    On Ovf1 Pulsecount
    On Ovf0 Lable
    Start Timer0
    '-----------------------------------------------------
    1wreset

    If Err = 1 Then
    Lcdat 1 , 1 , "" '
    Else
    1wwrite &HCC
    1wwrite &H44
    Waitms 100
    1wreset
    1wwrite &HCC
    1wwrite &HBE

    I1 = 1wread()
    I2 = 1wread()
    I = Makeint(i1 , I2)
    Temp = I / 16
    Lcdat 2 , 1 , Temp
    End If
    Goto F1

    Lable:
    Incr C
    If C > 30 Then
    Stop Timer0
    M = -7587.2
    A = B * 65536
    A = A + Counter1
    A = A - 110
    U = A - 7351
    U = U * M
    U = U / 100000
    Lcdat 1 , 1 , U ; "% "
    '***********************************
    If U < 50 Then
    Set Portb.7
    Else
    Reset Portb.7
    End If
    '***********************************
    B = 0
    C = 0
    Counter1 = 0
    Start Timer0
    End If
    Return
    Pulsecount:
    Incr B : Counter1 = 0
    Return

    F2:
    Config Timer1 = Counter , Edge = Rising
    Config Timer0 = Timer , Prescale = 1024
    Enable Interrupts
    Enable Timer0
    Enable Timer1
    On Ovf1 Pulsecount1
    On Ovf0 Lable1

    Start Timer0
    If Pinb.5 = 1 Then Goto U5
    '-----------------------------------------------------
    1wreset

    If Err = 1 Then
    Lcdat 1 , 1 , "" '
    Else
    1wwrite &HCC
    1wwrite &H44
    Waitms 100
    1wreset
    1wwrite &HCC
    1wwrite &HBE

    I1 = 1wread()
    I2 = 1wread()
    I = Makeint(i1 , I2)
    Temp = I / 16
    Lcdat 2 , 1 , Temp
    End If
    Goto F2

    Lable1:
    Incr C
    If C > 30 Then
    Stop Timer0
    M = -7587.2
    A = B * 65536
    A = A + Counter1
    A = A - 110
    U = A - 7351
    U = U * M
    U = U / 100000
    Lcdat 1 , 1 , U ; "% "
    '***********************************
    If U < 70 Then
    Set Portb.7
    Else
    Reset Portb.7
    End If
    '***********************************
    B = 0
    C = 0
    Counter1 = 0
    Start Timer0
    End If
    Return
    Pulsecount1:
    Incr B : Counter1 = 0
    Return

    این دو تا خط قرمز را نرم افزار خطا 249 (ISR Already Defined ) می دهد.
    لطف راهنمایی کنین
    با تشکر

    #2
    پاسخ : خطای سرریزی ISR تایمر، کانتر در بسکام

    سلام
    شما نمیتونی دوبار برای سرریزی لیبل تعریف کنی,شما یک لیبل کلی تعریف کن وبراساس متغیر اعمال خاص اون متغیر رو انجام بده...این برنامه رو خودم نوشتم
    مطالعه کنید..
    کد:
    $regfile = "m16def.dat"
    $crystal = 8000000
    Config Lcdpin = Pin , Db4 = Portc.4 , Db5 = Portc.5 , Db6 = Portc.6 , _
    Db7 = Portc.7 , E = Portc.3 , Rs = Portc.2
    Config Lcd = 16 * 2
    Config Portd = Input
    Config Debounce = 30
    
    Deflcdchar 2 , 1 , 3 , 7 , 15 , 15 , 7 , 3 , 1
    
    Dim Main As Byte
    
    
    
    
    Cls
    
    Do
    
    
     Locate 1 , 1
     Lcd "process...?"
     Locate 2 , 1
     Lcd "volt.m"
     Locate 2 , 10
     Lcd "freq.m"
    
    
     Debounce Pind.0 , 0 , Selection1 , Sub
     Debounce Pind.1 , 0 , Selection2 , Sub
    
     If Main = 1 Then
     Locate 1 , 1
     Lcd "process...?"
     Locate 2 , 1
     Lcd "volt.m" ; Chr(2)
     Locate 2 , 10
     Lcd "freq.m" : End If
     If Main = 2 Then
     Locate 1 , 1
     Lcd "process...?"
     Locate 2 , 1
     Lcd "volt.m"
     Locate 2 , 10
     Lcd "freq.m" ; Chr(2) : End If
    
    While Main = 1
     Config Adc = Single , Prescaler = Auto , Reference = Avcc
     Config Timer1 = Timer , Prescale = 64
     Dim U As Word , V As Single , Vrms As Single , A As Byte , T As Single
      On Timer1 Timer1_reg
     Enable Timer1
     Enable Interrupts
    
     Timer1 = 3036
     Start Timer1
     Vrms = 0
     A = 0
     T = 0
     Start Adc
    
     Do
    
      U = Getadc(0)
      V = U
      V = V * 0.004887
      V = V * 3
      V = V ^ 2
      Vrms = Vrms + V
      T = T + 1
    
     Loop Until A = 1
    
     T = 0.5 / T
     Vrms = Vrms * T
     Vrms = Vrms / 0.5
     Vrms = Sqr(vrms)
    
     Cls
    
     Lcd "vrms(v)=" ; Vrms
    
    Wend
    
    While Main = 2
     Config Timer1 = Counter , Edge = Rising
     Config Timer0 = Timer , Prescale = 1024
     Enable Interrupts
     Enable Timer0
     Enable Ovf1
    
    
     On Timer0 Main2
    
     Dim Freq As Long , Overflow1 As Byte , Overflow0 As Long
    
     Overflow1 = 0
     Start Timer0
     Do
     Loop
    
    Wend
    
    Loop
    End
    
    Main2:
     Incr Overflow0
     If Overflow0 > 30 Then
     Stop Timer0
     Cls
     Freq = Overflow1 * 65536
     Freq = Freq + Counter1
     Lcd "frequency:" ; Freq
     Overflow1 = 0
     Overflow0 = 0
     Counter1 = 0
     Start Timer0
     End If
    Return
    
    
    
    Timer1_reg:
    If Main = 1 Then
     Timer1 = 3036
     A = 1
    End If
    If Main = 2 Then
     Incr Overflow1
    Counter1 = 0
    End If
    
    Return
    
    
    Selection1:
    Cls
    Main = 1
    
    Return
    
    Selection2:
    Cls
    Main = 2
    
    Return

    دیدگاه

    لطفا صبر کنید...
    X