查看: 2889|回复: 4

[其他] 帮我看看,ADC程序,执行的有点奇怪

[复制链接]
  • TA的每日心情
    开心
    2018-9-14 09:26
  • 签到天数: 2 天

    连续签到: 1 天

    [LV.1]初来乍到

    70

    主题

    329

    帖子

    0

    高级会员

    Rank: 4

    积分
    952
    最后登录
    2021-1-4
    发表于 2012-1-12 11:03:58 | 显示全部楼层 |阅读模式
    ;*******************************************************************
    ;* This stationery serves as the framework for a user application. *
    ;* For a more comprehensive program that demonstrates the more     *
    ;* advanced functionality of this processor, please see the        *
    ;* demonstration applications, located in the examples             *
    ;* subdirectory of the "Freescale CodeWarrior for HC08" program    *
    ;* directory.                                                      *
    ;*******************************************************************
    ; Include derivative-specific definitions
                INCLUDE 'derivative.inc'
    ;
    ; export symbols
    ;
                XDEF _Startup
                ABSENTRY _Startup
    ;
    ; variable/data section
    ;
                ORG    RAMStart         ; Insert your data definition here
    ExampleVar: DS.B   1
    adChannelSel: ds.b 1
    adValueChannel0H: ds.b 1
    adValueChannel0L: ds.b 1
    adValueChannel1H: ds.b 1
    adValueChannel1L: ds.b 1
    adValueChannel2H: ds.b 1
    adValueChannel2L: ds.b 1
    adValueChannel3H: ds.b 1
    adValueChannel3L: ds.b 1
     
    ;
    ; code section
    ;
    ;            ORG    ROMStart
    _Startup:
                LDHX   #RAMEnd+1        ; initialize the stack pointer
                TXS
                CLI                     ; enable interrupts
               
             lda #$03  ;Disable Copt, Reset,BKBD enanble
             sta SOPT1 
            
             jsr initialAdc         
    mainLoop:
                ; Insert your code here
               
                jsr adcTask
                jsr adcIsr
                nop
                nop
                                                                                                                                      
                BRA    mainLoop
    ;*******************************************************************           
    initialAdc:
                ;ADCSC2
                lda #%00000000
                sta ADCSC2
                ;ADCCFG
                lda #%10001000
                sta ADCCFG
               
                ;APCTL1
                lda #$0f
                sta APCTL1
                lda #$00
                sta APCTL2
               
                ;ADCSC1 setting
                lda  #%00000000
                sta  ADCSC1           
               
                lda #$00          ;start form ad channel0 t
                sta adChannelSel
               
    initialAdc_end:           
                rts
    ;*******************************************************************
    adcTask:          
                lda adChannelSel
                cmp #$00
                bne adcTaskChannel1Setting
    adcTaskChannel0Setting:
                lda #$01
                sta adChannelSel
                jmp adcTaskEnd
    adcTaskChannel1Setting:
                cmp #$01           
                bne adcTaskChannel2Setting
               
                lda #$02
                sta adChannelSel
                jmp adcTaskEnd
               
    adcTaskChannel2Setting:
                cmp #$02           
                bne adcTaskChannel3Setting
                lda #$03
                sta adChannelSel
                jmp adcTaskEnd 
               
    adcTaskChannel3Setting:
                lda #$00          ;start form ad channel0 t
                sta adChannelSel                                           
    adcTaskEnd:
                lda  adChannelSel  
                ora  #%00000000
                sta  ADCSC1
            
    adcTaskEndAB:           
     ;          lda ADCSC1        
    ;           and #$80        ;test COCO
    ;           cmp #$80
                brclr 7,ADCSC1,adcTaskEndAB 
               
                        
                
                 rts
    ;*******************************************************************            
    adcIsr:
                 lda adChannelSel
                 cmp #$00
                 bne adcIsrStoreChannel1Value           
    adcIsrStoreChannel0Value:
                 lda ADCRH
                 sta adValueChannel0H
                 lda ADCRL            
                 sta adValueChannel0L
                 jmp adcIsrEnd
                
    adcIsrStoreChannel1Value:
                cmp #$01
                bne adcIsrStoreChannel2Value
               
                lda ADCRH
                sta adValueChannel1H
                lda ADCRL            
                sta adValueChannel1L
                jmp adcIsrEnd   
                       
    adcIsrStoreChannel2Value:
                cmp #$02  
                bne adcIsrStoreChannel3Value        
                lda ADCRH
                sta adValueChannel2H
                lda ADCRL            
                sta adValueChannel2L
                jmp adcIsrEnd
               
    adcIsrStoreChannel3Value:
                cmp #$03
                bne adcIsrEnd
                lda ADCRH
                sta adValueChannel3H
                lda ADCRL            
                sta adValueChannel3L
                jmp adcIsrEnd            
                                         
    adcIsrEnd:
                rts
               
    ;**************************************************************
    ;* spurious - Spurious Interrupt Service Routine.             *
    ;*             (unwanted interrupt)                           *
    ;**************************************************************
    ;spurious:                           ; placed here so that security value
    ;           NOP                     ; does not change all the time.
    ;            RTI
    ;**************************************************************
    ;*                 Interrupt Vectors                          *
    ;**************************************************************
    ;            org   $ffd0
    ;            dc.w  adcIsr
    ;           
    ;            ORG   $FFFA
    ;            DC.W  spurious          ;
    ;            DC.W  spurious          ; SWI
    ;            DC.W  _Startup          ; Reset
    ////////////////////////////////////////////////////////////////////////////////////////
    其中有几行
    adcTaskEnd:
                lda  adChannelSel  
                ora  #%00000000                
                sta  ADCSC1
            
    adcTaskEndAB:           
     ;          lda ADCSC1                                                      ---------这行读值,本来是0X81,可是只能读出0x01
    ;           and #$80        ;test COCO
    ;           cmp #$80
                brclr 7,ADCSC1,adcTaskEndAB 
    我知道答案 目前已有3人回答
    回复

    使用道具 举报

  • TA的每日心情
    难过
    2021-12-15 16:01
  • 签到天数: 1 天

    连续签到: 1 天

    [LV.1]初来乍到

    305

    主题

    4701

    帖子

    0

    中级会员

    Rank: 3Rank: 3

    积分
    377
    最后登录
    2023-8-16
    发表于 2012-1-12 22:08:58 | 显示全部楼层

    RE:帮我看看,ADC程序,执行的有点奇怪

    说明没有产生AD转换。检测配置或者检测外部输入电压的引脚是否正确。
    该会员没有填写今日想说内容.
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2018-9-14 09:26
  • 签到天数: 2 天

    连续签到: 1 天

    [LV.1]初来乍到

    70

    主题

    329

    帖子

    0

    高级会员

    Rank: 4

    积分
    952
    最后登录
    2021-1-4
     楼主| 发表于 2012-1-13 10:09:58 | 显示全部楼层

    RE:帮我看看,ADC程序,执行的有点奇怪

    版主你没理解我的意思
    我是说:本来我是这么写的
    adcTaskEndAB:           
              lda ADCSC1
              and #$80        ;test COCO
              cmp #$80
              jmp adcTaskEndAB
    在debug是,断点打在 and #$80        ;test COCO
    然后看A寄存器的值,此时A= 0x81,但是继续单步执行完and #$80
    A里的值却不是0x80,导致程序死循环。
    于是我把这几行注释掉了,改成brclr 7,ADCSC1,adcTaskEndAB
    程序就好了,得到了正常的结果。
    所以我想觉得是lda ADCSC1这行是不是执行错了?
    问问有人遇到过和我一样的问题,还是我的AD程序那里写的不好,造成这样奇怪的现象?
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    0

    主题

    23

    帖子

    0

    新手上路

    Rank: 1

    积分
    43
    最后登录
    1970-1-1
    发表于 2012-1-13 11:31:05 | 显示全部楼层

    RE:帮我看看,ADC程序,执行的有点奇怪

    adcTaskEndAB:
    lda ADCSC1
    and #$80 ;test COCO
    cmp #$80
    jmp adcTaskEndAB
    jmp adcTaskEndAB是绝对跳转,前面比了再多也没用。应该用BEQ或者BNE指令。
    这种写法只在ADCSC1地址超过0x100的时候才有意义。一般说来绝大多数的ADCSC1都是在0x00~0xFF之间。即使要这样写,也没问题,AND完直接BEQ或者BNE就可以了,CMP本来就是多于。因为AND的操作影响Z位。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2018-9-14 09:26
  • 签到天数: 2 天

    连续签到: 1 天

    [LV.1]初来乍到

    70

    主题

    329

    帖子

    0

    高级会员

    Rank: 4

    积分
    952
    最后登录
    2021-1-4
     楼主| 发表于 2012-1-13 13:32:24 | 显示全部楼层

    RE:帮我看看,ADC程序,执行的有点奇怪

    恩,4楼说的没错
    刚用飞思卡尔的汇编,很不熟悉,
    谢谢了
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /3 下一条

    Archiver|手机版|小黑屋|恩智浦技术社区

    GMT+8, 2025-9-1 04:59 , Processed in 0.088842 second(s), 25 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.

    快速回复 返回顶部 返回列表