cdg2000 控制器
18f8520 + sed1330 / sed1335 / ra8835 320*240 lcd组合的控制器系统
cdg2000 控制器系统 18f8520 应用中文笔记
bg5epe/李勇
2006年10月29日更新
一、前言
我不能忍受用 17c766 芯片去制作我的 cdg2000, 因为它太贵了, 而且18f8520 最后一个版本的软件 xcvr4 支持了 am 模式.
在开始阅读代码前, 一定要看过 readme.h 文件的内容, 许多东西都在里面, 很重要.
编译 cdg2000 控制器软件系统的平台是 mplab 5.7, 过早或者过晚的版本都可能会产生无法预料的问题.
***本文所使用的 pcb 为目前最新的版本, 由 bg4tbi 提供, 在此表示感谢
二、引脚定义
*请注意辨别芯片的1脚
766 引脚 8520 引脚
11 rh1 80 rh1
10 rh0 79 rh0
9 rd2 78 re2
8 rd3 77 re3
7 rd4 76 re4
6 rd5 75 re5
5 rd6 74 re6
4 rd7 73 re7
3 rc0 72 rd0
2 +5volts 71 +5volts
1 no connection
84 ground 70 ground
83 rc1 69 rd1
82 rc2 68 rd2
81 rc3 67 rd3
80 rc4 66 rd4
79 rc5 65 rd5
78 rc6 64 rd6
77 rc7 63 rd7
76 rj7 62 rj0
75 rj6 61 rj1
------------------------------------------
12 rh2 1 rh2
13 rh3 2 rh3
14 rd1 3 re1
15 rd0 4 re0
16 re0 5 rg0
17 re1 6 rg1
18 re2 7 rg2
19 re3 8 rg3
20 mclr 9 mclr
21 test 10 rg4
22 no connection
23 ground 11 ground
24 +5volts 12 +5volts
25 rf7 13 rf7
26 rf6 14 rf6
27 rf5 15 rf5
28 rf4 16 rf4
29 rf3 17 rf3
30 rf2 18 rf2
31 rh4 19 rh7
32 rh5 20 rh6
------------------------------------------
74 rj5 60 rj2
73 rj4 59 rj3
72 ra0 58 rb0
71 rb0 57 rb1
70 rb1 56 rb2
69 rb3 55 rb3
68 rb4 54 rb4
67 rb5 53 rb5
66 rb2 52 rb6
65 ground 51 ground
64 no connection
63 osc2 50 osc2
62 osc1 49 osc1
61 +5volts 48 +5volts
60 rb7 47 rb7
59 rb6 46 rc5
58 ra3 45 rc4
57 ra2 44 rc3
56 ra1 43 rc2
55 rj3 42 rj7
54 rj2 41 rj6
------------------------------------------
33 rh6 21 rh5
34 rh7 22 rh4
35 rf1 23 rf1
36 rf0 24 rf0
37 avdd 25 avdd analog +5volts
38 avss 26 avss analog ground
39 rg3 27 ra3
40 rg2 28 ra2
41 rg1 29 ra1
42 rg0 30 ra0
43 no connection
44 ground 31 ground
45 +5volts 32 +5volts
46 rg4 33 ra5
47 rg5 34 ra4
48 rg7 35 rc1
49 rg6 36 rc0
50 ra5 37 rc6
51 ra4 38 rc7
52 rj0 39 rj4
53 rj1 40 rj5
------------------------------------------
三、硬件变更
1: 更换晶体 y1 为 4mhz, 原为 33mhz
2: 拆除电感 l1 (2.2uh)
3: 拆除 opto1_int 到 17c766 rb6 (第59脚)的飞线, 连到 18f8520 的 rb1 (第57脚)
18f8520 的 icsp 引脚定义
vpp(mclr): 9
vdd/power: 12, 32, 48, 71
vss/ground: 11, 31, 51, 70
rb7/data: 47
rb6/clock: 52
rb5/low voltage:53
*请根据自己的编程器的 icsp 接口定义连接
uart 接口
*使用 jp10
ground: 5
tx data (out) 4 原 17c766 pgm-clk
rx data (in) 6 原 17c766 pgm-io
+5volts 3
* uart 口设置 2400bps 8bits
初始化时输出 "mon", 用于帮助 debug 代码
变更做好以后, 控制器系统可以独立运行, 只需要接上编码器, 一个 4*4 键盘和一个液晶显示器, 控制器就可以工作; 软件不依赖 i2c 或者其他接口传输回来的任何数据.
四、处理器声明事项
声明:
配置文件中的 debug 选项移除了一些初始化液晶显示器的代码, 以避免长时间延时和防止程序等待液晶显示器初始化. 这样就允许 mplab 的模拟器使用实时中断运行程序.
实际上使用模拟器对调试小片的代码非常有用, 但是请注意需要模拟键盘操作可不是那么容易的.
声明:
18f8520 目前工作在 4mhz 主频, 17c766 系统工作在 32mhz 的目的可能是为了防止处理器的基频或者谐波噪音干扰到接收机的工作. 就目前而言问题不是太大, 请在我的控制器版本没有升级以前尽量使用 4mhz 主频运行 18f8520, 与我们的测试系统保持一致.
如果改动处理器运行主频, xcvr3.asm 中的 configuration 值和 xcvr.h 第 700 行 timer reset 的值需要做相应的修改.
五、编码器
opto_slow:
这是一个为了 512 step/revolution 的编码器慢速调节而设计的代码, 一般如果要使用的话需要定义一个键开启/关闭这个慢速调节功能.
在慢速模式频率步进是 10hz/step, 而在快速模式则大约是 100hz/step. 软件还有一些智能识别, 当快速转动编码器时自动转入快速模式.
如果使用步进电机制作编码器, 手的速度是不可能转得那么快的;
hp 的一些打印机上可以拆到 512 step/revolution 的光学编码盘;
as54xx 系列霍尔器件也可以实现 512 step/revolution 的编码器;
以上是三种替代 5v ttl 输出的, 价格便宜的编码器方案.
编码器系统工作原理
1: 转动编码器, 中断处理 isr.asm 里变量 opto_1_count 的增加和减少, 见245行和251行;
2: 每 10 毫秒 init.asm 调用 opto.asm 检查 opto_1_count 的值是否变化, 如果有变化就把值复制下来, 然后清空 opto_1_count, 最后下一个 opto 中断又从 0 开始计数;
3: 用 opto_1_count 复制下来的值, opto.asm 检查快慢速识别功能是否打开, 见 66 行; 另外 98 行处理了 dds 的步进值, 做了一个标记, 触发其他程序重新计算和重新显示频率;
4: min_accel, stepb1 到 stepb3 的值都是可配置的, 可参考控制器用户手册 "select configuration parameter to alter" 部分;
5: 注意 init.asm 第 1034 行设置了 min_accel 的默认值为 6, 意思就是自动加速功能在 opto_1_count 每 10 毫秒内收到 6 个增/减量以下时都不会启动, 这时候如果用步进电机编码器就很困难了, 因为人的手不可能把步进电机在 10 毫秒内转出 6 个输出. 跟我一样使用步进电机编码器的可以尝试改动这个 min_accel 的值, 不过最好的方案还是找一个 512 线的编码器;
6: 还要注意最小的 dds 步进 stepb1, stepb2 和 stepb3 的值是在 bandtab 里的每一个波段中定义的. 每一个 opto_1_count 都是增加或减少这 24 bit 的数字成为一个 32 bit 的 dds 操作字;
7: 然后关注一下 xcvr.h 文件中 do_not_display_hz 标签的定义, 一般不显示 hz 位, 也没对这个功能做过测试;
六、320*240 图文混排的移植与测试
***本文所使用的 320*240 液晶屏的控制器型号为 ra8835, 由 bg2raq 提供, 在此表示感谢
1: 代码移植帮助
有一个办法可以帮助调试代码:
新建一个工程, 把 17c766 的原版程序读入, 应用 debug 配置, 使用 mplab 的模拟器运行 17c766 的代码. 然后插入一个 "call" 在想要调试的模块或子程序中, 然后比较好的做法是编辑 init.asm 和设置一些断点. 这样就可以看到最原始的由 17c766 运行出来结果了, 可以为 18f8520 做调试参考.
2: graphics.asm 中的 bug
原文 graphics.asm 的 "g_pchar" 中的 "mullw (big_char_data1 - big_char_data)/2" 是一个已被证实的 bug, 把 "/2" 删除就可以使大字符正确查表;
在 "g_pchar:" 后跟一行 "movlw 0x31" 可以强制屏幕显示 11 个字符 "1" (如果设置了 do_not_display_hz , 那么就是10个);
在 "g_pstr_xy_charloop:" 中 "movpf postinc0,wreg" 后, 增加一行 "iorlw 0" 用于检测 wreg 是否为 0, 17c766 不需要这样做;
在 "movwf fsr0l" 后增加一行 "clrf fsr0h" 强制 fsr0 的高位为 0;
3: pb.asm 中的 bug
在 "pb_label_one:" 需要操作 pb_lab_offset (已存入 wreg, 实际是操作 wreg) 的 tblptrh 增加两次, 原文只操作一次, 造成 "soft button" 功能仅显示 6 个屏幕标签, 具体只需要把如下代码复制一份添加到下面即可:
----code begin----
addwf tblptrl
btfsc status,c
incf tblptrh
-----code end-----
4: pbfuncs.asm中的 bug
在检查 opto2 程序片时发现由于老外没有计划做第2个编码器, 于是就没有更改任何有关这部分的代码, 造成 opto2 呼出后全屏乱码, 在使用新的24c16时第一次可用, 但是菜单顺序与项目均不正确. 主要问题有2个, 第1个问题基本如3中所描述的:在 "opto2_mode:" 需要操作 pbl_index (已存入 wreg, 实际是操作 wreg) 的 tblptrh 增加两次, 原文只操作一次, 造成菜单项目不正确; 第2个问题是修复上述问题后仍旧发现奇怪的 s 表的值跟在菜单标签的后面, 百思不得其解, 后强制 fsr0h 为 0 后问题解决. 经检查可能是由于 i2c 或者老外的 uart 监控程序用到了 fsr0h 所带来的.
此段改动比较多, 所以把整个代码片保存一下
;=====================code begin========================
opto2_mode:
btfsc pb_state,7
return
btfss pb_state,0
return
bsf update_1,misc_change ; flag change
movff opto_2_mode,wreg ; read current mode
addlw 0
btfsc status,z ; if zero
movlw (pb_opto2_first - pb_func_index)/2 -1 ; set to first-1
addlw 1 ; increment
movwf opto_2_mode ; store new mode
movlw (pb_opto2_last - pb_func_index)/2 ; check overflow
subwf opto_2_mode,w
btfsc status,z
clrf opto_2_mode ; and go to null if so
movlw high pbl_index ; now index into pb labels
movwf tblptrh
movlw low pbl_index ; now index into pb labels
movwf tblptrl
movff opto_2_mode,wreg ; by opto2mode
addwf tblptrl
btfsc status,c
incf tblptrh ; add once
addwf tblptrl
btfsc status,c
incf tblptrh ; add twice, corrected by li yong bg5epe 29/oct/2006
tblrd*+ ; read, get lobyte
movff tablat,wreg ; read address of pb label text
tblrd* ; read hi byte of string address
movff tablat,tblptrh ; and store in tablepointer high
movff wreg,tblptrl ; and store in tablepointer low
;
movlw disp_buf ; point to display buffer
movwf fsr0l ; with fsr0l assume 0h is 0
clrf fsr0h ; force 0h is 0, otherwise smeter's value is attached. li yong bg5epe 29/oct/2006
;=====================code end========================
***未完待续***