论坛风格切换切换到宽版
  • 5964阅读
  • 13回复

AVR单片机直接控制C450的后板PLL实验成功 [复制链接]

上一主题 下一主题
离线BG4UVR
 
发帖
11288
只看楼主 倒序阅读 0楼 发表于: 2007-04-23
第一次玩pll,发帖纪念一下

http://www.bestcfan.net/article.asp?id=372
离线BA5RW
发帖
48263
只看该作者 1楼 发表于: 2007-04-23
祝贺一下,这才是业余精神!
离线ba1ka
发帖
1044
只看该作者 2楼 发表于: 2007-05-03
哈哈太好了。刚看你的贴以为你手里一定有upd2834芯片的资料,是c120 c111 c411 的pll芯片。我手里有一堆这类机器的残骸,想干与你同样的事,结果一查c150用的是mb1504。遗憾!
离线BG4UVR
发帖
11288
只看该作者 3楼 发表于: 2007-05-03
'
哈哈太好了。刚看你的贴以为你手里一定有upd2834芯片的资料,是c120 c111 c411 的pll芯片。我手里有一堆这类机器的残骸,想干与你同样的事,结果一查c150用的是mb1504。遗憾!
'

呵呵123
附件: uPD2834.pdf (0 K) 下载次数:269
离线hocool
发帖
20749
只看该作者 4楼 发表于: 2007-05-05
请教下,那些排线,哪个是场强信号?
离线ba1ka
发帖
1044
只看该作者 5楼 发表于: 2007-05-06
真有呀!我以前在网上没找到,太感谢啦。有兴趣吗?寄个C411尸体给你玩玩?
'
呵呵123
'

离线BG4UVR
发帖
11288
只看该作者 6楼 发表于: 2007-05-06
'
请教下,那些排线,哪个是场强信号?
'

s表信号不在后板的排线中,是前板与中板的排线中。
离线bg4jj
发帖
5094
只看该作者 7楼 发表于: 2007-05-06
支持原创d i y
离线BG4UVR
发帖
11288
只看该作者 8楼 发表于: 2007-05-07
'

真有呀!我以前在网上没找到,太感谢啦。有兴趣吗?寄个c411尸体给你玩玩?
[表情]
'

倒,昨天晚上看帖。只看到个表情符号,没看到标题,今天才看到。

c411的尸体好啊,就是可能有点忙,不太有时间搞。不过如果你寄来,我可以给你改写个控制程序出来
离线ba7ib
发帖
4569
只看该作者 9楼 发表于: 2007-05-07
好玩,记号
离线ba1ka
发帖
1044
只看该作者 10楼 发表于: 2007-05-08
明天起要住一周医院,出来后把C411尸体寄给你。程序还是我自己写吧,请把你的收件地址悄悄话告诉我。
'
倒,昨天晚上看帖。只看到个表情符号,没看到标题,今天才看到。
c411的尸体好啊,就是可能有点忙,不太有时间搞。不过如果你寄来,我可以给你改写个控制程序出来 [表情]
'

离线BG4UVR
发帖
11288
只看该作者 11楼 发表于: 2007-05-08
住院啊?保重身体,祝早日康复

东西不用给我寄了,如果不用我来搞程序,我没时间玩啊
离线ding
发帖
3488
只看该作者 12楼 发表于: 2007-05-08
哈哈,寄给我,我强行送到uvr那里去。。还有那c450、avr单片机也是我强行带过去的。哈哈
离线BG4UVR
发帖
11288
只看该作者 13楼 发表于: 2007-07-10
'
你好,我能试一下您的程序吗?我有好多旧的450,谢谢,73。
'

程序挺乱,是在我自己开发板上试的,你可以参考一下。

  1. #include <avr/io.h>
  2. #include <util/delay.h>
  3. #include <avr/pgmspace.h>
  4. #include <compat/ina90.h>   //定义_nop(),_cli(),_sei()
  5. //#include <avr/interrupt.h>
  6. #include <avr/eeprom.h>
  7. #include "1602.h"
  8. #include "mb1504.h"
  9. #define pll_ulock pd2
  10. #define power_t pd1
  11. #define power_r pd0
  12. #define power_ss pd6
  13. unsigned char step;
  14. unsigned long step_fre;
  15. unsigned long fre;
  16. unsigned long stepcode[7] ={5000,6250,10000,12500,25000,50000,100000};
  17. void dispfre(void);
  18. void mode_r(void);
  19. void mode_t(void);
  20. unsigned char chk_key(void);
  21. static void avr_init(void);
  22. int main(void)
  23. {
  24.   avr_init();
  25.   for(;;)
  26.   {
  27.            switch (chk_key())
  28.            {
  29.                  case 0xe0:                  //k1 更改步进
  30.                        step++;
  31.                        if(step>=7)
  32.                        {
  33.                              step=0;
  34.                        }
  35.                        step_fre=stepcode[step];
  36.                        switch(step)
  37.                        {
  38.                              case 0:
  39.                                    lcd_write_string(0,1,pstr("   5khz"));
  40.                                    break;
  41.                              case 1:
  42.                                    lcd_write_string(0,1,pstr("6.25khz"));
  43.                                    break;
  44.                              case 2:
  45.                                    lcd_write_string(0,1,pstr(" 10khz"));
  46.                                    break;
  47.                              case 3:
  48.                                    lcd_write_string(0,1,pstr("12.5khz"));
  49.                                    break;
  50.                              case 4:
  51.                                    lcd_write_string(0,1,pstr(" 25khz"));
  52.                                    break;
  53.                              case 5:
  54.                                    lcd_write_string(0,1,pstr(" 50khz"));
  55.                                    break;
  56.                              case 6:
  57.                                    lcd_write_string(0,1,pstr(" 100khz"));
  58.                                    break;
  59.                        }
  60.                        break;
  61.                  case 0xd0:                  //k2 频率增加
  62.                        fre+=step_fre;
  63.                        dispfre();
  64.                        set_fre(fre,step_fre);
  65.                        break;
  66.                  case 0xb0:                  //k3 频率减少
  67.                        fre-=step_fre;
  68.                        dispfre();
  69.                        set_fre(fre,step_fre);
  70.                        break;
  71.                  case 0x70:                  //k4 发射
  72.                        if(portd&_bv(power_r))
  73.                        {
  74.                              mode_t();
  75.                              lcd_write_string(0,0,pstr("tx"));
  76.                        }
  77.                        else
  78.                        {
  79.                              mode_r();
  80.                              lcd_write_string(0,0,pstr("rx"));
  81.                        }
  82.                        break;
  83.            }
  84.            if((pind&_bv(pll_ulock))==0)
  85.            {
  86.                  lcd_write_string(10,1,pstr("locked"));
  87.            }
  88.            else
  89.            {
  90.                  lcd_write_string(10,1,pstr("unlock"));
  91.            }
  92.   }
  93.   return(0);
  94. }
  95. void dispfre(void)
  96. {
  97.      lcd_write_char(4,0,fre/100000000+0x30);
  98.      lcd_write_char(5,0,(fre%100000000)/10000000+0x30);
  99.      lcd_write_char(6,0,(fre%10000000)/1000000+0x30);
  100.      lcd_write_char(8,0,(fre%1000000)/100000+0x30);
  101.      lcd_write_char(9,0,(fre%100000)/10000+0x30);
  102.      lcd_write_char(10,0,(fre%10000)/1000+0x30);
  103.      lcd_write_char(11,0,(fre%1000)/100+0x30);
  104. }
  105. void mode_r(void)
  106. {
  107.      portd&=~_bv(power_t);
  108.      portd|=_bv(power_r);
  109. }
  110. void mode_t(void)
  111. {
  112.      portd&=~_bv(power_r);
  113.      portd|=_bv(power_t);
  114. }
  115. static void avr_init(void)
  116. {
  117.      ddrb&=0x0f;                              //b口高4位为输入
  118.      portb|=0xf0;                        //打开上拉电阻
  119.      ddrd=~_bv(pll_ulock);            //设置d口除ul外均为输出脚
  120.      portd|=_bv(power_ss);            //开vco电源
  121.      mode_r();                              //开接收模式
  122.   pll_init();                              //初始化pll端口
  123.      lcd_init();                              //初始化lcd
  124.      
  125.      step=2;
  126.      step_fre=stepcode[step];
  127.      fre=435000000;
  128.      set_fre(fre,step_fre);
  129.      lcd_write_string(0,0,pstr("rx= 435.0000 mhz"));
  130.      lcd_write_string(0,1,pstr(" 10khz"));
  131.      return;
  132. }
  133. //查键函数
  134. unsigned char chk_key(void)
  135. {
  136.      volatile unsigned char temp;
  137.      temp=pinb&0xf0;
  138.      if(temp!=0xf0){
  139.            _delay_ms(20);
  140.            if(temp==(pinb&0xf0)){
  141.                  while((pinb&0xf0)!=0xf0);
  142.                  _delay_ms(20);
  143.                  return(temp);
  144.            }
  145.      }
  146.      return(0);
  147. }


  1. #ifndef __mb1504_h__
  2. #define __mb1504_h__
  3. //参考振荡器晶体频率
  4. #define x_fre 6400000
  5. //pll开关位 h=32预分频,l=64预分频
  6. #define pll_sw 0                        
  7. //定义pll引脚
  8. #define pll_data pd4      //pll串行数据线
  9. #define pll_clock pd5      //pll串行时钟线
  10. #define pll_le pd3            //pll输出使能
  11. //pll端口状态初始化
  12. void pll_init(void)
  13. {
  14.      portd&=0xc7;            //pll3条控制线全部置低电位
  15. }
  16. void end_bit(void){
  17.      //输出尾bit
  18.      _delay_us(2);
  19.      portd|=_bv(pll_clock);
  20.      _delay_us(2);
  21.      portd&=~_bv(pll_clock);
  22.      _delay_us(2);
  23.      //使能输出
  24.      portd|=_bv(pll_le);
  25.      _delay_us(2);
  26.      portd&=~_bv(pll_le);
  27. }
  28. //15bit参考分频比发送函数
  29. //ref_ratio有效范围8-16383
  30. void bit15send(unsigned int ref_ratio){
  31.      unsigned char i;
  32.      //输出32/64分频开关选择
  33.      if(pll_sw==1)
  34.      {
  35.            portd|=_bv(pll_data);
  36.      }
  37.      else
  38.      {
  39.            portd&=~_bv(pll_data);
  40.      }
  41.      _delay_us(2);
  42.      portd|=_bv(pll_clock);
  43.      _delay_us(2);
  44.      portd&=~_bv(pll_clock);
  45.      //输出参考分频比
  46.      for(i=0;i<14;i++){
  47.            if((ref_ratio&0x2000)==0)
  48.            {
  49.                  portd&=~_bv(pll_data);
  50.            }
  51.            else
  52.            {
  53.                  portd|=_bv(pll_data);
  54.            }
  55.            _delay_us(2);
  56.            portd|=_bv(pll_clock);
  57.            _delay_us(2);
  58.            portd&=~_bv(pll_clock);
  59.            ref_ratio<<=1;
  60.      }
  61.      //输出尾bit
  62.      portd|=_bv(pll_data);
  63.      end_bit();
  64. }
  65. //18bit可编程分频比及余数分频比发送函数
  66. void bit18send(unsigned int pro_ratio,unsigned char swallow_ratio){
  67.      unsigned char i;
  68.      //输出可编程分频比
  69.      //pro_ratio有效范围16-2047
  70.      for(i=0;i<11;i++){
  71.            if((pro_ratio&0x400)==0)
  72.            {
  73.                  portd&=~_bv(pll_data);
  74.            }
  75.            else
  76.            {
  77.                  portd|=_bv(pll_data);
  78.            }
  79.            _delay_us(2);
  80.            portd|=_bv(pll_clock);
  81.            _delay_us(2);
  82.            portd&=~_bv(pll_clock);
  83.            pro_ratio<<=1;
  84.      }
  85.      //输出余数分频比
  86.      //swallow_ratio有效范围0-63
  87.      for(i=0;i<7;i++){
  88.            if((swallow_ratio&0x40)==0)
  89.            {
  90.                  portd&=~_bv(pll_data);
  91.            }
  92.            else
  93.            {
  94.                  portd|=_bv(pll_data);
  95.            }
  96.            _delay_us(2);
  97.            portd|=_bv(pll_clock);
  98.            _delay_us(2);
  99.            portd&=~_bv(pll_clock);
  100.            swallow_ratio<<=1;
  101.      }
  102.      //输出尾bit
  103.      portd&=~_bv(pll_data);
  104.      end_bit();
  105. }
  106. //设置目标输出频率函数
  107. void set_fre(unsigned long out_fre,unsigned long step)
  108. {
  109.      unsigned char temp;
  110.      if(pll_sw==1){
  111.            temp=32;
  112.      }else{
  113.            temp=64;
  114.      }
  115.      bit15send(x_fre/step);
  116.      bit18send((out_fre/step)/temp,(out_fre/step)%temp);
  117. }
  118. #endif


比较忙,图纸就不整理了,你看程序应该能了解大体的接线。1602的驱动到处都有,也不上了