搜索
bottom↓
回复: 11

几个关于PIC单片机的问题,请大家帮帮忙,谢谢

[复制链接]

出0入0汤圆

发表于 2009-8-27 17:12:51 | 显示全部楼层 |阅读模式
我的编译器用的是C18,我只会用C编程,用的片子是PIC18F25K20。
问题1.如何定义一个复位不初始化的变量。
问题2.PWM输出,我要的程序运行过程中要调整脉宽(不考虑小数部分),直接写CCPR1L就可以了吗?新写入的值是不是从PWM的下一个周期输出的时候生效的,还有TMR2IF的中断标志位和这个PWM输出的有什么关系,是不是不用去考虑它。
问题3.AD采样的时候,我要切换通道,是不是只要一次转换完毕之后,直接设定通道,然后再打开AD转换就可以了。

小弟我是PIC新手,以前不用PIC的,感觉PIC不是很友好,特别是它的调试工具ICD2不好用,速度很慢,功能很弱。

出0入0汤圆

发表于 2009-8-27 17:31:55 | 显示全部楼层
个人认为PIC的  CCS C是最好用的
  问题1:汗-复位不初始化的变量我也不知。 (只知常量和变量,常量复位不会变,好比码表)
       有那位大X来解译一下复位不初始化的变量? EEPROM里的值吧呵。
问题2:CCS C噢
        
        //setup_timer_2(T2_DIV_BY_16,150, 5);   // 设定PWM的频率=1/周期      130
       // setup_ccp1(CCP_PWM);                  // 设定CCP1为 "11**" 即为PWM模式
       // set_pwm1_duty(40);                  // 设定PWM的脉宽即占空比.data越大高电平越长duty=0输出低电平

问题3. 先设定用内部RC时钟还是外部时钟。 然后切换通道,开AD转换
       SETUP_ADC(ADC_CLOCK_INTERNAL);
       SETUP_ADC_PORTS( AN0_AN1_AN3 );   
       SET_ADC_CHANNEL(3);
       ;
        da=READ_ADC();

出0入0汤圆

发表于 2009-8-27 17:49:11 | 显示全部楼层
复位不初始化的话,不要用static限定,定义不赋值就OK了。楼主说的应该是全局变量。 这个变量会被编译到未初始化段,不占用实际代码空间。复位一般会被清零。

出0入0汤圆

发表于 2009-8-27 18:50:51 | 显示全部楼层
initialization is done by the start-up code so one approach is to modify that.

another is write the variable to the on-board eeprom and then read from it upon reset.

出0入0汤圆

发表于 2009-8-27 19:15:57 | 显示全部楼层
回1楼的:
   我的单片机启蒙就是用的PIC16F877和CCS C,特别喜欢CCS,但我现在用KEIL和C8051了.

出0入0汤圆

发表于 2009-8-27 20:45:32 | 显示全部楼层
PICC中可以用persistent关键词
不知道C18中有没有类似的

出0入0汤圆

发表于 2009-8-27 21:15:00 | 显示全部楼层
我的单片机启蒙就也是用的PIC16F877和CCS C,  第一个量产就是用的CCS C  真的是很喜欢呵 有8年了吧
  PICC 就象用汇编来写C (但现给MICROCHIP给收购了)

出0入0汤圆

发表于 2009-8-27 21:52:50 | 显示全部楼层
我和楼上的一样。。。

CCSC 资源不如 PIC18多,因为官方的都是PIC18的。

我只会问题1, MCU启动后,从EEPROM 中读取回来即可。

出0入0汤圆

 楼主| 发表于 2009-8-28 08:51:53 | 显示全部楼层
谢谢大家的帮忙,但是问题貌似还存在。
对于问题1,提问的时候没有说清楚,我的意思是单片机受到干扰而复位或者WDT复位之类的,只是复位而不断电(不是上电复位),以前用IAR编译器的时候有__no_init来定义复位不初始化的变量,意思和5楼说的那个差不多,但是C18里面好像没有类似的关键字。
对于问题2,因为我从芯片手册上看不到PWM方面更具体的操作,买的书上也没有详细的示例,比如说让PWM工作起来我会,但是更进一步的比如说我改变占空比,书上或者手册上都没有说怎么改,我就不明白了,所以我就问是不是直接写CCPR1L,占空比就会在下一个PWM周期里面调整。
对于问题3,按照2楼的说法,我的理解是 转换完成后开始新的转换前(此时GO/DOWN位为0),改变通道ADCCON0的CHS相应的位,选择通道,然后再开启GO/DOWN位(为1),就可以了。

出0入0汤圆

发表于 2009-9-2 13:58:31 | 显示全部楼层
1 我也不清楚
2 PR2的值就是你的PWM的周期(书上有公式算的)CCPR1L与PR2的比值就是你的占空比,所以要改变占空比就改变CCPR1L里的值就好了。
3 AD采样在通道转换后需要有一定的延迟(几十个NOP就差不多了),然后在启动AD转换(ADGO=1),稍作延迟后AD采样完成
TMR2IF是TMR2中断的标志,单纯的在PWM应用里来理解就是,你每次输出一个或几个(具体个数根据相应标志位设置)PWM的脉冲就会触发一次TMR2中断,所以如果你需要定时改变PWM的占空比,就可以在TMR2中断后改变占空比,将在下一个脉冲输出时生效。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-5-9 18:07

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表