/* 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 |