为啥这个 PIC 汇编代码中的位不移位?

     2023-02-16     131

关键词:

【中文标题】为啥这个 PIC 汇编代码中的位不移位?【英文标题】:Why isn't the bits shifting in this PIC assembler code?为什么这个 PIC 汇编代码中的位不移位? 【发布时间】:2017-02-18 23:32:34 【问题描述】:

我刚开始熟悉 PIC 汇编器,并尝试相应地移动位和点亮 LED。

我正在使用带有 MPLAB X IDE 的 Xpress DM164140 开发板。

我在 RA0-RA3 上有 4 个 LED。 我想通过移动 R5“用户”寄存器的值并将其分配给 PORTA 寄存器来一一点亮它们。

这是我正在使用的汇编代码。如果不使用 DELAY 子程序,所有 4 个 LED 都会亮起,但是当我使用 DELAY 子程序时,RA3 不会亮起。这种转变一直持续到 RA3。

所以问题一定出在 DELAY 子程序中。想不通。 我还尝试了 lslf 和 addwf 指令来尝试实现所需的行为,但到目前为止没有运气。

有人知道为什么会这样吗?

提前致谢!

    ; Assembly source line config statements

#include "p16f18855.inc"

; CONFIG1
; __config 0x3FEC
 __CONFIG _CONFIG1, _FEXTOSC_OFF & _RSTOSC_HFINT1 & _CLKOUTEN_OFF & _CSWEN_ON & _FCMEN_ON
; CONFIG2
; __config 0x3FFF
 __CONFIG _CONFIG2, _MCLRE_ON & _PWRTE_OFF & _LPBOREN_OFF & _BOREN_ON & _BORV_LO & _ZCD_OFF & _PPS1WAY_ON & _STVREN_ON
; CONFIG3
; __config 0x3FFF
 __CONFIG _CONFIG3, _WDTCPS_WDTCPS_31 & _WDTE_ON & _WDTCWS_WDTCWS_7 & _WDTCCS_SC
; CONFIG4
; __config 0x3FFF
 __CONFIG _CONFIG4, _WRT_OFF & _SCANE_available & _LVP_ON
; CONFIG5
; __config 0x3FFF
 __CONFIG _CONFIG5, _CP_OFF & _CPD_OFF

 ;user define registers @ bank0   
R1 equ 0x20
R2 equ 0x21
R3 equ 0x22
R4 equ 0x23
R5 equ 0x24
R6 equ 0x25

RES_VECT  CODE    0x0000            ; processor reset vector
    GOTO    START                   ; go to beginning of program

; TODO ADD INTERRUPTS HERE IF USED

MAIN_PROG CODE                      ; let linker place main program

START
    CLRW
    MOVLB 0x11 ;select bank17 to change clock freq of HFINT1
    ;(high frequency internal oscillator)
    MOVLW 0x06
    MOVWF OSCFRQ    ;clock divider of 32 = 1MHz frequency

    MOVLB 0x00  ;move 0x00 to BSR aka select bank0, where TRISA reg is located     
    MOVLW 0xF0  
    MOVWF TRISA ;RA0-3 to output and RA4-RA7 to input
    MOVLW 0x01 ;00000001
    MOVWF R5
    MOVWF PORTA


MAIN
    CALL DELAY  ;delay to see the blinking
    bcf STATUS,C    ;clear carry bit
    rlf R5,1    ;shift contents of R5 by 1 to the left and save it to R5
    MOVF R5,0   ;move shifted R5 to W
    movwf PORTA ;move W to PORTA

    GOTO MAIN


;1 instruction cycles takes 4 clock cycles
;count to 250000@1MHz clock to get 1s delay
DELAY
    MOVLW 0x08  ;8
    MOVWF R1
DELAY_1
    MOVLW 0xFA  ;250
    MOVWF R2
DELAY_2
    MOVLW 0xFA  ;250
    MOVWF R3    
DELAY_3
    DECFSZ R3   ;decrease R2
    GOTO DELAY_3    
    DECFSZ R2   ;decrease R1
    GOTO DELAY_2
    DECFSZ R1   ;decrease R1
    GOTO DELAY_1
    RETURN

    END

【问题讨论】:

【参考方案1】:

我可以看到您已启用 看门狗计时器看门狗定时器可能在第 4 个 LED 亮起之前重置了微控制器。

所以你必须在主循环的某处清除看门狗定时器

输入指令...

CLRWDT

在标签MAIN之后。

【讨论】:

【参考方案2】:

可能为时已晚,但无论如何。 对于输出,您必须使用 LATx 命令。因此,将两个字符串都替换为 PORTA 到 LATA。

【讨论】:

在 MIPS 程序集中反转数字的位

...布时间】:2015-11-1215:30:16【问题描述】:我正在学习MIPS汇编语言,我被要求编写一个执行以下操作的程序:接受一个整数作为用户输入将该整数打印为有符号二进制数反转该整数中的位打印结果反转的数字(也是二进制)除了... 查看详情

位操作的个人总结(代码片段)

在计算机中所有数据都是以二进制形式进行存储,而位运算就是直接对内存中的二进制数据进行操作,因此处理速度非常快。1.基本操作运算符用法示例运算规则按位与ANDa&b只有两个操作数相应的比特位都为1时,结果才为1,... 查看详情

java中的位运算符

Java中的位运算符文本关键字:位运算符、位逻辑运算符、移位运算符一、位运算符大家在接触运算符的时候通常都已经学完了变量的使用,对于算术以及赋值运算的感觉就是Soeasy!这不就是小学的知识嘛,对于逻辑运算符的部分... 查看详情

位运算相关

...数的位~的结果位1001移位运算符原因:主要用于高度优化的代码,在这些代码中,使用其他数据操作的开销太高了示例:intvar1,var2=1 查看详情

为啥这个 AT&T 汇编代码会出现分段错误?

】为啥这个AT&T汇编代码会出现分段错误?【英文标题】:WhydoesthisAT&Tassemblycodegiveasegmentationfault?为什么这个AT&T汇编代码会出现分段错误?【发布时间】:2018-08-0808:46:28【问题描述】:这是我的第一个汇编源代码,我想... 查看详情

汇编中的移位指令(8086cpu)

原创8086CPU中有8条移位指令,分为两大类。非循环移位指令:SAL  ——  算术左移  ——  最高位移入标志状态位CFSAR  ——  算术右移  ——  最低位移入CF,最高位不变。比如说:将10000000算术右移7位,应该... 查看详情

用mplabidev8.89把从pic芯片里读出来的汇编代码,怎么保存起来???

...进制数据(如果你看到的都是0000,那么你不用继续了,这个芯片的代码是被保护的)。接下来点File->Export,不用更改设置,确定后随便取个名字,选个路径,就会把程序保存为一个***.Hex文件。然后,你就可以使用这个Hex文件... 查看详情

为啥 std::bitset 的位顺序相反? [复制]

】为啥std::bitset的位顺序相反?[复制]【英文标题】:Whyarethebitsofastd::bitsetinreverseorder?[duplicate]为什么std::bitset的位顺序相反?[复制]【发布时间】:2011-06-2521:24:57【问题描述】:为什么bitset以相反的顺序存储位?经过多次挣扎,... 查看详情

为啥 Solaris 汇编器生成的机器代码与这里的 GNU 汇编器不同?

】为啥Solaris汇编器生成的机器代码与这里的GNU汇编器不同?【英文标题】:WhydoestheSolarisassemblergeneratedifferentmachinecodethantheGNUassemblerhere?为什么Solaris汇编器生成的机器代码与这里的GNU汇编器不同?【发布时间】:2013-07-3114:25:42【... 查看详情

java的按位操作符

...参数对应的位执行布尔代数运算,并最终生成一个结果。这个操作符有与(& 查看详情

为啥移位时字节会改变?

】为啥移位时字节会改变?【英文标题】:whydoesbytechangewhenbitshifting?为什么移位时字节会改变?【发布时间】:2010-08-1120:13:52【问题描述】:我正在玩位移。我正在尝试采用32位int,将每个字节保存在char数组中,然后重构int。它... 查看详情

了解汇编、nasm、x86 中的 printf 函数。我不知道为啥这段代码没有打印出任何东西

】了解汇编、nasm、x86中的printf函数。我不知道为啥这段代码没有打印出任何东西【英文标题】:Understandingtheprintffunctioninassembly,nasm,x86.Idon\'tknowwhythiscodeisn\'tprintinganythingout了解汇编、nasm、x86中的printf函数。我不知道为什么这段代... 查看详情

perl中的位选择

...析。目前我已经提取了所需的16位十六进制模式。现在从这个16bits十六进制格式,我只想要LSB10bits。请参考以下示例(这是一个示例代码,我只使用了我的要求的1行)usestr 查看详情

为啥移位 0 会截断小数点?

】为啥移位0会截断小数点?【英文标题】:Whydoesashiftby0truncatethedecimal?为什么移位0会截断小数点?【发布时间】:2012-08-2023:07:35【问题描述】:我最近发现了这段JavaScript代码:Math.random()*0x1000000<<0我知道第一部分只是生成... 查看详情

为啥将 xor 与文字而不是反转一起使用(按位不)

】为啥将xor与文字而不是反转一起使用(按位不)【英文标题】:Whyusexorwithaliteralinsteadofinversion(bitwisenot)为什么将xor与文字而不是反转一起使用(按位不)【发布时间】:2014-04-1516:08:04【问题描述】:偶遇thisCRC32code,很好奇作... 查看详情

为啥这个内联汇编不能为每条指令使用单独的 asm volatile 语句?

】为啥这个内联汇编不能为每条指令使用单独的asmvolatile语句?【英文标题】:Whyisthisinlineassemblynotworkingwithaseparateasmvolatilestatementforeachinstruction?为什么这个内联汇编不能为每条指令使用单独的asmvolatile语句?【发布时间】:2012-02... 查看详情

为啥更换模拟器后我的 VC 会移位?自动布局

】为啥更换模拟器后我的VC会移位?自动布局【英文标题】:WhyismyVCdisplacedafterchangingtheSimulator?AutoLayout为什么更换模拟器后我的VC会移位?自动布局【发布时间】:2020-10-2119:42:31【问题描述】:这是我用来为我的视图元素设置自... 查看详情

swiftswift中的位结构(代码片段)

查看详情