【问题标题】:how to convert this part of code from assembly to C language如何将这部分代码从汇编转换为C语言
【发布时间】:2013-04-14 16:56:24
【问题描述】:

我在将微芯片 pic 的汇编代码转换为 C 语言时遇到问题 它是两部分 第一部分是

movlw HIGH RevTable ; get MS byte of table

桌子是

RevTable
        retlw B’00000000’ ; invalid
        retlw B’00100001’ ; phase /6
        retlw B’00000110’ ; phase /4
        retlw B’00100100’ ; phase /5
        retlw B’00011000’ ; phase /2
        retlw B’00001001’ ; phase /1
        retlw B’00010010’ ; phase /3
        retlw B’00000000’ ; invalid

那是什么意思?看不懂

第二个问题是

incfsz ADC,w ; if ADC is 0xFF we’re at full speed - skip timer add

它在 C 中的表现如何 非常感谢

【问题讨论】:

  • 到目前为止我们可以 C 你的C 代码
  • 对于第二个问题,程序集是 Loop call ReadADC ;从 ADC incfsz ADC,w 获得速度控制;如果 ADC 为 0xFF,我们处于全速状态 - 跳过计时器添加转到 PWM;将 Timer0 添加到 ADC 用于 PWM movf DriveWord,w ;强制条件 goto Drive ;继续,C 是 void main (void) { char ADCReading;初始化();换向(); //确定当前电机位置 ADCReading = ReadADC(); //从ADC获取速度控制 if(ADCReading == ) }
  • 第一个问题 Commutate movlw SensorMask ;仅保留传感器位和 wf SensorPort,w ;获取传感器数据 xorwf LastSensor,w ;测试是否检测到运动 btfsc STATUS,Z ;如果没有变化返回零;没有变化 - 回到 PWM 循环 xorwf LastSensor,f ;用当前 btfss DirectionBit 替换最后的传感器数据;测试方向位 goto FwdCom ;位为零——正向换向;反向换相 movlw HIGH RevTable ;获取表 movwf PCLATH 的 MS 字节;准备计算的 GOTO movlw LOW RevTable ;获取表的 LS 字节 goto Com2
  • 和 C 是 void Commutate (void) { char result;结果 = (SensorPort&SensorMask); if((result^LastSensor) != 0) { LastSensor = 结果; if (DirectionBit == 0) { } else { } } else { /*什么都不做*/ } }
  • 第一部分可以使用 switch/case 语句简单地完成。第二种是简单地将 ADC 加 1 并使用 if/else 语句检查它是否达到 255。

标签: c assembly pic microchip


【解决方案1】:

您的代码示例不足,因此我无法告诉您所有信息:

movlw HIGH RevTable ; get MS byte of table

这只是计算表跳转的一部分。 您的 asm 代码必须类似于:

movlw HIGH RevTable
movwf PCLATH            ;set high byte RevTable address
movf  TableIndex, w
movwf PCL               ;set low byte RevTable address this is computed table jump
;The return value is in wreg so one from RevTable table depend of TableIndex value

在 c 中类似于:

char RevTable[] = {'0','6','4','5','2','1','3','0'};

char TableIndex = 1;
char ValueFromTable;

ValueFromTable = RevTable[TableIndex] ;

第二部分代码:

incfsz ADC,w ; if ADC is 0xFF we’re at full speed - skip timer add

这里缺少第二条 asm 指令,该指令是否执行取决于 ADC 值,例如:

 if (ADC != 255) ...

【讨论】:

    最近更新 更多