Board logo

标题: ※学习MC9S12单片机——软件篇※ 不断更新中 [打印本页]

作者: asker_dfr    时间: 2005-3-12 10:04

请教:
void TimerOverflow(void) {
/* This function waits for th timer overflow.
Then it changes the LEDs bargraph display */
while (TCNT != 0x0000);
while (TCNT == 0x0000);
counter++;

这一段中两个while循环起什么作用呢?我的理解是,当TCNT不等于0000时,执行后面的,分号内为空,所以又执行下一句while,结果还是只判断了一下。综合一下,TCNT不是0000,就是非0000,这两句while有什么用呢?谁能点拨一下
作者: asker_dfr    时间: 2005-3-12 10:19

刚才我自己又想到了一点,是关于while的,首先判断while后条件语句的值,为真则执行循环内的语句,之后马上返回while循环的顶部再次对表达式求值,如果仍为真则继续循环,否则(表达式为假)才绕过该循环,执行下一个语句,所以,这句话……还是有些不解,不太清楚TCNT != 0x0000的判断意图
作者: asker_dfr    时间: 2005-3-13 10:22

昨天是周六啊,大家也是要休息的,怪不得没人回了,自己先顶一下。周一期待。
前天晚上,华中地区大雪,气温下降较快,不过今天又是大好的晴天。沐浴在这么好的阳光下,不多多学习怎么成呢?
作者: asker_dfr    时间: 2005-3-14 08:08

一上班,把帖子顶起来先
作者: hlzhangxt    时间: 2005-3-14 08:46     标题: 顶一下

我对硬件不熟悉。不明白,TCNT是什么端口。
while (TCNT != 0x0000);
while (TCNT == 0x0000);
应该这样解释: 当TCNT不为0时,程序停在这里做循环。直到 TCNT为0;
                         随后,继续做第二个循环,程序又停止。直到 TCNT不为零。

这时, counter增1。

应该时用 counter来计算 端口 TCNT 传进来的 不为0 的 短整数的个数。
[em27][em27]
作者: asker_dfr    时间: 2005-3-14 09:16

TCNT是该MCU的定时器计数寄存器
“用 counter来计算 端口 TCNT 传进来的 不为0 的 短整数的个数。”这样似乎有点道理 Thx hlzhangxt
结合整个程序来说,还是有点不明白
作者: hlzhangxt    时间: 2005-3-14 09:30     标题: 明白了

应该是计算 计数器 益出的次数,根据益出的次数,依次点亮 portb 控制的 led.
作者: asker_dfr    时间: 2005-3-14 10:11

明白了,hlzhangxt帮俺不止一次啦。^_^
作者: aguang1024    时间: 2005-3-14 10:22

哥哥,你学习c语言多久了,我建议你先看看C语言编程的课本。while语句是不循环的,do while才是循环与据
作者: asker_dfr    时间: 2005-3-14 12:06

兄弟,俺是一边看程序,一边复习C,感觉基础不牢靠,汗颜啊,不过,应该很快会赶上来地,支持一下
作者: asker_dfr    时间: 2005-3-14 13:21

aguang1024兄弟说:while语句是不循环的,do while才是循环与据。
现在就有一个不得不说的事情:while与do/while循环非常类似,区别在于do/while语句是先执行循环后判断……二者只要表达式为真,就会执行循环。
新手的一点理解,见笑
作者: hlzhangxt    时间: 2005-3-14 15:06     标题: while是循环

我用来 成百上千 次 while, 如果不做循环,那么 if 语句做什么用呢?[em12][em12]
作者: hlzhangxt    时间: 2005-3-14 16:19     标题: 各位同仁,帮忙!

从读研究生算起,做软件开发都快 9 年了,从上层开发, VC++ , delphi, 数据库
到现在的嵌入式开发,可谓:曾经沧海难为水,除却巫山不是云!
英雄穷途末路........, 我们公司外资方撤资,要变成纯正 国企 了, 情势不妙.........
哪位仁兄有工作机会,给推荐一下......, 小弟有礼了..........
hlzhangxt@yahoo.com.cn[em25][em25][em09][em10][em08][em04]
作者: asker_dfr    时间: 2005-3-14 16:57

本来是来学MC9S12的,可现实还是现实,在我还没发掘难以解决的问题前,况且hlzhangxt需要同仁的help,就再借宝地转发一下帖子,激励一下,或许有写启发,天无绝人之路嘛。你至少好是个研究生嘛……
From 21ic (转贴)   
                          一个研究生毕业以后的人生规划
我今年39岁了, 25岁研究生毕业,工作14年,回头看看,应该说走了不少的弯路,有一些经验和教训。现在开一个小公司,赚的钱刚够养家糊口的。看看这些刚毕业的学生,对前景也很迷茫,想抛砖引玉,谈谈自己的看法,局限于理工科的学生,我对文科的不懂,身边的朋友也没有这一类型的。

  91年研究生毕业,那时出路就是1种:留在北京的国营单位,搞一个北京户口,这是最好的选择。到后来的2~3年内,户口落定了,又分成4条出路:

  1、 上国内的大企业,如:华为
  2、 自己做公司,做产品开发;
  3、 上外企,比如:爱立信、诺基亚
  4、 自己做公司,做买卖;
  5、 移民加拿大

  我想,首先要看自己适合做什么?做技术还是做买卖。

  做技术,需要你对技术感兴趣。我掰着数了一遍,我们研究生班的30来号人,实际上,适合做技术的,大概只有3、4个人,这几个人,1个现在还在华为,3个移民加拿大了,现在这4个人混的还可以,在华为的同学也移民加拿大了,他在华为呆了6年,在华为奖金工资加起来大概30万吧,还有华为的股票,再过几年,华为的股票一上市,也能值个100~200万。要是一毕业就去华为,那现在就绝对不是这个数字了。

  要是做技术,最好的就是上大公司,国内的大型企业,象华为中兴肯定是首选,能学到很多东西。华为虽然累,但是,年轻人不能怕累,要是到老了,还需要去打拼,那才是真的累啊。

  在外企,我想他们主要就是技术支持和销售,但是技术是学不到的,当然不能一概而论,我指的是象爱立信和诺基亚,真正的研发不会在中国做的,学到的也不如在华为多,其它的中兴我不是很了解,我想应该也不错啊。一个人都有一技之长,有傍身之技,那是最好的,走到哪里,都能有一口饭吃,还吃的不错,这是传统的观点。

  任何技术都是要在某个行业去应用,这个行业市场越大当然越好;要在一个领域之内,做深做精,成为绝对的专家,这是走技术道路的人的选择。不要跳来跳去,在中国,再小的行业你要做精深了,都可以产生很大的利润。

  研究生刚毕业的时候,做产品开发的有不少人,都是自己拍拍脑子,觉得这个产品有市场,就自己出来做。现在看来,我的这些同学,做产品开发的成功的没有一例,为什么?资源不足。

  1. 资金,刚毕业的学生啊,就是没钱;没钱,也意味着你开发的东西都是小产品;而且只能哥几个自己上,研发、生产、销售都是一个人或者几个人自己来,没有积累,什么都是重新来过。

  2. 人脉,任何一个行业,要想进去,需要有很深的人脉,否则,谁会用你的东西啊?谁敢用你的东西啊?

  我看到的我这个班上开发产品的,自己还在坚持的,只剩下一个人了,说实在的,到现在,没有自己的汽车,也没有自己的房子,混的挺惨的。现在出国的不说了,在外企、在华为,至少都是几十万的年薪了,还有各种福利,就是产品开发成功了,又能如何?也就是这样了,但是以前那些年,都没有金钱的积累,等于白干。

  我身边的一个自动化系的研究生班的同学,能靠自己开发产品活得还可以的,也只有2个人。说明这条路不是那么好走的啊。

  其次就是上外企。我的2个同学,一个上了爱立信,一个先到爱立信后到诺基亚,都混的不错。到诺基亚的后来利用在诺基亚结识的人脉(就是哪些电信的头头脑脑),自己开了公司,也赚了不少的钱。

  外企最大的好处就是除了能学到比较规范的管理外,还能给你的职业生涯镀金。到了一个外企外,再到同行业的外企我想就很容易了。而且外企的收入高啊。

  自己做公司,做买卖,一开始有3~4个人走这条路,但是真正发财的只有一个人,其他人后来上外企了。做买卖,还是要有一定的天赋,还有机遇。要有对金钱的赤裸裸的欲望,要有商业上的头脑。后来我们同学在一起谈,说,我们即使给自己这个机遇,也未必能做的好。何况当时那个同学看好的产品(做一个台湾产品的代理),我们大家都没有看好,说明,真理还是掌握在少数人手里。

  到后来,同学们纷纷移民移民加拿大。

  移民加拿大对搞技术的人来说,还是一个不错的选择,但是要尽早,练了几年的技术,就赶紧出去,大概是在1996年走了不到10个,现在都还可以,买了房子和车了。要是晚了,语言再学也难了,而且在国内都混的还可以了,也就没有必要出去了。
我自己呢,先是在国营的研究所混了4年,后来到一家公司干了6年,2002年出来自己做公司,现在也就是混了一个温饱吧,算是有房有车,有点积蓄,但是不多,还有一个可爱的女儿。回首这10来年,有一些经验和教训。

  1. 要有一个职业生涯的规划。首先需要定位自己做什么合适,是做买卖还是做技术,一条路走到黑;当然,做了技术,后来改行也行;

  2. 做技术,就是要做精做深,成为这个行业的这个技术的专家;最好就是去国内的大公司,才能全面学到东西,能够给你培训的机会;如果大公司进不去,先到小公司练技术,找机会再到大公司去镀金,学高深的技术。千万不要自己做产品,要做也是对这个行业熟悉了,再去做。

  3. 积极争取机会。积极争取学习和进步的机会。比如,做技术,就需要多锻炼,多学习,来提高自己的水平。一门技术,只要有机会去学习,都能学的会;要是没有机会,天才也没有办法学到这个技术。柳传志就说,杨元庆就是“哭着喊着要进步”,实际上,就是争取自己的机会;当然,这种强烈的进步欲望,也是领导看重的地方。每一步都走在前面,积累10年,你就有了比其他人更多的机会了。

  4. 积累个人的信誉。从你的职业生涯的第一天,就要按照诚信的原则办事。要做到,当人们提起你的名字的时候,说,这哥们还不错,做事还行。

  5. 注意利用资源。如果你有有钱的亲戚、成功的长辈或者朋友,可以充分利用这些机会,得到更加顺利的发展前景。

  6. 注意财富的不断积累。人生要想得到自由,财富是很关键的。否则,永远仰人鼻息,永远看人脸色。人都是势利眼。今后的家庭、职业生涯,金钱的积累很重要,没有钱,永远不能开张自己的事业,得到更多的机会;财富要做到逐年积累,你才能家庭生活幸福。没有钱是不可能有幸福的家庭的。

  7. 注意人脉的积累。最终,事业要靠在社会上的人脉的资源。要注意认识在你这个行业的人,结交他们,最终他们会成为你事业上的助力。

  8. 寻求贵人相助。要找大老板来帮助你,得到大老板的赏识。想想看,大蛋糕,切一点就够了,小蛋糕,都给你也吃不饱啊。

  9. 多听听成功的前辈和成功的朋友的意见。注意少听家里长辈的意见,尤其是都已经退休的长辈,他们对社会的认识还停留在很久以前,而这个社会已经发生很大的变化呢。最重要的是,长辈有时候会强求你做一些事情,但是,最终的结果他们是不负责的。只有你才能对自己负责。
作者: asker_dfr    时间: 2005-3-14 17:07

(又一转贴)

几点个人感受

1、 满足是短暂的,不满是永久的;
2、 一定要做好职业规划,给自己明确定位和发展路线;
3、 如果感觉工作没有意义,没有发展和学习空间,尽早离开;
4、 在困境中坚持学习,哪怕自己买书买报看;
5、 任何一份工作,即使感觉一无是处,也有其可取之处,正所谓“尺有所短,寸有所长”;
6、 不要过分计较薪水;
7、 哪怕感觉没有任何希望,也不妨一试,机会往往就降临了;
8、 现在没有高薪水、高职位,不代表以后没有;
9、 再也不想过投简历、应聘、面试的日子;
10、没有一家公司是完美的,总是比想象中的差很多,所以不能这山望着那山高;
11、在职场初期给自己找一个标杆人物,虽然不必复制他的道路,至少能够给自己提供动力;
12、说实话,我很羡慕那些著名高等学府毕业生,拥有很高的学历和能够接触大量人和事的工作环境,这三样东西其实很有用

进入国企是不是意味着收入少啦,竞争少了?还是其他什么考虑?走出去,会有属于自己的地方

还是言归正传,回到,我接触的都是写软硬件方面结合的事情,介绍几个我刚刚看过的软件滤波方法的示例程序,还有点启发,程序倒是挺简单,但实际中还是蛮有用的——

限副滤波
/*  A值可根据实际情况调整
    value为有效值,new_value为当前采样值  
    滤波程序返回有效的实际值  */
#define A 10

char value;

char filter()
{
   char  new_value;
   new_value = get_ad();
   if ( ( new_value - value > A ) || ( value - new_value > A )
      return value;
   return new_value;
         
}
作者: asker_dfr    时间: 2005-3-14 17:08

中位值滤波法 /* N值可根据实际情况调整 排序采用冒泡法*/ #define N 11 char filter() { char value_buf[N]; char count,i,j,temp; for ( count=0;count>value_buf[i+1] ) { temp = value_buf; value_buf = value_buf[i+1]; value_buf[i+1] = temp; } } } return value_buf[(N-1)/2]; }
作者: asker_dfr    时间: 2005-3-14 17:44

递推平均滤波法(又称滑动平均滤波法) /* */ #define N 12 char value_buf[N]; char i=0; char filter() { char count; int sum=0; value_buf[i++] = get_ad(); if ( i == N ) i = 0; for ( count=0;count[此贴子已经被作者于2005-3-14 17:44:52编辑过]


作者: asker_dfr    时间: 2005-3-14 17:46

“for ( count=0;count sum = value_buf[count]; ”这句话我每次贴上去时都有问题 干脆手写吧 … for (count=0;count 作者: hlzhangxt    时间: 2005-3-15 10:26

看不明白,写清楚些![em27]
作者: hlzhangxt    时间: 2005-3-15 10:29     标题: for

for语句少个)[em07]
作者: hlzhangxt    时间: 2005-3-15 10:29     标题: {

还少个 {[em10]
作者: asker_dfr    时间: 2005-3-15 15:11

)和}不是问题的症结,明明在word或写字板上有的,贴上来却莫名其妙地丢失了。所以才手写了一下,不过还是有问题 再贴一次,看是不是还出现那种丢失字符的情况—— 递推平均滤波法(又称滑动平均滤波法) #define N 12 char value_buf[N]; char i=0; char filter() { char count; int sum=0; value_buf[i++] = get_ad(); if ( i == N ) i = 0; for ( count=0;count 作者: asker_dfr    时间: 2005-3-15 15:17

又出问题拉,我怀疑是不是IE或者系统的一些缺陷,使得贴文件出现奇怪的

for ( count=0;count sum = value_buf[count];

情况,for的完整形式被破坏了,wwwwww
是不是一个巨大网络或者程序破绽的冰山一角呢?还会其他很细节的问题。(这个只是说发帖子出现的问题,与本程序无关)
作者: asker_dfr    时间: 2005-3-15 15:22

#define N 12 char value_buf[N]; char i=0; char filter() { char count; int sum=0; value_buf[i++] = get_ad(); if ( i == N ) i = 0; for ( count=0;count 作者: asker_dfr    时间: 2005-3-15 15:26

紧急通缉这个恐怖的法帖现象,我的源程序从http://www.mcu51.com/list.asp?id=541   找到,时其中的第四中滤波方法,现不管发贴出现的奇怪问题,在那个程序中,好像sum=value_buf[count]没起到累加的作用,好像要改成sum+=value_buf[count]才对啊

希望没有搞晕了头,反正我已经头晕了(最近好像感冒,却是头痛)
作者: hlzhangxt    时间: 2005-3-15 15:43     标题: 天气变化无常,注意防寒保暖

sum=value_buf[count]  是赋值,

sum+=value_buf[count]  相当于: sum = sum + value_buf[count]
[em26][em25][em24][em24][em23][em22]
作者: hlzhangxt    时间: 2005-3-15 15:51     标题: 我试着上传一次

#define N 12 char value_buf[N]; char i=0; char filter() { char count; int sum=0; value_buf[i++] = get_ad(); if ( i == N ) i = 0; for ( count=0;count 作者: hlzhangxt    时间: 2005-3-15 15:53     标题: 再来一次

#define N 12 char value_buf[N]; char i=0; char filter() { char count; int sum=0; value_buf[i++] = get_ad(); if ( i == N ) i = 0; for ( count=0;count 作者: asker_dfr    时间: 2005-3-15 16:00

好像还是有问题吧,这少在我这个浏览器下看是这样子地。
关于sum=value_buf[count] 是赋值,
sum+=value_buf[count] 相当于: sum = sum + value_buf[count]

这个我明白,但是用在这儿做滤波的话,当求和以再求均值,当初怀疑是sum+=value_buf[count] 这句录入是少了一个“+”号。

以后要锻炼身体拉,身体是革命的本钱。(我就定了个规矩,板凳上坐一个小时,就应该站立走动一会儿,避免职业病啊)
作者: hlzhangxt    时间: 2005-3-15 16:15     标题: 给你发个软件,提示休息。

告诉我你的 email[em27]
作者: asker_dfr    时间: 2005-3-15 16:26

asker_dfr@yahoo.com.cn      你也是yahoo的邮箱吧
作者: asker_dfr    时间: 2005-3-21 12:56

给自己的告诫
                                    不要做浮躁的人

这是从其他论坛中拷贝过来的,有借鉴意义。
请不要做浮躁的人
1.不要看到别人的回复第一句话就说:给个代码吧!你应该想想为什么。当你自己想
出来再参考别人的提示,你就知道自己和别人思路的差异。
2.初学者请不要看太多太多的书那会误人子弟的,先找本系统的学,很多人用了很久
都是只对部分功能熟悉而已,不系统还是不够的。
3.看帮助,不要因为很难而自己是初学者所以就不看;帮助永远是最好的参考手册,
虽然帮助的文字有时候很难看懂,总觉得不够直观。
4.不要被对象、属性、方法等词汇所迷惑;最根本的是先了解最基础知识。
5.不要放过任何一个看上去很简单的小问题--他们往往并不那么简单,或者可以引伸
出很多知识点;不会举一反三你就永远学不会。
6.知道一点东西,并不能说明你会写脚本,脚本是需要经验积累的。
7.学脚本并不难,JSP、ASP、PHP等等也不过如此--难的是长期坚持实践和不遗余力的博览
群书;
8.看再多的书是学不全脚本的,要多实践
9.把时髦的技术挂在嘴边,还不如把过时的技术记在心里;
10.学习脚本最好的方法之一就是多练习;
11.在任何时刻都不要认为自己手中的书已经足够了;
12.看得懂的书,请仔细看;看不懂的书,请硬着头皮看;
13.别指望看第一遍书就能记住和掌握什么——请看第二遍、第三遍;
14.请把书上的例子亲手到电脑上实践,即使配套光盘中有源文件;
15.把在书中看到的有意义的例子扩充;并将其切实的运用到自己的工作中;
16.不要漏掉书中任何一个练习——请全部做完并记录下思路;
17.当你用脚本到一半却发现自己用的方法很拙劣时,请不要马上停手;请尽快将余
下的部分粗略的完成以保证这个代码的完整性,然后分析自己的错误并重新编写和工
作。
18.别心急,写脚本确实不容易;水平是在不断的实践中完善和发展的;
19.每学到一个脚本难点的时候,尝试着对别人讲解这个知识点并让他理解----你能
讲清楚才说明你真的理解了;
20.记录下在和别人交流时发现的自己忽视或不理解的知识点;
21.保存好你做过的所有的源文件----那是你最好的积累之一;
22.对于网络,还是希望大家能多利用一下,很多问题不是非要到论坛来问的,首先
你要学会自己找答案,比如google、百度都是很好的搜索引擎,你只要输入关键字就
能找到很多相关资料,别老是等待别人给你希望,看的出你平时一定也很懒!
23,到一个论坛,你学会去看以前的帖子,不要什么都不看就发帖子问,也许你的问
题早就有人问过了,你再问,别人已经不想再重复了,做为初学者,谁也不希望自己
的帖子没人回的。
24,虽然不是打击初学者,但是这句话还是要说:论坛论坛,就是大家讨论的地方,
如果你总期望有高手总无偿指点你,除非他是你亲戚!!讨论者,起码是水平相当的
才有讨论的说法,如果水平真差距太远了,连基本操作都需要别人给解答,谁还跟你
讨论呢。

浮躁的人容易问:我到底该学什么;----别问,学就对了;
浮躁的人容易问:Js有钱途吗;----建议你去抢银行;
浮躁的人容易说:我要中文版!我英文不行!----不行?学呀!
浮躁的人分两种:只观望而不学的人;只学而不坚持的人;
浮躁的人永远不是一个高手。
作者: asker_dfr    时间: 2005-3-21 12:56     标题: ※学习MC9S12单片机——软件篇※ 不断更新中

以前已经发了一些帖子,都得到了很好的回复,所以我借此宝地,来开展关于MCS12DP256芯片(为主)和相关的学习与讨论。希望得到版主和众位的帮助,在这里主要贴在软件学习实践过程中遇到的问题,相信,不断学习、不断思考,总会有所收获,你说呢? 先来解剖一只麻雀吧,上次请教关于指针的问题,其实是属于俺对于基本概念的不清,造成读程序有困难,现把这只麻雀贴置如下: /* LEDS.C example file for Motorola MC9S12DP256 Evaluation Board */ #include /* port B definitions */ #define PORTB (*((volatile unsigned char*)(0x0001))) #define DDRB (*((volatile unsigned char*)(0x0003))) /* Timer TCNT definitions */ #define TSCR1 (*((volatile unsigned char*)(0x0046))) #define TSCR2 (*((volatile unsigned char*)(0x004D))) #define TFLG2 (*((volatile unsigned char*)(0x004F))) #define TCNT (*((volatile unsigned short*)(0x0044))) int counter; void TimerOverflow(void) { /* This function waits for th timer overflow. Then it changes the LEDs bargraph display */ while (TCNT != 0x0000); while (TCNT == 0x0000); counter++; if (counter == 1) PORTB = 0x7f; /* LEDs' lightshow */ if (counter == 2) PORTB = 0xbf; if (counter == 3) PORTB = 0xdf; if (counter == 4) PORTB = 0xef; if (counter == 5) PORTB = 0xf7; if (counter == 6) PORTB = 0xfb; if (counter == 7) PORTB = 0xfd; if (counter == 8) PORTB = 0xfe; if (counter == 9) PORTB = 0xAA; if (counter == 10) PORTB = 0x55; if (counter == 11) PORTB = 0xAA; if (counter == 12) PORTB = 0x55; } void main(void) { TSCR1 = 0x80; /* enable timer TCNT */ TSCR2 = 0x03; /* TCNT prescaler setup */ counter = 0; DDRB=0xff; /* PTB as output */ PORTB=0xff; /* LEDs off */ for (;;) { TimerOverflow(); if (counter >= 12) { counter = 0; if (TSCR2 == 0x03) TSCR2 = 0x07; else TSCR2 = 0x03; /* TCNT prescaler switch */ } } }
作者: asker_dfr    时间: 2005-3-25 14:50

“//”外的注释是我一边看程序 ,一边对照寄存器map写的,有不对处,希望大家多多指出,很多地方写的就是“不明白”,要像大家请教的。

有几个特别不明白的地方:
1。这里我决得是从CAN0——>CAN4,其中下面那一大串
CAN4TXFG1=0x01;      //发送区域写数据(??)
CAN4TXFG2=0x00;
CAN4TXFG4=0x41;
CAN4TXFG5=0x42;
CAN4TXFG6=0x43;
CAN4TXFG7=0x44;
CAN4TXFG8=0x45;
CAN4TXFG9=0x46;
CAN4TXFGA=0x47;
CAN4TXFGB=0x48;
CAN4TXFGC=0x49;

是给发送区域写数据(是吗?),目的是要传至can0接受的地方,在寄存器定义中,用的是
#define CAN0RXFG0   (*((volatile unsigned char*)(0x0160)))
……
#define CAN0TXFG0   (*((volatile unsigned char*)(0x0170)))   
……
在初始化和主程序里,是如何进行处理接受那一部分的呢?有发送的,接受的在哪里呢?有的话,哪个(些)语句起到了这样的作用呢?很不明白。

2。我看到MSCAN模块有中自测模式,这里会不会是用到这个呢?(我决得好像没有,因为没有发现对寄存器CANCTL1中的Loopb做处理。
作者: asker_dfr    时间: 2005-3-25 15:00

有不明之处,请教大家。上次见jsbychm 问过关于MOTO芯片的MSCAN通讯问题,那个程序我还看不明白,现在找了一个比较简单的,其中最关键的,就是如何进行can通讯的,还是不明要领:
/* 该例子来自邵老师那本关于S12的书里头的一个can通讯的范例程序,大致意思是将数据利用mscan0传,mscan4接收

#include "printp.h"
#define PORTB    (*((volatile unsigned char*)(0x0001)))   
#define DDRB     (*((volatile unsigned char*)(0x0003)))

#define CAN0CTL0    (*((volatile unsigned char*)(0x0140)))  

相关的寄存器地址定义略


void MSCAN_INITIAL(void)
{
CAN0CTL0|=0x01;            // CAN Control Register   0000,0001-->TNITRQ=1
CAN4CTL0|=0x01;
while(!(CAN0CTL0&0x01))    // CAN0CTL0 为0x01,则往下执行,实为等待CAN0CTL0为0x01
{}
while(!(CAN4CTL0&0x01))
{}
CAN0IDAC=0x20;             // CAN Identifier Acceptance Control   0010,0000
CAN4IDAC=0x20;
CAN0IDAR0=0x01;            //验收寄存器,不太明白
CAN4IDAR0=0x01;
CAN0IDAR1=0x00;
CAN4IDAR1=0x00;
CAN0IDAR2=0x04;
CAN4IDAR2=0x04;
CAN0IDAR3=0x08;
CAN4IDAR3=0x08;
CAN0IDAR4=0x41;
CAN4IDAR4=0x41;
CAN0IDAR5=0x41;
CAN4IDAR5=0x41;
CAN0IDAR6=0x41;
CAN4IDAR6=0x41;
CAN0IDAR7=0x41;
CAN4IDAR7=0x41;

CAN0IDMR0=0xff;            //验收屏蔽寄存器
CAN0IDMR1=0xff;
CAN0IDMR2=0xff;
CAN0IDMR3=0xff;
CAN0IDMR4=0xff;
CAN0IDMR5=0xff;
CAN0IDMR6=0xff;
CAN0IDMR7=0xff;
CAN4IDMR0=0xff;
CAN4IDMR1=0xff;
CAN4IDMR2=0xff;
CAN4IDMR3=0xff;
CAN4IDMR4=0xff;
CAN4IDMR5=0xff;
CAN4IDMR6=0xff;
CAN4IDMR7=0xff;

CAN0BTR0=0x61;             //Bus Timing Register
CAN4BTR0=0x61;
CAN0BTR1=0x13;
CAN4BTR1=0x13;
CAN0CTL1=0x80;
CAN4CTL1=0x80;
CAN0CTL0&=0xfe;
CAN4CTL0&=0xfe;
while(CAN0CTL1&0x01)
{}

while(CAN4CTL1&0x01)
{}

CAN0CTL0=0x08;   
CAN4CTL0=0x08;
CAN0RIER=0x0f;
CAN4RIER=0x0f;

CAN4TBSEL=CAN4TFLG;        //CAN Transmit Buffer Selection=CAN Transmitter Flag Register
CAN4TXFG1=0x01;            //发送区域写数据
CAN4TXFG2=0x00;
CAN4TXFG4=0x41;
CAN4TXFG5=0x42;
CAN4TXFG6=0x43;
CAN4TXFG7=0x44;
CAN4TXFG8=0x45;
CAN4TXFG9=0x46;
CAN4TXFGA=0x47;
CAN4TXFGB=0x48;
CAN4TXFGC=0x49;
CAN4TFLG=CAN4TBSEL;

}
void main(void) {

MSCAN_INITIAL();

while(!(CAN4TFLG&0x01))
{printp("\nCAN4 SEND\n");}

}

void CAN0_RECEIVE(void)
{
asm
{
sei                        //中断屏蔽开
}
printp("CAN0 RECEIVE \n");
asm
{
cli                        //中断屏蔽关
}
asm
{
rti                        //return from interrupt
}

}
void UnimplementedISR(void)
{
   /* Unimplemented ISRs trap.*/
   asm stop;
}





[此贴子已经被作者于2005-3-25 15:00:34编辑过]


作者: hlzhangxt    时间: 2005-3-25 17:01     标题: 应该是等待 CAN0CTL0 末尾是 1

while(!(CAN0CTL0&0x01)) // CAN0CTL0 为0x01,则往下执行,实为等待CAN0CTL0为0x01


应该是等待 CAN0CTL0  末尾是 1。 前面7位是 什么 无所谓。
[em27]
作者: asker_dfr    时间: 2005-3-28 09:31

CAN0CTL0是CAN的控制寄存器,其最低位是INTTRQ,位初始化位,当INTTRQ置1,表示MSCAN处于初始化状态。问题是,这个CAN0接受过程我还没看明白


[此贴子已经被作者于2005-3-28 9:31:34编辑过]


作者: aressos    时间: 2005-3-28 16:53

今天刚拿到邵老师的书,(已经用9SDG128大半年了)发现邵老师的方法比较适合没多少钱的个人用户。偶用公司买的P&E以及标准版的codewarrior。其实codewarrior帮助里面有很多好的说明。部过邵老师的书也不错(后悔没早拿半年)。不过建议还是要看英文的datesheet,这样对硬件了解多些,可以拿电力出版社的hc12的书比对下。
作者: asker_dfr    时间: 2005-3-28 17:13

aressos,你好,我的电力出版社的那本书呢,是用来对照参考手册来看的,二者(68HC12和MC9S12)在相关寄存器上还是有蛮多的不同的,我是才开始看没多久(其实也一个月了),用EVB做点小例子。
这次,在学习CAN通讯方面,想利用S12上提供的MSCAN自测模式来进行通讯。不过,上面发的那一片程序还没消化,关键是不太清楚收发数据是如何处理的,还需要人指点一二
作者: nannet    时间: 2005-3-29 14:37

请问上面的代码在书中多少页,我刚拿到书,怎么没看到呀?
作者: aressos    时间: 2005-3-29 15:54

我一直MODBUS的总线,所以对CAN的不是很了解。不过刚才稍微看了下CAN4CTL0的定义,INTTRQ有一个功能,就是包括CAN0IDAR0在内的许多寄存器都要在其为1的情况下才可读写。这功能就好像是读写外部数据时先判断总线是否忙碌一样。
我觉的你应该从CAN的数据格式开始学,这样才能很清楚,CAN的收发、数据验证过程。其实我一直觉的所谓硬件实现现场总线,不过是用内部的硬件把数据按照总线的格式进行打包,从而发送出去,接收后在检验、解码。从根本上来说于用软件来处理数据格式,在通过串口发送接收是一样的,(就像软件的I2C总线、MODBUS一样)。只不过它用硬件的方式实现了软件的处理,节省了CPU开销罢了。晚上我再看看CAN的发送,不过不一定能给你一个肯定的答复。比较有过调S12的AD失败了N次的教训。
作者: asker_dfr    时间: 2005-3-30 10:08

hehe, 真是好人啊
作者: AutoLam    时间: 2005-3-30 17:07     标题: [建议]

aressos 你的看法有个人獨到之處, 冇錯CAN总线是用硬件的方式实现了一些煩復软件的处理, 节省了CPU开销罢了,但實際上它也有工作是软件不能做到的,例如再同步處理 (hard re-synchronization), 总线仲裁(bus arbitration) 等.

asker_dfr 你的问题是比較花時處理, 原因是你不明白CAN是什麽,首先你要先了解CAN的格式和協議後,才能明白那些記存器的應用o

在S12DP256的記存器
x=0,1,2,3,4   
y=0,1,2,3,4,5,6,7
z=0...0xc

CANxIDARy = Acceptance Register
CANxIDMRy = Mask Register
CANxTFLG = 讀取CANtx 可用緩沖區 (3个其中一个)
CANxTBSEL = 選用CANtx 可用緩沖區
CANxBTR0= Bus Timing (RJW + CAN clock)
CANxBTR1= Bus Timing (Prog+PS1+PS2)
CANxCTL0= CAN module 控制記存器
CANxCTL1= CAN module 控制記存器
CANxTXFGz= 緩沖區


而你的code 不知道在何處抄出來o
1. Filter 的工用就不見,因為所有CANxIDMRy都是$ff.
2. CANxIDAC=0x20  // Eight 8 bit Acceptance Filters
3. Message ID
    CANxIDAR0=01;
    CANxIDAR1=00;
    CANxIDAR2=04;
    CANxIDAR3=08;

看來應是CAN2.0A吧?都應是CAN2.0A 因為Filter 都是8位.但不知道為什麽作者又把CANxIDAR2和CANxIDAR3也有data.真是莫明奇妙! 可否解答?

4. CAN receiver 中斷什麽也沒有,最少也該有中斷設置,如果沒有中斷設置,程式永遠循环在CAN中斷.

[建议]
1. 先看CAN 規格.
2. 了解後再看S12DP256規格
3. 然後才看這段程式
4. 问题可迎刃而解
[em27]
作者: asker_dfr    时间: 2005-3-31 14:19

呵呵,看完AutoLam也是大大的好人那。我也发现自己的薄弱之处,对于什么是CAN,如何应用,S12中MSCAN寄存器的设置等等,都不是说一知半解的概念,是根本还不明白。还有,receiver什么中断也没有,前天我请教我这边一位高手,他也是一下子看处那个示例程序的问题,还狠批一阵,怎么连CAN是什么都不明天,就来看这方面的东西呢?其中,还说道利用中断服务程序来处理,首先要把程序的一个大致框架搭建起来,任何对于CAN、SCI、PWM等等都是水到渠成的事情了(我思量一下,觉得说得很对)。
只有继续努力啦,硬着头皮看下去,其实,我觉得还是很有意思的。再次谢谢这边的大侠们,我自我感觉,这比我一个月前好多了,至少那个时候我对于该干什么都不是很清晰。
作者: sanpi5516    时间: 2005-4-7 20:28

我理解是起延时的作用。让led闪烁起来吧。
作者: asker_dfr    时间: 2005-4-30 14:48

再来看看,发现变化不小啊,这个专区分成了好几个板块,很有气象。我现在还在看这款S12单片机,从两个月前接触到目前,只能算还刚入门,深感要学的东东真是太多啦。从刚开始硬着头皮到现在颇有兴致,感觉,一边看一边想,一边动手刷一下自己写的小小程序,似乎很有成就感(^_^)。
前一阵子,我汇报一下我在软件方面遇到的问题:首先就是很近没进行编程实践(训练),最初写的时候(用C)真是无从下手,写出来的,自己感觉还不错,行家一过眼,真是被批驳得惨不忍睹,从格式规范(包括缩进,括号等等)到编程思想,真是发现自己怎么就白学了,这么没用,似乎还沉浸在N年前用汇编狂写上百至千时的景象,可实际一写,发现真的眼高手低……
很希望与大家交流,五一到了,大家节日快乐!
作者: raifystein    时间: 2005-7-27 08:35

用的应该是CAN2.0B,用的是29位地址,所以要4个BYTE过滤
作者: dreamcatcher    时间: 2006-4-27 20:28

CAN4TXFG1=0x01;
CAN4TXFG2=0x00;
CAN4TXFG5=0x42;
CAN4TXFG6=0x43;
……根据寄存器定义的地址,它应该对应的是CAN4TXIDR0-3,CAN4TXDSR0-7,CAN4TXDLR
作者: zhaojunye    时间: 2007-8-28 16:51

流浪远方百合:
你好!
把变量定义放在主程序里面是什么意思?能说具体些吗?
我在学习调试JB8评估板时也出现了同样的问题,急需解决,请指教,谢谢!




欢迎光临 电子技术论坛_中国专业的电子工程师学习交流社区-中电网技术论坛 (http://bbs.eccn.com/) Powered by Discuz! 7.0.0