اطلاعیه

Collapse
No announcement yet.

کمک برای اصلاح برنامه ساعت

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

    کمک برای اصلاح برنامه ساعت

    سلام به همه
    من یک برنامه ساعت با بسکام نوشتم البته ساعت دقیق نیست ، تو پروتیوس که اجراش می کنم دقیقه اول رو درست می ره دقیقه دوم که می خواد شروع شه اول اینکه از 19 شروع می شه بعد 29 و بعد39 ، 10 تا10 تا اضافه می کنه ، کسی می تونه بگه اشکال برنامه من کجاست؟
    در ضمن در عمل که می بندم رو ؟رو lcd هیچی نشون نمی ده !!!! :cry2:
    plz help me
    زندگی تاس خوب آوردن نیست ، تاس بد را خوب بازی کردن است

    #2
    پاسخ : کمک برای اصلاح برنامه ساعت

    ببخشید یادم رفت برنامه رو بذارم :biggrin:
    اینم برنامه :


    $regfile = "m16def.dat"
    $crystal = 8000000
    Config Lcd = 16 * 2
    Config Lcdbus = 4
    Config Lcdpin = Pin , Db7 = Portc.7 , Db6 = Portc.6 , Db5 = Portc.5 , _
    Db4 = Portc.4 , E = Portc.3 , Rs = Portc.2
    '$prog &HFF , &HA4 , &HD9 , &H00 ' generated. Take care that the chip supports all fuse bytes..2
    Config Porta.1 = Input
    Config Porta.2 = Input
    Dim H As Byte
    Dim M As Byte
    Dim S As Byte
    Dim A As Byte
    H = 0 : A = 0 : M = 0 : S = 0
    Config Timer0 = Timer , Prescale = 1024
    Enable Interrupts
    Enable Timer0
    Enable Ovf0
    Timer0 = 0
    On Ovf0 Clock
    Start Timer0
    Do
    If Pina.1 = 1 Then
    Incr H
    If H > 23 Then
    H = 0
    End If
    End If
    If Pina.2 = 1 Then
    Incr M
    If M > 59 Then
    M = 0
    End If
    End If
    Cursor Off '
    Home
    Lcd "H M S "
    Locate 2 , 1
    Lcd H
    Locate 2 , 5
    Lcd M
    Locate 2 , 9
    Lcd S
    Locate 2 , 3
    Lcd ":"
    Locate 2 , 7
    Lcd ":"
    Loop
    End
    Clock:
    Incr A
    If A > 30 Then
    Incr S
    If S > 59 Then
    Incr M
    S = 0
    End If
    If M > 59 Then
    Incr H
    M = 0
    End If
    If H > 23 Then
    H = 0
    End If
    End If
    Timer0 = 0
    Start Timer0
    Return

    زندگی تاس خوب آوردن نیست ، تاس بد را خوب بازی کردن است

    دیدگاه


      #3
      پاسخ : کمک برای اصلاح برنامه ساعت

      برای این که شما lcd رو پاک نمی کنی و اعداد جدید رو کنار اعداد قدیم نمایش داده میشه این اتفاق افتاده ، تو حلقه do loop به جای home بنویس cls:home مثل باقلوا کار میکنه

      دیدگاه


        #4
        پاسخ : کمک برای اصلاح برنامه ساعت

        ممنون از کمکتون
        lcd همین طور پشت سر هم چشمک می زنه و قابل خوندن نیست باید wait بزارم ؟ اما کجای برنامه بزارم ؟
        زندگی تاس خوب آوردن نیست ، تاس بد را خوب بازی کردن است

        دیدگاه


          #5
          پاسخ : کمک برای اصلاح برنامه ساعت

          سلام من برنامه رو به صورت زیر تغیر دادم
          ولی ثانیه شمار که می شمره شمردنشو کامل نشون نمی ده که به ترتیب بشمره چندتا چندتا نشون می ده اعداد رو پشت سرهم نشون نمی ده
          چیکار کنم؟
          مرسی
          [hr]
          $regfile = "m16def.dat"
          $crystal = 8000000
          Config Lcd = 16 * 2
          Config Lcdbus = 4
          Config Lcdpin = Pin , Db7 = Portc.7 , Db6 = Portc.6 , Db5 = Portc.5 , _
          Db4 = Portc.4 , E = Portc.3 , Rs = Portc.2
          '$prog &HFF , &HA4 , &HD9 , &H00 ' generated. Take care that the chip supports all fuse bytes..2
          Config Porta.1 = Input
          Config Porta.2 = Input
          Dim H As Byte
          Dim M As Byte
          Dim S As Byte
          Dim A As Byte
          H = 0 : A = 0 : M = 0 : S = 0
          Config Timer0 = Timer , Prescale = 1024
          Enable Interrupts
          Enable Timer0
          Enable Ovf0
          Timer0 = 0
          On Ovf0 Clock
          Start Timer0
          Do
          If Pina.1 = 1 Then
          Incr H
          If H > 23 Then
          H = 0
          End If
          End If
          If Pina.2 = 1 Then
          Incr M
          If M > 59 Then
          M = 0
          End If
          End If
          Cursor Off '
          Cls : Home
          Lcd "H M S "
          Locate 2 , 1
          Lcd H ; ":" ; M ; ":" ; S
          Waitms 200
          Loop
          End
          Clock:
          Incr A
          If A > 30 Then
          Incr S
          If S > 59 Then
          Incr M
          S = 0
          End If
          If M > 59 Then
          Incr H
          M = 0
          End If
          If H > 23 Then
          H = 0
          End If
          End If
          Timer0 = 0
          Start Timer0
          Return
          زندگی تاس خوب آوردن نیست ، تاس بد را خوب بازی کردن است

          دیدگاه


            #6
            پاسخ : کمک برای اصلاح برنامه ساعت

            میکرو شما خیلی رود به وقفه میره ، یکبار دیگه محاسبات وقفه رو حساب کنید
            میکرو شما با این حساب خیلی رودتر از یک ثانیه به وقفه میره ، نحوه محاسبه رو بنویسید

            هر وقت میکرو هر یک ثاینه یکبار به وقفه رفت قسمت نمایش روی lcd رو داخل روتین وقفه قرار بده ، می تونید از کرستال ساعت هم استفاده کنید و به راحتی برنامه رو بنویسید

            دیدگاه


              #7
              پاسخ : کمک برای اصلاح برنامه ساعت

              نوشته اصلی توسط علی یعقوبی
              میکرو شما خیلی رود به وقفه میره ، یکبار دیگه محاسبات وقفه رو حساب کنید
              منم این برنامه رو چک کردم و تو پروتئوس شبیه سازی کردم ، ظاهرا حق با شماست ولی محاسبات کاملا درست انجام شده

              نوشته اصلی توسط MARAL_7133
              lcd همین طور پشت سر هم چشمک می زنه و قابل خوندن نیست باید wait بزارم ؟ اما کجای برنامه بزارم ؟
              از دستور wait وقتی که زمان رو با استفاده از تایمر ساختید استفاده نکنید مگه اینکه تاخیر رو در محاسبات لحاظ کنید چون باعث تاخیر در برنامه میشه ، تو برنامه دوم که از wait استفاده کردید به ازای هر ثانیه 0.2 پانیه تاخیر ایجاد میشه و بعد از دقیقه اول ساعت شما 3 ثانیه عقب می مونه

              دیدگاه


                #8
                پاسخ : کمک برای اصلاح برنامه ساعت

                منم این برنامه رو چک کردم و تو پروتئوس شبیه سازی کردم ، ظاهرا حق با شماست ولی محاسبات کاملا درست انجام شده
                خوب حالا که محاسبات هم درست انجام شده ، پس مشکل کجا می تونه باشه؟باید چیکار کنم؟ :sad:
                می تونید از کرستال ساعت هم استفاده کنید و به راحتی برنامه رو بنویسید
                منظورتون از کریستال ساعت چیه؟یعنی از کریستال خارجی استفاده کنم و از نوع ساعت یعنی کریستال quartz ?
                [hr]
                rtc میکرو چی هست؟چیکار می کنه؟عملکردش چه طوریه که باهاش برنامه ساعت رو می نویسن؟
                وقتی از کریستال داخلی میکرو استفاده می کنیم در عمل باید کریستال رو بزاریم یا نه؟
                همین برنامه رو من در عمل هم بستم ولی هیچی رو lcd نشون نمی ده!!!!!!!!
                حتی همین هایی که تو پروتیوس نشون می ده رو نشون نمی ده!!!!!!!!! اشکال کار از کجا می تونه باشه؟ :sad:
                زندگی تاس خوب آوردن نیست ، تاس بد را خوب بازی کردن است

                دیدگاه


                  #9
                  پاسخ : کمک برای اصلاح برنامه ساعت

                  سلام
                  من برنامه رو با یه سری تغییرات اصلاح کردم :

                  $regfile = "m16def.dat"
                  $crystal = 8000000
                  Config Lcd = 16 * 2
                  Config Lcdbus = 4
                  Config Lcdpin = Pin , Db7 = Portc.7 , Db6 = Portc.6 , Db5 = Portc.5 , _
                  Db4 = Portc.4 , E = Portc.3 , Rs = Portc.2
                  Ddra.1 = 0 : Porta.1 = 1
                  Ddra.2 = 0 : Porta.2 = 1

                  Config Timer0 = Timer , Prescale = 1024
                  Enable Interrupts
                  Enable Timer0
                  Enable Ovf0

                  Dim H As Byte
                  Dim M As Byte
                  Dim S As Byte
                  Dim A As Byte

                  H = 0 : A = 0 : M = 0 : S = 0
                  Timer0 = 0
                  On Ovf0 Clock
                  Start Timer0
                  Cls
                  Do
                  Debounce Pina.1 , 0 , Incr_min , Sub
                  Debounce Pina.2 , 0 , Incr_hour , Sub
                  Cursor Off '
                  Home
                  Lcd "H M S "
                  Locate 2 , 1
                  Lcd H ; ":" ; M ; ":" ; S
                  Loop
                  End

                  Clock:
                  Incr A
                  If A > 30 Then
                  Stop Timer0 : A = 0 : Incr S
                  If S > 59 Then
                  S = 0
                  Cls
                  Incr M
                  If M > 59 Then
                  Cls
                  Incr H
                  M = 0
                  If H > 23 Then
                  Cls : Home
                  H = 0 : M = 0 : S = 0
                  End If
                  End If
                  End If
                  End If
                  Timer0 = 0
                  Start Timer0
                  Return

                  Incr_min:
                  Incr M
                  If M > 59 Then
                  Home
                  M = 0
                  Cls
                  End If
                  Return

                  Incr_hour:
                  Incr H
                  If H > 23 Then
                  Home
                  Cls
                  H = 0
                  End If
                  Return

                  چند تا مشکل عمدش رو میگم بقیه هر جایی سئوالی بود در خدمتم :
                  1-تو برنامه وقفه ، stop timer0 نذاشته بودی ، این باعث میشد در موقع رسیدن به ثانیه بعد و نمایش بروی lcd ، تایمر در همون موقع شمارش رو ادامه بده مثلا lcd موقعی که تازه یک ثانیه رو نشون داد در همون موقع تایمر شما چند بار وقفه رو داده
                  2-میکرو باید هر وقت یک ثانیه تموم شد lcd رو رفرش کنه ( پاک کنه ) . یه مورد کلی در مورد استفاده از دستور cls تو برنامه بالا اینه که هر جا تغییراتی قراره اتفاق بیفته از این دستور استفاده کن .
                  3- در مورد کلیدهای تنظیم ساعت و دقیقه مقاومت پول پ پایه ها رو باید فعال میکردی ، مثلا من pina.2 و pina.1 رو یک کردم و تو برنامه شرط گذاشتم که اگه صفر شد زیربرنامه مورد نظر انجام بشه .
                  4- bounce کلیدها رو هم حذف نکردی ، این خاصیت باعث میشه حتی اگه یه لحظه دستت رو رو سوییچ بگیری متغیر چند واحد تغییر کنه برای حذفش هم از دستور debounce استفاده کن .

                  دیدگاه

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