简单回路(读取温度 - MC68HC)
Simple loop (reading temperature - MC68HC)
我正在使用 MC68HC11 阅读与 I/O 相关的章节;这本书展示了一个建议的练习(不是真的很难)但我无法使用汇编来解决它:
我一直在想,我可以通过使用一些基本逻辑来做到这一点(我用 C 和 C++ 编写程序)但是我在尝试用汇编来做时卡住了。
逻辑是这样的:
Loop:
value = ReadSensorValue()
if (value condition 1) // do action else if (value condition 2) // do something end if
go to Loop
可以帮助我解决它但在汇编中使用真正的指令吗?
编辑:
这是一种方法(使用 ASM11)。我知道你正在努力学习,但你没有表现出任何努力。 (这是我做的最后一个,没有先看到你的努力。)
;*******************************************************************************
; MCU specific
;*******************************************************************************
REGS equ 00 ;register base
PORTB equ REGS+ ;port B (output only)
PORTC equ REGS+ ;port C
STACKTOP equ FF ;Top of Stack
ROM equ $F800 ;beginning of ROM
Vreset equ $FFFE ;reset vector
;*******************************************************************************
; Application specific
;*******************************************************************************
TEMPERATURE equ PORTC ;temperature is available here
CONTROL equ PORTB
HEATER. equ 1 ;bit that controls heater
COMPRESSOR. equ 2 ;bit that controls cooler
MIN_TEMP equ 20 ;min allowed temp in C
MAX_TEMP equ 22 ;max allowed temp in C
;*******************************************************************************
org ROM
;*******************************************************************************
;*******************************************************************************
; Purpose: Get temperature as Centigrade degrees
; Input : None
; Output : A = temperature in whole degrees (fractional part discarded)
; Note(s): Formula is TEMPERATURE*5/10 using integer arithmetic
; : Simplifies to TEMPERATURE/2
GetTemperature proc
ldaa TEMPERATURE ;A = temperature
lsra ;A = temperature/2
adca #0 ;(optional) round up
rts
;*******************************************************************************
CoolIt proc
pshx
ldx #CONTROL
bclr ,x,HEATER.
bset ,x,COMPRESSOR.
pulx
rts
;*******************************************************************************
HeatIt proc
pshx
ldx #CONTROL
bclr ,x,COMPRESSOR.
bset ,x,HEATER.
pulx
rts
;*******************************************************************************
AllOff proc
pshx
ldx #CONTROL
bclr ,x,COMPRESSOR.|HEATER.
pulx
rts
;*******************************************************************************
Start proc
lds #STACKTOP
bsr AllOff
Loop@@ bsr GetTemperature ;A = temperature in degrees
cmpa #MIN_TEMP ;if below minimum
blo HeatIt@@ ; go heat it up
cmpa #MAX_TEMP ;if above maximum
bhi CoolIt@@ ; go cool it down
bsr AllOff ;if within range turn all off
bra Loop@@ ;go check temperature again
CoolIt@@ bsr CoolIt
bra Loop@@ ;go check temperature again
HeatIt@@ bsr HeatIt
bra Loop@@ ;go check temperature again
;*******************************************************************************
org Vreset
dw Start
;*******************************************************************************
我正在使用 MC68HC11 阅读与 I/O 相关的章节;这本书展示了一个建议的练习(不是真的很难)但我无法使用汇编来解决它:
我一直在想,我可以通过使用一些基本逻辑来做到这一点(我用 C 和 C++ 编写程序)但是我在尝试用汇编来做时卡住了。
逻辑是这样的:
Loop:
value = ReadSensorValue()
if (value condition 1) // do action else if (value condition 2) // do something end if
go to Loop
可以帮助我解决它但在汇编中使用真正的指令吗?
编辑:
这是一种方法(使用 ASM11)。我知道你正在努力学习,但你没有表现出任何努力。 (这是我做的最后一个,没有先看到你的努力。)
;*******************************************************************************
; MCU specific
;*******************************************************************************
REGS equ 00 ;register base
PORTB equ REGS+ ;port B (output only)
PORTC equ REGS+ ;port C
STACKTOP equ FF ;Top of Stack
ROM equ $F800 ;beginning of ROM
Vreset equ $FFFE ;reset vector
;*******************************************************************************
; Application specific
;*******************************************************************************
TEMPERATURE equ PORTC ;temperature is available here
CONTROL equ PORTB
HEATER. equ 1 ;bit that controls heater
COMPRESSOR. equ 2 ;bit that controls cooler
MIN_TEMP equ 20 ;min allowed temp in C
MAX_TEMP equ 22 ;max allowed temp in C
;*******************************************************************************
org ROM
;*******************************************************************************
;*******************************************************************************
; Purpose: Get temperature as Centigrade degrees
; Input : None
; Output : A = temperature in whole degrees (fractional part discarded)
; Note(s): Formula is TEMPERATURE*5/10 using integer arithmetic
; : Simplifies to TEMPERATURE/2
GetTemperature proc
ldaa TEMPERATURE ;A = temperature
lsra ;A = temperature/2
adca #0 ;(optional) round up
rts
;*******************************************************************************
CoolIt proc
pshx
ldx #CONTROL
bclr ,x,HEATER.
bset ,x,COMPRESSOR.
pulx
rts
;*******************************************************************************
HeatIt proc
pshx
ldx #CONTROL
bclr ,x,COMPRESSOR.
bset ,x,HEATER.
pulx
rts
;*******************************************************************************
AllOff proc
pshx
ldx #CONTROL
bclr ,x,COMPRESSOR.|HEATER.
pulx
rts
;*******************************************************************************
Start proc
lds #STACKTOP
bsr AllOff
Loop@@ bsr GetTemperature ;A = temperature in degrees
cmpa #MIN_TEMP ;if below minimum
blo HeatIt@@ ; go heat it up
cmpa #MAX_TEMP ;if above maximum
bhi CoolIt@@ ; go cool it down
bsr AllOff ;if within range turn all off
bra Loop@@ ;go check temperature again
CoolIt@@ bsr CoolIt
bra Loop@@ ;go check temperature again
HeatIt@@ bsr HeatIt
bra Loop@@ ;go check temperature again
;*******************************************************************************
org Vreset
dw Start
;*******************************************************************************