درود بر همگی
اینجا یه برنامه نوشتم که دوتا میکرو رو به هم وصل میکنه و داده ها به وسیله ی تایمر و پالس به میکروی دیگر فرستاده میشه!زبانش هم زبان اسمبلی هستش!وای پسر 2روزه روش کار می کنم!آخرش نتیجه داد!
می تونید با تنظیم داده ها در متغیر datax چیزی را که می خواهید به میکروی دیگر بفرستید!این برنامه واسه میکرو
p16f84a نوشته شده واسه میکروهای دیگه یه سری تغییرات جزی باید بدیم!
چه حالی میده اسمبلیییییییییییییییییییییییییییییییییییی :wow: :wow: :wow: :wow:
اینم کد فرستنده:
[code=asm]
//processor p16f84a
include <p16f84a.inc>
__config _XT_OSC & _PWRTE_OFF & _CP_OFF & _WDT_OFF
datax equ 0x0c
datay equ 0x0d
org 0x00
goto peykar
org 0x04
movf datax,0 ;copy datax to w
movwf datay ;copy w to datay (datay=datax)
call senddata ;send data
bcf 0x0b,4 ;disable RB0/INT
bsf 0x03,5 ;bank1
bcf 0x86,0 ;RB0 as output
bcf 0x03,5 ;bank0
bsf 0x06,0 ;data has been send
nop
nop
nop
nop
bcf 0x06,0
bsf 0x03,5 ;bank1
bsf 0x86,0 ;RB0 as input
bcf 0x03,5 ;bank0
incf datax ;increase datax
bsf 0x0b,4 ;enable RB0/INT
bcf 0x0b,1 ;clear INTE flag bit
retfie ;enable GIE and return
peykar
bsf 0x03,5 ;bank1
bsf 0x86,0 ;RB0 as input
movlw b'11000000'
movwf OPTION_REG ;enable RB0/INT
bcf 0x03,5 ;bank0
movlw b'10010000' ;enable GIE and INTIE
movwf 0x0b
movlw .20 ;copy deciaml 20 to w
movwf datax ;copy w to datax
clrf 0x06 ;clear portb
main
movlw 0x00 ;loop
goto $-1
senddata
bsf 0x06,1 ;high RB1
nop
nop
nop
nop
bcf 0x06,1
decfsz datay ;decrease datay
goto senddata ;if datay>0 goto senddata
return ;else return
end
[/code]
کد گیرنده:
[code=asm]
//processor p16f84a
include <p16f84a.inc>
__config _XT_OSC & _PWRTE_OFF & _CP_OFF & _WDT_OFF
datax equ 0x0c
org 0x00
goto peykar
org 0x04
movf TMR0,0 ;copy tmr0 to w
movwf datax ;copy w to datax
call run ;do instruction
bcf 0x0b,4 ;disable RB0/INT
bsf 0x03,5 ;bank1
bcf 0x86,0 ;RB0 as output
bcf 0x03,5 ;bank0
bsf 0x06,0 ;high RB0
nop
nop
nop
nop
bcf 0x06,0 ;low RB0
bsf 0x03,5 ;bank1
bsf 0x86,0 ;RB0 as input
bcf 0x03,5 ;bank0
bsf 0x0b,4 ;enable RB0/INT
bcf 0x0b,1 ;disable INTE
clrf TMR0 ;clear TMR0
retfie ;enable global interrupt and return
peykar
bsf 0x03,5 ;bank1
clrf 0x86
bsf 0x85,4 ;RA4 as input
movlw b'11110000'
movwf OPTION_REG ;Enable TMR0 and RB0/INT
bcf 0x03,5 ;bank0
movlw b'10000000' ;enable GIE
movwf 0x0b
clrf 0x06
main
bsf 0x06,0 ;send get instruction
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
bcf 0x06,0 ;""
bcf 0x0b,1
bsf 0x0b,4
bsf 0x03,5
bsf 0x86,0
bcf 0x03,5
movlw 0x00 ;loop
goto $-1 ;loop
run
bsf 0x06,1 ;high RB1
nop
nop
nop
nop
bcf 0x06,1 ;low RB1
decfsz datax ;decrease datax
goto run ;if datax>0 goto run
return ;else return
end
[/code]
اینم یه نتیجه از اسمبلی یاد گرفته دیگه!! البته دستورالعمل ها با توجه به اندازشون(اندازه ی داده ی ارسالی) زمان میبرند!همچینین می تونیم با حذف دستور nop سرعت بیشتری به کارمون بدیم!دستورات در اندازه ی کمتر از 1530 کلاک فرستده میشوند!و در همین اندازه هم اجرا میشن!یعنی اگه کریستال 4 مگاهرتز باشه میشه چیزی اندازه ی 1.5 میلی ثانیه واگه کریستال 8 مگا باشه میشه یه چیزی به وقدار 765 میلی ثانیه که بازم میگم میتونه کمتر باشه!
دستوراتش رو کوتاه نوشتم جلوشون ولی اگه خواستین باز براتون توضیح میدم که چطور شد که اینطور شد!من که دارم بال در میارم! :nice: :wow:
اسمبلییییییییییییییییییییییییییییییییییییییییییییی یییییییییییییییییییییییییییییییییییییییییییییییییی یییییییییی تنها راه چاره!
اینجا یه برنامه نوشتم که دوتا میکرو رو به هم وصل میکنه و داده ها به وسیله ی تایمر و پالس به میکروی دیگر فرستاده میشه!زبانش هم زبان اسمبلی هستش!وای پسر 2روزه روش کار می کنم!آخرش نتیجه داد!
می تونید با تنظیم داده ها در متغیر datax چیزی را که می خواهید به میکروی دیگر بفرستید!این برنامه واسه میکرو
p16f84a نوشته شده واسه میکروهای دیگه یه سری تغییرات جزی باید بدیم!
چه حالی میده اسمبلیییییییییییییییییییییییییییییییییییی :wow: :wow: :wow: :wow:
اینم کد فرستنده:
[code=asm]
//processor p16f84a
include <p16f84a.inc>
__config _XT_OSC & _PWRTE_OFF & _CP_OFF & _WDT_OFF
datax equ 0x0c
datay equ 0x0d
org 0x00
goto peykar
org 0x04
movf datax,0 ;copy datax to w
movwf datay ;copy w to datay (datay=datax)
call senddata ;send data
bcf 0x0b,4 ;disable RB0/INT
bsf 0x03,5 ;bank1
bcf 0x86,0 ;RB0 as output
bcf 0x03,5 ;bank0
bsf 0x06,0 ;data has been send
nop
nop
nop
nop
bcf 0x06,0
bsf 0x03,5 ;bank1
bsf 0x86,0 ;RB0 as input
bcf 0x03,5 ;bank0
incf datax ;increase datax
bsf 0x0b,4 ;enable RB0/INT
bcf 0x0b,1 ;clear INTE flag bit
retfie ;enable GIE and return
peykar
bsf 0x03,5 ;bank1
bsf 0x86,0 ;RB0 as input
movlw b'11000000'
movwf OPTION_REG ;enable RB0/INT
bcf 0x03,5 ;bank0
movlw b'10010000' ;enable GIE and INTIE
movwf 0x0b
movlw .20 ;copy deciaml 20 to w
movwf datax ;copy w to datax
clrf 0x06 ;clear portb
main
movlw 0x00 ;loop
goto $-1
senddata
bsf 0x06,1 ;high RB1
nop
nop
nop
nop
bcf 0x06,1
decfsz datay ;decrease datay
goto senddata ;if datay>0 goto senddata
return ;else return
end
[/code]
کد گیرنده:
[code=asm]
//processor p16f84a
include <p16f84a.inc>
__config _XT_OSC & _PWRTE_OFF & _CP_OFF & _WDT_OFF
datax equ 0x0c
org 0x00
goto peykar
org 0x04
movf TMR0,0 ;copy tmr0 to w
movwf datax ;copy w to datax
call run ;do instruction
bcf 0x0b,4 ;disable RB0/INT
bsf 0x03,5 ;bank1
bcf 0x86,0 ;RB0 as output
bcf 0x03,5 ;bank0
bsf 0x06,0 ;high RB0
nop
nop
nop
nop
bcf 0x06,0 ;low RB0
bsf 0x03,5 ;bank1
bsf 0x86,0 ;RB0 as input
bcf 0x03,5 ;bank0
bsf 0x0b,4 ;enable RB0/INT
bcf 0x0b,1 ;disable INTE
clrf TMR0 ;clear TMR0
retfie ;enable global interrupt and return
peykar
bsf 0x03,5 ;bank1
clrf 0x86
bsf 0x85,4 ;RA4 as input
movlw b'11110000'
movwf OPTION_REG ;Enable TMR0 and RB0/INT
bcf 0x03,5 ;bank0
movlw b'10000000' ;enable GIE
movwf 0x0b
clrf 0x06
main
bsf 0x06,0 ;send get instruction
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
bcf 0x06,0 ;""
bcf 0x0b,1
bsf 0x0b,4
bsf 0x03,5
bsf 0x86,0
bcf 0x03,5
movlw 0x00 ;loop
goto $-1 ;loop
run
bsf 0x06,1 ;high RB1
nop
nop
nop
nop
bcf 0x06,1 ;low RB1
decfsz datax ;decrease datax
goto run ;if datax>0 goto run
return ;else return
end
[/code]
اینم یه نتیجه از اسمبلی یاد گرفته دیگه!! البته دستورالعمل ها با توجه به اندازشون(اندازه ی داده ی ارسالی) زمان میبرند!همچینین می تونیم با حذف دستور nop سرعت بیشتری به کارمون بدیم!دستورات در اندازه ی کمتر از 1530 کلاک فرستده میشوند!و در همین اندازه هم اجرا میشن!یعنی اگه کریستال 4 مگاهرتز باشه میشه چیزی اندازه ی 1.5 میلی ثانیه واگه کریستال 8 مگا باشه میشه یه چیزی به وقدار 765 میلی ثانیه که بازم میگم میتونه کمتر باشه!
دستوراتش رو کوتاه نوشتم جلوشون ولی اگه خواستین باز براتون توضیح میدم که چطور شد که اینطور شد!من که دارم بال در میارم! :nice: :wow:
اسمبلییییییییییییییییییییییییییییییییییییییییییییی یییییییییییییییییییییییییییییییییییییییییییییییییی یییییییییی تنها راه چاره!