【问题标题】:Blinking an LED with a 18PIC4550 using Assembly code使用汇编代码用 18PIC4550 闪烁 LED
【发布时间】:2013-07-09 10:28:02
【问题描述】:

我最近开始使用 18 PIC 4500,我第一次尝试在汇编中对其进行编程是让它在循环中闪烁一个 LED。但是,我没有太多使用这种语言编程的经验,因此不得不依靠其他 sn-ps 代码来帮助我入门。我的代码如下:

#include<p18f4550.inc>

CONFIG WDT = OFF
CONFIG MCLRE = ON
CONFIG DEBUG = ON
CONFIG LVP = OFF
CONFIG FOSC = INTOSCIO_EC

ORG 0


Delay1 res 2
Delay2 res 2


Start: 
        CLRF PORTB
        CLRF TRISB
        CLRF Delay1
        CLRF Delay2


MainLoop:
    BSF PORTB,1
    GOTO DelayA


DelayA:
    DECFSZ Delay1,1 
    GOTO DelayA
    BCF PORTB,1
    GOTO DelayB

DelayB: 
    DECFSZ Delay2,1
    GOTO DelayB
    GOTO MainLoop 

end

我不明白为什么它不起作用,但认为它可能与指令周期速度有关,我认为它是 1 MHz,导致延迟过短。

非常感谢任何帮助!

【问题讨论】:

  • 在DelayA,您首先调用DECFSZ,然后无条件(!)跳转到Delay A。我希望有条件跳转。另请注意,在循环之前,您必须初始化某种循环变量,否则下一次调用将根本不循环(因为变量已经为零)或者会导致下溢然后循环直到再次为零。不过我可能完全错了,因为我不知道 PIC 汇编。 BTW:DelayA 和 DelayB 不对称也有点奇怪。
  • @doomster 您不必初始化循环变量,您可以在这些微控制器中实现永远循环
  • 当然,decfsz 只需要一个时钟周期。所以它永远不能延迟超过 65536 微秒。用人眼很难看到。请改用计时器。大量来自“使用 tmr0 的图片”的谷歌点击量。

标签: assembly pic microprocessors


【解决方案1】:

1 .尝试设置您要切换的引脚的三态。你必须指出它是输入还是输出,在这种情况下它是输出。

喜欢

#define D0_1Tris B'11001111'

movlw   D0_1Tris    ; set direction so LEDs D0 & D1 are outputs
movwf   TRISA       ; all others are inputs (high-z)

2 。确保您的 A/D 配置为 I/O 数字

clrf ANSEL ; configure A/D I/O as digital (可能还需要清除比较器,无论哪个外设与选择的 I/O 复用)

3 .也不要忘记使用重置向量

ORG 0x000 ; processor reset vector

nop         ; required by in circuit debugger

goto    Init            ; go to beginning of program

4 。尝试以较慢的时钟速率来确定是否是由于短暂的延迟。如果是延迟问题,则实施计时器以使切换信号的占空比为 50-50 (注意可能必须将其更改为 p18f4550,它取自 pic16 示例)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-04-08
    • 1970-01-01
    • 2015-12-04
    • 1970-01-01
    • 1970-01-01
    • 2020-10-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多