اطلاعیه

Collapse
No announcement yet.

میشه در مورد این موضوع بهم کمک کنین؟

Collapse
این موضوع بسته شده است.
X
X
 
  • فیلتر
  • زمان
  • Show
Clear All
new posts

    میشه در مورد این موضوع بهم کمک کنین؟

    درود بر همگی! من دوتا برنامه نوشتم که با بهره جویی از وقفه ی RB0 دوتا میکرو p16f84a را به هم ارتباط میده!
    روش کار اینطوریه که ابتدا بیت 01 از پورت A از میکروی فرستنده برای یک کلاک بالا کشیده میشه که این بیت وصله به بیت 0 از پورت B میکروی دیگه!با این کار وقفه فعال میشه تو اون یکی میکرو و بیت 0 از پورت A خودشو واسه یه مدات کوتاه یک می کنه و زمان صفر شدن همین بیت , بیت 1 از پورت B خودشو بالا پایین میکنه و میکروی فرستنده می تونه بفهمه که دستورش اجرا شده و دوباره دستور قبلی را میفرسته!اصلا به این عکس نگا کنین:


    خوب اینم نحوه ی وصل شدن دو میکرو به هم:


    کد میکرو ها هم به این صورته اول فرستنده بعد گیرنده:

    [code=asm]
    //processor p16f84a
    include <p16f84a.inc>
    __config _WDT_OFF & _PWRTE_OFF & _XT_OSC & _CP_OFF
    sbit equ 0x0c
    org 0x00
    goto peykar
    org 0x04
    call interrupt
    retfie

    peykar
    bsf 0x03,5
    clrf 0x85
    movlw b'11000000'
    movwf OPTION_REG
    movlw b'00000001'
    movwf 0x86
    bcf 0x03,5
    clrf 0x05
    clrf 0x06
    movlw b'10010000'
    movwf INTCON

    main
    bsf 0x05,0
    bcf 0x05,0
    bcf sbit,0
    btfsc sbit,0
    goto main
    goto $-2

    interrupt
    bcf INTCON,1
    bsf sbit,0
    return

    end
    [/code]

    اینم گیرنده:

    [code=asm]
    //processor p16f84a
    include <p16f84a.inc>
    __config _WDT_OFF & _PWRTE_OFF & _CP_OFF & _XT_OSC
    cblock 0x0c
    Reg_1
    endc
    org 0x00
    goto peykar
    org 0x04
    call interrupt
    retfie

    peykar
    bsf 0x03,5
    clrf 0x85
    movlw b'00000001'
    movwf 0x86
    movlw b'11000000'
    movwf OPTION_REG
    bcf 0x03,5
    movlw b'10010000'
    movwf INTCON

    main
    btfsc Reg_1,0
    goto ok
    goto $-2

    ok
    bsf 0x05,0
    call delay
    bcf 0x05,0
    bsf 0x06,1
    bcf 0x06,1
    goto main

    interrupt
    bcf INTCON,1
    bsf Reg_1,0
    return

    delay
    nop
    nop
    nop
    nop
    nop
    bcf Reg_1,0
    return

    end

    [/code]

    مشکل اینجاست که من می خوام با فاصله یک یا 2 کلاکی گیرنده دستور رو اجرا کنه یعنی تو عکس پالس ها ,پالس دومی به پالس اولی نزدیکتر بشه!و پالس اولی هم به پالس سومی!
    اما نمی دونم چه طور باید بدونم که کی وقفه داره انجام میگیره!

    اضافه شده در تاریخ :
    :nice: :wow:
    دوستان اونقدر انگولکش کردم تا بلاخره جواب گرفتم!جای کد ها رو عوض کردم و با این کار اختلاف دستور اجرا با اجرای دستور و همچنین پایان اجرا شد یک کلاک! :wow:

    اینم کد با توضیحات:

    کد فرستنده :

    [code=asm]
    //processor p16f84a
    include <p16f84a.inc>
    __config _WDT_OFF & _PWRTE_OFF & _XT_OSC & _CP_OFF
    ;programe start on reset or frist run
    org 0x00
    goto peykar

    ;label of interrupt when it happen
    org 0x04
    bsf 0x05,0 ;trig to run instruction again!
    bcf 0x05,0
    bcf INTCON,1 ;clear flag bit (RB0)
    retfie ;enable global interrupt and go back!

    peykar
    bsf 0x03,5 ;select bank1
    clrf 0x85 ;poera as output
    movlw b'11000000'
    movwf OPTION_REG ;RB0/INT enabled (on raising)
    movlw b'00000001'
    movwf 0x86 ;RB0 as input
    bcf 0x03,5 ;select bank0
    clrf 0x05 ;clear porta
    clrf 0x06 ;clear portb
    movlw b'10010000'
    movwf INTCON ;enable global interrupt and RB0/INT interrupt
    bsf 0x05,0 ;trig to run instruction
    bcf 0x05,0

    main
    movlw 0x00
    goto $-1 ;this is nothing! loop

    end
    [/code]

    اینم کد گیرنده:

    [code=asm]
    //processor p16f84a
    include <p16f84a.inc>
    __config _WDT_OFF & _PWRTE_OFF & _CP_OFF & _XT_OSC

    org 0x00
    goto peykar


    org 0x04
    bsf 0x05,0 ;run instruction
    call delay ;delay for 9 clocks
    bcf 0x05,0 ;end of instruction
    bsf 0x06,1 ;say to master
    bcf 0x06,1
    bcf INTCON,1 ;clear RB0/INT flag bit
    retfie ;enable global interrupt and go back!

    peykar
    bsf 0x03,5 ;select bank1
    clrf 0x85 ;porta as output
    movlw b'00000001'
    movwf 0x86 ;RB0 as input
    movlw b'11000000'
    movwf OPTION_REG ;enable RB0/INT
    bcf 0x03,5 ;select bank0
    movlw b'10010000'
    movwf INTCON ;enable global interrupt

    main
    movlw 0x00 ;nothin! loop
    goto $-1

    delay
    nop
    nop
    nop
    nop
    nop
    return

    end

    [/code]

    و اینم نتیجه:



    ولی یه چیزی به من میگه شما همتون با زبان سی و بیسیک کار میکنید!درسته؟

    #2
    پاسخ : میشه در مورد این موضوع بهم کمک کنین؟

    نوشته اصلی توسط vishtasp
    ولی یه چیزی به من میگه شما همتون با زبان سی و بیسیک کار میکنید!درسته؟
    اون چیزت درست میگه ..! :applause: بچه ها اغلب با زبان بیسیک و سی کار میکنند ... بیسیک که کار کردن باهاش اشتباه و زبان سی هم که فعلا بصرفه ترینه ... شما هم که اسمبلی کار میکنید نمی خوام بگم کار اشتباهی میکنید ولی بهتره همه ی کد برنامه رو با اسمبلی ننویسید ..هر جا گیر کردین و دیدین با سی نمیشه (که بندرت پیش میاد ) برین سراغ اسمبلی ( البته اسمبلی خیلی شیرینه و من باهاش حال میکنم ) ... ولی خیلی از دوستان هم که بلد هستند بازم با سی کار میکنند ..!
    دست هایی که کمک میکنند از دست هایی که دعا میکنند مقدس ترند....کوروش کبیر

    دیدگاه


      #3
      پاسخ : میشه در مورد این موضوع بهم کمک کنین؟

      خوب من سی سی اس رو دانلود کردم ولی تو راه اندازی ال سی دی به کتابخونه ی خدش ایراد گرفت زدم به سیم آخر و اومدم سراغ اسمبلی!راستش بیشتر واسه همین استفاده از اسمبلی توی زبان دیگه دارم یادش میگیرم!
      آخرین بار برنامه نویسی پروتون و میکرو سی بدجور حالمو تو مسابقات خوارزمی گرفتند!سی سی اس هم که گقتم مانند بلد الملک قهوه ی تلخ خود گیری داره! oo:
      ولی خوب!یه کم تو اسمبلی پیشرفت کنیم تا ببینیم چی میشه!ممنون از دیدگاهتون!

      دیدگاه

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