找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 1237|回復(fù): 3
打印 上一主題 下一主題
收起左側(cè)

DeepSeek編程~香香香

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
本帖最后由 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ù)程序畫好電路圖仿真通過!


除了要求用AVRASM還試了WINAVR和bascom avr編程都達(dá)到預(yù)期的效果。
兄弟們~~這這也太太簡(jiǎn)單了么!呵呵~~編程這玩意可以隨便搞了。

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏2 分享淘帖 頂1 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:830831 發(fā)表于 2025-2-5 18:35 | 只看該作者
自從有了Ai,我基本都是借助ai寫個(gè)大概,再自己改改,當(dāng)然,有些時(shí)候ai根本就寫不成,特別是帶精度的
回復(fù)

使用道具 舉報(bào)

板凳
ID:373976 發(fā)表于 2025-2-5 18:59 | 只看該作者
寫代碼我也試過,基本能用,不過啥時(shí)候它要是能把電路圖給畫出來就完美了。
回復(fù)

使用道具 舉報(bào)

地板
ID:299497 發(fā)表于 2025-2-7 11:33 | 只看該作者
可以畫電路圖的話就更好了
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表