论坛风格切换切换到宽版
  • 10612阅读
  • 40回复

MB1504例程 [复制链接]

上一主题 下一主题
离线cctvcctv
 
发帖
412
只看楼主 倒序阅读 0楼 发表于: 2007-08-21
这个例程谁用过,分析了时序没错,我上机试了一下,好象不行

问题解决了,就是在程序的最后时钟/使能端口都要置高电平,不知道是什么原因,但频率可以锁定了,我修改了程序在4楼


;******************************************************************
;pll锁相环频率合成控制器mb1501/mb1504置频参考汇编程序
;
;程序编写作者:飞奔 程序仅供参考 不提供任何技术支持! 经测试是成功的
;
;调频天空:http://www.fmdiy.com /
;
;电子技术研究协会:http://dx.fmdiy.com/
;
;程序功能: 设置mb1501/mb1504频率为380mhz
;
;             晶振19.2mhz,基准频率50k,r值取384,n值取118,a值取48
;
;******************************************************************
              le8   equ p1.0         ;定义使能端口
              da8 equ p1.1         ;定义数据端口
              ck8 equ p1.2         ;定义时钟端口

              org 0000h
              sjmp start
              org 0030h
;******************************************************************
;                                         主程序开始
start:     clr le8                 ;使能置0
              clr ck8               ;时钟置0
              clr da8               ;数据口清零
;******************************************************************
              ;r取值为384
              ;送数据十六进制数#80c1h 对应二进制为10000000 11000001
              ;分2次送,先送低8位,再送高8位
up1:         mov a,#0c1h
              acall up8data   ;发送
              mov a,#80h
              acall up8data   ;发送十六进制数#80c1h完毕

              nop
              nop
              setb le8
              nop
              nop
              nop
              clr le8
              nop
              nop
              nop

              ;n取值为118,a取值为48
              ;送数据十六进制数#3370h 对应二进制为000 00110011 01110000
              ;分3次送,先送低8位,再送中间8位,再送高3位
up2:         mov a,#70h
              acall up8data   ;发送
              mov a,#33h
              acall up8data   ;发送
              mov a,#00h
              acall up3data   ;送十六进制数#3370h完毕

              nop
              nop
              setb le8
              nop
              nop
              nop
              clr le8
              nop
              nop
              nop
              ret
;******************************************************************
up8data: mov r3,#08h         ;数据发送8次子程序
              clr c
updata1: rrc a                 ;右移一位
              mov da8,c
              nop
              nop
              nop
              nop
              setb ck8
              nop
              nop
              nop
              nop
              clr ck8
              djnz r3,updata1 ;8次减1循环发送,未发完转updata1再发
              ret                     ;子程序返回

up3data: mov r3,#03h         ;数据发送3次子程序
              clr c
updata2: rrc a                   ;右移一位
              mov da8,c
              nop
              nop
              nop
              nop
              setb ck8
              nop
              nop
              nop
              nop
              clr ck8
              djnz r3,updata2   ;3次减1循环发送,未发完转updata2再发
              ret                     ;子程序返回

              end                     ;程序结束









  飞奔高人将高低位作了逆序,便于他的移位风格,10000011   00000001反过来的就是10000000 11000001,即80c1h,
离线BG4UVR
发帖
11315
只看该作者 1楼 发表于: 2007-08-22
在线永远的FM
发帖
12230
只看该作者 2楼 发表于: 2007-08-22
这个程序我们也在调试中。
现在输出固定频率已经成功了,但想改变输出就很难,主要是分频比对应的二进制数很难改。应该有简便方法把??
离线cctvcctv
发帖
412
只看该作者 3楼 发表于: 2007-08-22
修改了程序,改变了位移顺序,不用倒位换算,直接添加参考分频/编程分频/吞脉冲分频数就可以了




;程序功能: 设置mb1504频率为102mhz
;
;             晶振6.4mhz,基准频率25k,参考分频256,编程分频63,吞脉冲分频48
;
;******************************************************************
              le8 equ p2.0         ;定义使能端口
              da8 equ p2.1         ;定义数据端口
              ck8 equ p2.2       ;定义时钟端口
              ckfh equ 40h         ;参考分频高位
              ckfl equ 41h         ;参考分频低位
              bcfh equ 42h         ;编程分频高位
              bcfl equ 43h         ;编程分频低位
              tmcf equ 44h         ;吞脉冲分频

              org 0000h
              sjmp start
              org 0030h
;******************************************************************
start:           mov ckfh,#1
              mov ckfl,#1
              mov tmcf, #48
              mov bcfh,#0h
              mov bcfl,#63

              clr le8               ;使能置0
              clr ck8               ;时钟置0
              clr da8               ;数据口清零
;******************************************************************
              mov a,ckfl     ;控制位,数据位整合
              setb c
              rlc a         ;控制位,数据位整合
              mov ckfl,a     ;控制位,数据位整合
              mov a,ckfh     ;控制位,数据位整合
              rlc a         ;控制位,数据位整合
            clr acc.7     ;预分频控制位lre为64 setb为32
              mov ckfh,a     ;控制位,数据位整合


up1:           mov a,ckfh
              acall up8data   ;发送参考分频高位
              mov a,ckfl
              acall up8data   ;;发送参考分频低位

              nop
              nop
              setb le8
              nop
              nop
              nop
              clr le8
              nop
              nop
            nop


up2:

              mov a, bcfh
              swap a
              rl a
              acall up3data   ;发送编程分频高3位
              mov a, bcfl
              acall up8data   ;发送编程分频低8位
              clr c
              mov a,tmcf
              rlc a       ;吞脉冲控制位数据位整合
              acall up8data   ;送吞脉冲分频

            nop
              nop
              setb le8
              nop
              nop
              nop
              clr le8
              nop
              nop
              nop

              setb le8
              setb ck8              
;
              ajmp$
              ret



;******************************************************************
up8data: mov r3,#08h         ;数据发送8次子程序
              clr c
updata1: rlc a                 ;左移一位
              mov da8,c
              nop
              nop
              nop
              nop
              setb ck8
              nop
              nop
              nop
              nop
              clr ck8
              djnz r3,updata1 ;8次减1循环发送,未发完转updata1再发
              ret                     ;子程序返回

up3data: mov r3,#03h         ;数据发送3次子程序
              clr c
updata2: rlc a                   ;左移一位
              mov da8,c
              nop
              nop
              nop
              nop
              setb ck8
              nop
              nop
              nop
            nop
              clr ck8
              djnz r3,updata2   ;3次减1循环发送,未发完转updata2再发
              ret                     ;子程序返回

              end                     ;程序结束
离线feifeivictor
发帖
535
只看该作者 4楼 发表于: 2007-08-22
现在不流行用C么
离线xiongjunfeng
发帖
1220
只看该作者 5楼 发表于: 2007-08-22
mb1504驱动,我做过实际系统。好象很容易啊,把说明文档看清楚就可以了啊
离线BG7TBL
发帖
2965
只看该作者 6楼 发表于: 2007-08-22
我用atmega8+c,程序很好编!
在线永远的FM
发帖
12230
只看该作者 7楼 发表于: 2007-08-22
现在我们用c语言改编了,不过只能输出固定信号无法调节,而且输出频率比预想要高
离线BG7YDO
发帖
3654
只看该作者 8楼 发表于: 2007-08-22
为什么要用那么多nop?下图中的t1-t5>=1us应该怎么理解?请指教
本主题包含附件,请 登录 后查看, 或者 注册 成为会员
离线BG4UVR
发帖
11315
只看该作者 9楼 发表于: 2007-08-22
'
为什么要用那么多nop?下图中的t1-t5>=1us应该怎么理解?请指教
'

时钟上延要比数据晚送至少1us
离线BG4UVR
发帖
11315
只看该作者 10楼 发表于: 2007-08-22
1、时钟上升沿至少比数据迟1us以上才能送出
2、s8上升沿后数据至少保持1us以上
3、时钟脉冲宽度至少1us以上
4、le的上升沿至少迟于最后一个时钟脉冲下降沿1us以上
5、le脉冲宽度至少1us以上
离线BG7TBL
发帖
2965
只看该作者 11楼 发表于: 2007-08-22
[quote=永远的fm]现在我们用c语言改编了,不过只能输出固定信号无法调节,而且输出频率比预想要高[/quote]

1504用的晶振两端有没有并电容,我上次用6.4m的直接接入1504,结果频率振到19.19mhz
离线FMer
发帖
2549
只看该作者 12楼 发表于: 2007-08-22
看到汇编就头晕。
在线永远的FM
发帖
12230
只看该作者 13楼 发表于: 2007-08-22
'
1504用的晶振两端有没有并电容,我上次用6.4m的直接接入1504,结果频率振到19.19mhz [表情] [表情] [表情]
'
我对地接了2个电容,用频率计检测就是12.8mhz。(标识频率)
现在不但震荡到40mhz而且不是很稳定(vco能锁定但不太稳定)
离线BG7YDO
发帖
3654
只看该作者 14楼 发表于: 2007-08-23
'
1、时钟上升沿至少比数据迟1us以上才能送出
2、s8上升沿后数据至少保持1us以上
3、时钟脉冲宽度至少1us以上
4、le的上升沿至少迟于最后一个时钟脉冲下降沿1us以上
5、le脉冲宽度至少1us以上
'

谢谢指点!
离线pjh
发帖
1096
只看该作者 15楼 发表于: 2007-08-27
'
修改了程序,改变了位移顺序,不用倒位换算,直接添加参考分频/编程分频/吞脉冲分频数就可以了
;程序功能: 设置mb1504频率为102mhz
;
;             晶振6.4mhz,基准频率25k,参考分频256,编程分频63,吞脉冲分频48
;
;******************************************************************
              le8 equ p2.0         ;定义使能端口
              da8 equ p2.1         ;定义数据端口
              ck8 equ p2.2       ;定义时钟端口
              ckfh equ 40h         ;参考分频高位
              ckfl equ 41h         ;参考分频低位
              bcfh equ 42h         ;编程分频高位
              bcfl equ 43h         ;编程分频低位
              tmcf equ 44h         ;吞脉冲分频
              org 0000h
              sjmp start
              org 0030h
;******************************************************************
start:           mov ckfh,#1
              mov ckfl,#1              
              mov tmcf, #48
              mov bcfh,#0h
              mov bcfl,#63
              clr le8               ;使能置0
              clr ck8               ;时钟置0
              clr da8               ;数据口清零
;******************************************************************
              mov a,ckfl     ;控制位,数据位整合
              setb c
              rlc a         ;控制位,数据位整合
              mov ckfl,a     ;控制位,数据位整合
              mov a,ckfh     ;控制位,数据位整合
              rlc a         ;控制位,数据位整合
            clr acc.7     ;预分频控制位lre为64 setb为32
              mov ckfh,a     ;控制位,数据位整合
up1:           mov a,ckfh
              acall up8data   ;发送参考分频高位
              mov a,ckfl
              acall up8data   ;;发送参考分频低位
              nop
              nop
              setb le8
              nop
              nop
              nop
              clr le8
              nop
              nop
            nop
up2:
              mov a, bcfh
              swap a
              rl a
              acall up3data   ;发送编程分频高3位
              mov a, bcfl
              acall up8data   ;发送编程分频低8位
              clr c
              mov a,tmcf
              rlc a       ;吞脉冲控制位数据位整合
              acall up8data   ;送吞脉冲分频
            nop
              nop
              setb le8
              nop
              nop
              nop
              clr le8
              nop
              nop
              nop
              setb le8
              setb ck8              
;
              ajmp$
              ret
;******************************************************************
up8data: mov r3,#08h         ;数据发送8次子程序
              clr c
updata1: rlc a                 ;左移一位
              mov da8,c
              nop
              nop
              nop
              nop
              setb ck8
              nop
              nop
              nop
              nop
              clr ck8
              djnz r3,updata1 ;8次减1循环发送,未发完转updata1再发
              ret                     ;子程序返回
up3data: mov r3,#03h         ;数据发送3次子程序
              clr c
updata2: rlc a                   ;左移一位
              mov da8,c
              nop
              nop
              nop
              nop
              setb ck8
              nop
              nop
              nop
            nop
              clr ck8
              djnz r3,updata2   ;3次减1循环发送,未发完转updata2再发
              ret                     ;子程序返回
              end                     ;程序结束
'

老兄,这程式是通过试验了的吗?好象有点问题哦,我烧到我板子上怎么也不能正常工作,后来改了一点点,才可正常!


;程序功能: 设置mb1504频率为102mhz
;
; 晶振6.4mhz,基准频率25k,参考分频256,编程分频63,吞脉冲分频48
;
;******************************************************************
power   bit p3.6
le8 equ p2.7 ;定义使能端口
da8 equ p2.6 ;定义数据端口
ck8 equ p2.5 ;定义时钟端口
ckfh equ 40h ;参考分频高位
ckfl equ 41h ;参考分频低位
bcfh equ 42h ;编程分频高位
bcfl equ 43h ;编程分频低位
tmcf equ 44h ;吞脉冲分频

org 0000h
sjmp start
org 0030h
;******************************************************************
start:
clr power
mov ckfh,#1
mov ckfl,#0;修改了这里
mov tmcf, #48
mov bcfh,#0h
mov bcfl,#63

clr le8 ;使能置0
clr ck8 ;时钟置0
clr da8 ;数据口清零
;******************************************************************
mov a,ckfl ;控制位,数据位整合
setb c
rlc a ;控制位,数据位整合
mov ckfl,a ;控制位,数据位整合
mov a,ckfh ;控制位,数据位整合
rlc a ;控制位,数据位整合
clr acc.7 ;预分频控制位lre为64 setb为32
mov ckfh,a ;控制位,数据位整合


up1: mov a,ckfh
acall up8data ;发送参考分频高位
mov a,ckfl
acall up8data ;;发送参考分频低位
nop
nop
nop
nop
setb le8
nop
nop
nop
clr le8 ;这里加了几个nop(其它几点也一样)
nop
nop
nop


up2:

mov a, bcfh
swap a
rl a
acall up3data ;发送编程分频高3位
mov a, bcfl
acall up8data ;发送编程分频低8位
clr c
mov a,tmcf
rlc a ;吞脉冲控制位数据位整合
acall up8data ;送吞脉冲分频
nop
nop
nop
nop
setb le8
nop
nop
nop
clr le8
nop
nop
nop

;setb le8;这两句不用的
;setb ck8 ;

ajmp $
ret



;******************************************************************
up8data: mov r3,#08h ;数据发送8次子程序
clr c
updata1: rlc a ;左移一位
mov da8,c
nop
nop
nop
nop
setb ck8
nop
nop
nop
nop
clr ck8
nop
nop
nop
nop
djnz r3,updata1 ;8次减1循环发送,未发完转updata1再发
ret ;子程序返回

up3data: mov r3,#03h ;数据发送3次子程序
clr c
updata2: rlc a ;左移一位
mov da8,c
nop
nop
nop
nop
setb ck8
nop
nop
nop
nop
clr ck8
nop
nop
nop
nop
djnz r3,updata2 ;3次减1循环发送,未发完转updata2再发
ret ;子程序返回

end ;程序结束



start:           mov ckfh,#1
              mov ckfl,#1

这里有问题:参考分频为256没错,256=100000000b,这样,应该是ckfh=1,ckfl=0
另外,发送数据子程式时钟下降沿没留多少时间,我加了几个nop之后就ok了!
离线BA5SBA
发帖
3088
只看该作者 16楼 发表于: 2007-08-27
不错!学习,我也只会汇编,不懂c
在线永远的FM
发帖
12230
只看该作者 17楼 发表于: 2007-08-29
'
修改了程序,改变了位移顺序,不用倒位换算,直接添加参考分频/编程分频/吞脉冲分频数就可以了
;程序功能: 设置mb1504频率为102mhz
;
;             晶振6.4mhz,基准频率25k,参考分频256,编程分频63,吞脉冲分频48
;
;******************************************************************
              le8 equ p2.0         ;定义使能端口
            ....................
.................................................
................................................
              djnz r3,updata2   ;3次减1循环发送,未发完转updata2再发
              ret                     ;子程序返回
              end                     ;程序结束
'
请问参考分频在那里设定?我现在的参考分频是2048,请问要怎么改?小弟不懂汇编,请指教
离线小比尔/5
发帖
2582
只看该作者 18楼 发表于: 2007-08-29
ckfh equ 40h :参考分频高位
ckfl equ 41h :参考分频低位
在线永远的FM
发帖
12230
只看该作者 19楼 发表于: 2007-08-29
谢谢!
现在我预想的输出频率是29.6mhz,频率步进5k,晶振10.24m,参考分频2048,n=92,a=32,请问要改哪里?