|
本帖最后由 taotie 于 2025-2-4 17:25 編輯
將你的想法和要求甩給DeepSeek它就會(huì)給出代碼,仿真后如有錯(cuò)誤將錯(cuò)誤信息反饋它會(huì)修改程序,直至仿真通過。
下面是向DeepSeek提出的要求:
用AVR匯編語(yǔ)言(AVRASM)編寫程序采用前進(jìn)3步退2步方式運(yùn)行正向階段--向A點(diǎn)進(jìn)發(fā)電機(jī)正轉(zhuǎn)3秒-停0.5秒-反轉(zhuǎn)2秒,凈進(jìn)1秒距離;(期間不斷檢測(cè)A點(diǎn)是否觸發(fā),觸發(fā)則退出正向階段進(jìn)入反向階段)反向階段--向B點(diǎn)進(jìn)發(fā)電機(jī)正轉(zhuǎn)3秒-停0.5秒-反轉(zhuǎn)2秒,凈進(jìn)1秒距離;(期間不斷檢測(cè)B點(diǎn)是否觸發(fā),觸發(fā)則退出反向階段進(jìn)入正向階段)正向階段-反向階段運(yùn)行3次后停止電機(jī)。
DeepSeek經(jīng)過深度思考后給出初步程序(初步程序略)
經(jīng)過2次仿真反饋錯(cuò)誤信息修改,DeepSeek給最終程序:
/*程序說明:
使用Timer1比較匹配中斷實(shí)現(xiàn)精確計(jì)時(shí)(1ms中斷)
通過phase變量跟蹤當(dāng)前運(yùn)行階段(正向/反向)
step變量控制三個(gè)運(yùn)行步驟:正轉(zhuǎn)-停止-反轉(zhuǎn)
counter變量記錄剩余循環(huán)次數(shù)(3次完整循環(huán))
電機(jī)控制邏輯:
正向階段:PB0正轉(zhuǎn),PB1反轉(zhuǎn)
反向階段:PB1正轉(zhuǎn),PB0反轉(zhuǎn)
傳感器檢測(cè)在main循環(huán)中持續(xù)進(jìn)行,使用上拉電阻和低電平觸發(fā)
當(dāng)檢測(cè)到傳感器觸發(fā)時(shí)立即切換運(yùn)行階段并更新計(jì)數(shù)器
完成3次完整循環(huán)后停止電機(jī)并禁用中斷*/
.include "m328Pdef.inc"
.def temp = r16
.def phase = r17 ; 0:正向 1:反向
.def step = r18 ; 0:正轉(zhuǎn) 1:停止 2:反轉(zhuǎn)
.def counter = r19 ; 循環(huán)計(jì)數(shù)器
.def timerH = r25 ; 定時(shí)器高位
.def timerL = r24 ; 定時(shí)器低位
.equ MOTOR_PORT = PORTB
.equ MOTOR_DDR = DDRB
.equ MOTOR_A = PB0
.equ MOTOR_B = PB1
.equ SENSOR_A = PD2
.equ SENSOR_B = PD3
.cseg
.org 0x0000
jmp reset
.org OC1Aaddr
jmp TIMER1_COMPA
reset:
ldi temp, HIGH(RAMEND)
out SPH, temp
ldi temp, LOW(RAMEND)
out SPL, temp
ldi temp, (1<<MOTOR_A)|(1<<MOTOR_B)
out MOTOR_DDR, temp ; 設(shè)置電機(jī)控制引腳為輸出
cbi MOTOR_PORT, MOTOR_A ; 初始停止?fàn)顟B(tài)
cbi MOTOR_PORT, MOTOR_B
ldi temp, 0
out DDRD, temp ; 設(shè)置傳感器引腳為輸入
ldi temp, (1<<SENSOR_A)|(1<<SENSOR_B)
out PORTD, temp ; 使能上拉電阻
ldi phase, 0 ; 初始相位:正向
ldi counter, 6 ; 循環(huán)計(jì)數(shù)器
ldi step, 0 ; 初始步驟:正轉(zhuǎn)
; 配置Timer1 (CTC模式, 1ms中斷)
ldi temp, (1<<WGM12)|(1<<CS11) ; CTC模式, 預(yù)分頻8
sts TCCR1B, temp
ldi temp, HIGH(1999) ; 16MHz/8/(1999+1) = 1kHz
sts OCR1AH, temp
ldi temp, LOW(1999)
sts OCR1AL, temp
ldi temp, (1<<OCIE1A) ; 使能比較匹配中斷
sts TIMSK1, temp
sei ; 全局中斷使能
rcall set_motor ; 初始電機(jī)狀態(tài)
rcall set_timer ; 設(shè)置初始定時(shí)
main:
; 檢測(cè)傳感器
sbic PIND, SENSOR_A ; 檢測(cè)A點(diǎn)觸發(fā)
rjmp check_B
cpi phase, 0
brne check_B
rcall switch_phase ; 正向階段檢測(cè)到A點(diǎn)
check_B:
sbic PIND, SENSOR_B ; 檢測(cè)B點(diǎn)觸發(fā)
rjmp main_loop
cpi phase, 1
brne main_loop
rcall switch_phase ; 反向階段檢測(cè)到B點(diǎn)
main_loop:
rjmp main
switch_phase:
cpi counter, 0 ; 檢查循環(huán)計(jì)數(shù)器
breq stop_motor
dec counter ; 減少循環(huán)計(jì)數(shù)
ldi temp, 1
eor phase, temp ; 切換相位
ldi step, 0 ; 重置步驟
rcall set_motor
rcall set_timer
ret
stop_motor:
cbi MOTOR_PORT, MOTOR_A ; 停止電機(jī)
cbi MOTOR_PORT, MOTOR_B
cli ; 禁用中斷
LOOP:
rjmp LOOP
set_motor:
cpi phase, 0
breq forward_phase
reverse_phase:
cpi step, 0
breq rev_forward
cpi step, 2
breq rev_backward
ret
rev_forward:
sbi MOTOR_PORT, MOTOR_B ; 反向階段正轉(zhuǎn)
cbi MOTOR_PORT, MOTOR_A
ret
rev_backward:
sbi MOTOR_PORT, MOTOR_A ; 反向階段反轉(zhuǎn)
cbi MOTOR_PORT, MOTOR_B
ret
forward_phase:
cpi step, 0
breq fwd_forward
cpi step, 2
breq fwd_backward
ret
fwd_forward:
sbi MOTOR_PORT, MOTOR_A ; 正向階段正轉(zhuǎn)
cbi MOTOR_PORT, MOTOR_B
ret
fwd_backward:
sbi MOTOR_PORT, MOTOR_B ; 正向階段反轉(zhuǎn)
cbi MOTOR_PORT, MOTOR_A
ret
set_timer:
cpi step, 0
breq set_forward_timer
cpi step, 1
breq set_stop_timer
cpi step, 2
breq set_backward_timer
ret
set_forward_timer:
ldi timerH, HIGH(3000) ; 3秒定時(shí)
ldi timerL, LOW(3000)
ret
set_stop_timer:
ldi timerH, HIGH(500) ; 0.5秒定時(shí)
ldi timerL, LOW(500)
cbi MOTOR_PORT, MOTOR_A ; 停止電機(jī)
cbi MOTOR_PORT, MOTOR_B
ret
set_backward_timer:
ldi timerH, HIGH(2000) ; 2秒定時(shí)
ldi timerL, LOW(2000)
ret
TIMER1_COMPA:
push temp
in temp, SREG
push temp
sbiw timerH:timerL, 1 ; 遞減定時(shí)器
brne timer_exit
inc step ; 切換步驟
cpi step, 3
brlo step_ok
ldi step, 0 ; 重置步驟循環(huán)
step_ok:
rcall set_motor ; 更新電機(jī)狀態(tài)
rcall set_timer ; 設(shè)置新定時(shí)值
timer_exit:
pop temp
out SREG, temp
pop temp
reti
根據(jù)程序畫好電路圖仿真通過!
74.gif (623.31 KB, 下載次數(shù): 0)
下載附件
2025-2-3 23:50 上傳
除了要求用AVRASM還試了WINAVR和bascom avr編程都達(dá)到預(yù)期的效果。
兄弟們~~這這也太太簡(jiǎn)單了么!呵呵~~編程這玩意可以隨便搞了。
|
|