درود بر همگی! من دوتا برنامه نوشتم که با بهره جویی از وقفه ی 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]
و اینم نتیجه:

ولی یه چیزی به من میگه شما همتون با زبان سی و بیسیک کار میکنید!درسته؟
روش کار اینطوریه که ابتدا بیت 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]
و اینم نتیجه:

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