打印
[PIC®/AVR®/dsPIC®产品]

MPLAB X IDE ASM怎么写

[复制链接]
1687|13
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
老师布置了用atmega328p芯片做一个设计,结合Proteus和MPLAB X IDE。有大神可以看看我的ASM有哪些错误,感恩的心!!!

; ATmega328P Definitions
.include "m328pdef.inc"

; Define I/O Ports and Constants
.def temp = r16
.def hum = r17
.def ldr_value = r18
.def pressure = r19

.equ LED2 = PORTB1 ; LED2
.equ LED6 = PORTB5 ; LED6
.equ LED3 = PORTB2 ; LED3
.equ LED7 = PORTB6 ; LED7
.equ LED4 = PORTB3 ; LED4
.equ LED8 = PORTB7 ; LED8
.equ LED5 = PORTB4 ; LED5
.equ LED9 = PORTC0 ; LED9

.equ TEMP_THRESHOLD = 35
.equ HUM_THRESHOLD = 85
.equ LDR_THRESHOLD = 5
.equ PRESSURE_THRESHOLD = 1014

.cseg
.org 0x00
    rjmp RESET

RESET:
    ldi temp, LOW(RAMEND)
    out SPL, temp
    ldi temp, HIGH(RAMEND)
    out SPH, temp

    ; Set LED pins as output
    ldi temp, 0xFF
    out DDRB, temp
    ldi temp, 0x01
    out DDRC, temp

    ; Initialize LEDs to off
    ldi temp, 0x00
    out PORTB, temp
    out PORTC, temp

    ; Initialize sensors (pseudocode)
    ; Call sensor initialization routines here if necessary

MAIN_LOOP:
    ; Read DHT11 sensor (pseudocode)
    ; Read temperature and humidity
    ; in temp, TEMP_DATA
    ; in hum, HUM_DATA

    ; Read BMP180 sensor (pseudocode)
    ; Read pressure
    ; in pressure, PRESSURE_DATA

    ; Read LDR sensor value (pseudocode)
    ; in ldr_value, LDR_DATA

    ; Temperature control
    cpi temp, TEMP_THRESHOLD
    brlo NORMAL_TEMP
    sbi PORTB, LED2 ; Turn on LED2
    cbi PORTB, LED6 ; Turn off LED6
    rjmp CHECK_HUM

NORMAL_TEMP:
    cbi PORTB, LED2 ; Turn off LED2
    sbi PORTB, LED6 ; Turn on LED6

CHECK_HUM:
    ; Humidity control
    cpi hum, HUM_THRESHOLD
    brlo NORMAL_HUM
    sbi PORTB, LED3 ; Turn on LED3
    cbi PORTB, LED7 ; Turn off LED7
    rjmp CHECK_LDR

NORMAL_HUM:
    cbi PORTB, LED3 ; Turn off LED3
    sbi PORTB, LED7 ; Turn on LED7

CHECK_LDR:
    ; LDR control
    cpi ldr_value, LDR_THRESHOLD
    brlo NORMAL_LDR
    sbi PORTB, LED4 ; Turn on LED4
    cbi PORTB, LED8 ; Turn off LED8
    rjmp CHECK_PRESSURE

NORMAL_LDR:
    cbi PORTB, LED4 ; Turn off LED4
    sbi PORTB, LED8 ; Turn on LED8

CHECK_PRESSURE:
    ; Pressure control
    cpi pressure, PRESSURE_THRESHOLD
    brlo NORMAL_PRESSURE
    sbi PORTB, LED5 ; Turn on LED5
    cbi PORTC, LED9 ; Turn off LED9
    rjmp MAIN_LOOP

NORMAL_PRESSURE:
    cbi PORTB, LED5 ; Turn off LED5
    sbi PORTC, LED9 ; Turn on LED9

    rjmp MAIN_LOOP

; Interrupt vectors (if needed)
.org INT0_vect
    ; Handle external interrupt 0

; Other necessary interrupt vectors




屏幕截图 2024-05-19 121652.png (552.02 KB )

屏幕截图 2024-05-19 121652.png

使用特权

评论回复
沙发
mintspring| | 2024-5-23 20:27 | 只看该作者
都什么年代了,还在用汇编呢

使用特权

评论回复
板凳
eleg34ance| | 2024-7-15 13:49 | 只看该作者
汇编很难啊,为啥不用库函数呢

使用特权

评论回复
地板
hight1light| | 2024-7-15 14:52 | 只看该作者
其实这个芯片可以用arduino,哈哈

使用特权

评论回复
5
miltk| | 2024-7-15 16:01 | 只看该作者
你的代码中有一些伪代码,例如 in temp, TEMP_DATA,这些指令在实际的 AVR 汇编中是不存在的

使用特权

评论回复
6
suiziq| | 2024-7-15 17:05 | 只看该作者
你需要用实际的指令来读取传感器数据。例如,如果你使用的是模拟传感器并通过 ADC 读取数据,你需要调用 ADC 相关的指令

使用特权

评论回复
7
tiakon| | 2024-7-15 18:09 | 只看该作者
你在设置 LED 端口时使用了 sbi 和 cbi 指令,这些指令是直接对端口寄存器的位进行操作的

使用特权

评论回复
8
一切D都好| | 2024-7-15 19:10 | 只看该作者
确保你使用的端口和位是正确的。例如,sbi PORTB, LED2 应该是 sbi PORTB, 1,因为 LED2 被定义为 PORTB1

使用特权

评论回复
9
wamed| | 2024-7-16 08:20 | 只看该作者
你的常量定义(如 TEMP_THRESHOLD)是正确的,但确保这些值在实际应用中是合理的

使用特权

评论回复
10
teaccch| | 2024-7-16 11:02 | 只看该作者
你的 MAIN_LOOP 循环跳转是正确的,但确保你的代码逻辑在每次循环中都能正确执行

使用特权

评论回复
11
nuan11nuan| | 2024-7-16 13:05 | 只看该作者
建议还是用标准库或者是库函数吧,汇编虽然有优势,但是现在芯片存储都很大了,没必要节省了

使用特权

评论回复
12
nqty| | 2024-7-16 20:30 | 只看该作者
你提到了中断向量,但没有实际的中断处理代码。如果你需要使用中断,确保你已经正确配置了中断控制器,并且在中断向量中添加了实际的中断处理代码

使用特权

评论回复
13
9dome猫| | 2024-9-28 12:48 | 只看该作者
加入稳压器、瞬态电压抑制

使用特权

评论回复
14
天灵灵地灵灵| | 2024-9-28 17:16 | 只看该作者
现在用汇编的人太少了。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

3

主题

4

帖子

0

粉丝