[PIC®/AVR®/dsPIC®产品] MPLAB X IDE ASM怎么写

[复制链接]
 楼主| 面包超人tutka 发表于 2024-5-19 18:17 | 显示全部楼层 |阅读模式
老师布置了用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




本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
mintspring 发表于 2024-5-23 20:27 | 显示全部楼层
都什么年代了,还在用汇编呢
eleg34ance 发表于 2024-7-15 13:49 | 显示全部楼层
汇编很难啊,为啥不用库函数呢
hight1light 发表于 2024-7-15 14:52 | 显示全部楼层
其实这个芯片可以用arduino,哈哈
miltk 发表于 2024-7-15 16:01 | 显示全部楼层
你的代码中有一些伪代码,例如 in temp, TEMP_DATA,这些指令在实际的 AVR 汇编中是不存在的
suiziq 发表于 2024-7-15 17:05 | 显示全部楼层
你需要用实际的指令来读取传感器数据。例如,如果你使用的是模拟传感器并通过 ADC 读取数据,你需要调用 ADC 相关的指令
tiakon 发表于 2024-7-15 18:09 | 显示全部楼层
你在设置 LED 端口时使用了 sbi 和 cbi 指令,这些指令是直接对端口寄存器的位进行操作的
一切D都好 发表于 2024-7-15 19:10 | 显示全部楼层
确保你使用的端口和位是正确的。例如,sbi PORTB, LED2 应该是 sbi PORTB, 1,因为 LED2 被定义为 PORTB1
wamed 发表于 2024-7-16 08:20 | 显示全部楼层
你的常量定义(如 TEMP_THRESHOLD)是正确的,但确保这些值在实际应用中是合理的
teaccch 发表于 2024-7-16 11:02 | 显示全部楼层
你的 MAIN_LOOP 循环跳转是正确的,但确保你的代码逻辑在每次循环中都能正确执行
nuan11nuan 发表于 2024-7-16 13:05 | 显示全部楼层
建议还是用标准库或者是库函数吧,汇编虽然有优势,但是现在芯片存储都很大了,没必要节省了
nqty 发表于 2024-7-16 20:30 | 显示全部楼层
你提到了中断向量,但没有实际的中断处理代码。如果你需要使用中断,确保你已经正确配置了中断控制器,并且在中断向量中添加了实际的中断处理代码
9dome猫 发表于 2024-9-28 12:48 | 显示全部楼层
加入稳压器、瞬态电压抑制
天灵灵地灵灵 发表于 2024-9-28 17:16 | 显示全部楼层
现在用汇编的人太少了。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

3

主题

4

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部