[家电应用] 为什么将SH69P461的PB0配置为输出口,但是却无法给它赋值呢

[复制链接]
4247|11
 楼主| gudengguzhou 发表于 2013-11-15 12:53 | 显示全部楼层 |阅读模式
se, IO, ni, hp, timer
本帖最后由 gudengguzhou 于 2013-11-17 19:50 编辑

写了一个用io来模拟uart通信的程序,将PB0配置为输出口作为uart的发送端,但是发觉一直没给他成功赋值。程序如下:
  1. List        P=69P461
  2. Romsize         =2048

  3. ;*******************************************************
  4. ;                系统寄存器
  5. ;*******************************************************
  6.         IE                       EQU        00H
  7.         IR                       EQU        01H
  8.         TM1                    EQU        03H
  9.         TL1                     EQU        06H
  10.         TH1                     EQU        07H
  11.         PORTA_DATA      EQU        08H
  12.         PORTB_DATA      EQU        09H
  13.         PIN3_2_CFG        EQU        14H
  14.         PORTA_CFG        EQU        18H
  15.         PORTB_CFG        EQU        19H
  16. ;*******************************************************
  17. ;                用户数据寄存器
  18. ;*******************************************************
  19.         CIG_SEND_IO        EQU        PIN3_2_CFG
  20.         SEND_IO                EQU        PORTB_DATA
  21.         KECY_CODE_H       EQU        32H
  22.         KECY_CODE_L       EQU        33H        
  23.         COUNT                   EQU        34H
  24.         READY_SEND         EQU        35H
  25.         BK_T0                    EQU        39H
  26.         BK_AC                    EQU        40H
  27. ;************************************************************
  28. ;                程序入口
  29. ;************************************************************        
  30.         ORG        000H
  31.         JMP        RESET                                ;reset中断入口        $000h
  32.         RTNI
  33.         RTNI
  34.         JMP        T1_SEVER                        ;timer1中断入口 $003H
  35.         RTNI
  36.         RTNI

  37. RESET:
  38.         NOP
  39.         NOP
  40.         NOP
  41.         NOP                                        ;ensure the IC is stability
  42.         LDI        KECY_CODE_H,0110B                ;
  43.         LDI        KECY_CODE_L,1000B        
  44.         LDI        CIG_SEND_IO,0000B                ;将PORTB0配置为I/O口,作为uart的发送端
  45.         LDI        PORTB_CFG,0001B                        ;将PORTB0配置为输出口
  46.         LDI        TL1,06H;03H;08H(9600)                ;定时26us中断一次(使用内部4M振荡器)
  47.         LDI        TH1,0EH;0FH;09H(9600)                                ;
  48.         LDI        TM1,07H                                ;分频比1:1并启动timer1
  49.         LDI        AD_RESULT_L,0
  50.         LDI        AD_RESULT_H,0
  51. MAIN:
  52.         LDI        IR,0
  53.         ORIM        IE,0000B                        ;开AD,timer0定时中断
  54.         CALL        SEND_CHAR                        ;将按下的按键键值通过串口发送出去        
  55. MAIN_LOOP:
  56.         JMP        MAIN
  57.                
  58. ;*************************************************
  59. ;                timer1中断服务程序
  60. ;*************************************************
  61. T1_SEVER:
  62.         LDA        BK_T0,00H                        ;保存AC的值
  63.         ANDIM        IR,1101B                        ;清timer1中断请求以防多次触发中断
  64.         LDI         READY_SEND,1
  65.         STA        BK_T0,00H                        ;恢复AC的值                        
  66.         RTNI
  67.         RTNI

  68.         
  69. ;**************************************************
  70. ;                uart发送8位数据
  71. ;**************************************************
  72. SEND_CHAR:
  73.         NOP        
  74.         LDI        SEND_IO,00H                ;发送起始位(此指令执行完之后SEND_IO的值并没有为0)
  75.       ....................
  76. END
MaHaiJun 发表于 2013-11-18 09:04 | 显示全部楼层
用UART通讯,最好将程序放在Timer中断中实现
MaHaiJun 发表于 2013-11-18 09:05 | 显示全部楼层
;-----------------------------------------------------                     
Timer0ISR:
        STA                   zACC                  
        ldi                   rzIRQ                ,0x00
;-------------------------------------------------
        lda                nUARTFlag
        baz                NormalTimer0
        ba3                ?txdStop
        ba2                ?txdTB8
        ba1                ?txdData
;;        ba0                ?txdStart       
    ?txdStart:;--------------------------------------------------------------- step 1
            ldi                nUARTFlag        ,0010b                //switch to step 2           
        jmp                ?busLow
    ?txdData:;---------------------------------------------------------------- step 2
            sbim                zUartBitLen        ,0x01
            bnz                $+2
            ldi                nUARTFlag        ,0100b                //switch to step 3
            lda                nUARTDataL
            sta                zIntTmp
            shr       
            sta                nUARTDataL
            lda                nUARTDataH
            shr
            sta                nUARTDataH
            bnc                $+2
            orim                nUARTDataL        ,1000b
            lda                zIntTmp
            ba0                ?busHigh
            jmp                ?busLow
    ?txdTB8:;----------------------------------------------------------------- step 3  
            ldi                nUARTFlag        ,1000b                //switch to step 4
        jmp                ?busLow
    ?txdStop:;---------------------------------------------------------------- step 4       
        ldi                nUARTFlag        ,0000b                //switch to step 0       
    ?busHigh:;-----------------------------------------------------------------------       
            orim                rzPB                ,0001b
            jmp                NormalTimer0
    ?busLow:;------------------------------------------------------------------------
            andim                rzPB                ,1110b
;---------------------------------------------------
NormalTimer0:
               adim                zInt_C                ,01
               sbi                zInt_C                ,04
               bnc                Exit_Timer0
               ldi                zInt_C                ,00
        LDI                   rzWDT                ,0x0B           
        adim                  zDelayL        ,0x01                  ;;channel 1 main loop time counter
        eor                zDelayL
        adcm                zDelayH
        adim                zLEDTime        ,01                ;64ms
        bnc                Exit_Timer0
        ldi                nDispVolt        ,06                ;;for test!
        lda                nDispVolt
        sta                nUARTDataL
        sta                nUARTDataH
        eorim                nUARTDataH        ,0x0f       
            ldi                zUartBitLen        ,0x08
        ldi                nUARTFlag        ,01
        orim                rzPB                ,0001b                ;;busy signal!
Exit_Timer0:
        LDI                   rzIE                ,0x04                ;timer0 ISR Enable!
        LDA                   zACC                  
        rtni  
 楼主| gudengguzhou 发表于 2013-11-18 11:53 | 显示全部楼层
MaHaiJun 发表于 2013-11-18 09:05
;-----------------------------------------------------                     
Timer0ISR:
        STA   ...
  1. ;*******************************************************
  2.         PORTA_DATA        EQU        08H
  3.         PORTB_DATA        EQU        09H
  4.         PIN5_4_CFG        EQU        15H
  5.         PORTA_CFG        EQU        18H
  6.         PORTB_CFG        EQU        19H
  7.        
  8. ;*****************************************************

  9.         ORG        000H
  10.         JMP        RESET
  11.         RTNI

  12. RESET:
  13.         NOP
  14.         NOP
  15.         NOP
  16.         NOP
  17.         LDI        PIN5_4_CFG,0000B                ;将PORTA2配置为I/O口
  18.         ORIM        PORTA_CFG,0100B                        ;将PORTA3配置为输出口
  19. MAIN:
  20.         LDI        PORTA_DATA,00H       
  21.         NOP
  22.         JMP        MAIN

  23. END
谢谢版主,不过主要问题是无法给io口赋值。刚才我用了以下的代码试了一下,发觉还是无法给io口赋值,您再帮我看看,哪儿出了问题
桃花落满山前 发表于 2025-10-30 17:09 | 显示全部楼层
SH69P461 的 PB0 配置为输出却无法赋值,可能原因:1. 端口模式配置错误,需确认 PBM 寄存器中 PB0 对应位是否设为输出(如 00 为推挽输出);2. 引脚被其他外设复用(如定时器、ADC),未切换为 GPIO 功能;3. 赋值语句错误,需用正确寄存器(如 PBDAT)写入;4. 硬件故障,引脚短路或芯片损坏。检查配置与复用设置。
玫瑰凋零日记 发表于 2025-11-6 17:52 | 显示全部楼层
SH69P461 的 PB0 配置为输出却无法赋值,可能是配置步骤遗漏:需先通过方向寄存器(如 PBDIR)将 PB0 设为输出,再写数据寄存器(如 PBDAT)赋值。也可能是寄存器地址写错、IO 口被复用功能占用(未关闭其他功能),或硬件上引脚外部电路短路 / 虚焊,导致输出被钳位。检查配置代码和引脚电路。
水星限定 发表于 2025-11-12 15:46 | 显示全部楼层
SH69P461 的 PB0 无法赋值,可能是引脚复用未配置正确:需先设置 PB 口方向寄存器(如 PBDIR),将 PB0 位设为 1(输出模式)。若仍无效,检查是否被其他外设占用(如定时器输出),需关闭对应外设功能。另外,确认电源电压正常,或尝试复位芯片后重新初始化,排除程序运行异常导致的控制失效。
樱花树维纳斯 发表于 2025-11-17 15:46 | 显示全部楼层
可能原因:1. 未正确配置端口方向寄存器(如 PBCON 寄存器),需确保 PB0 设为输出模式;2. 寄存器地址或位操作错误,检查赋值语句是否正确;3. 引脚被复用为其他功能(如定时器、串口),需先禁用复用功能;4. 硬件问题,如引脚短路或芯片故障,可换引脚测试排查。
我趴在云边 发表于 2025-11-24 17:24 | 显示全部楼层
常见原因:1. 端口功能未正确配置(未将 PB0 对应的方向寄存器置 1,仍为默认输入模式);2. 引脚被复用为其他外设功能(如 ADC、串口),未解除复用;3. 寄存器操作语法错误(如未正确引用端口寄存器地址);4. 电源域未使能或引脚硬件故障。需核对方向寄存器配置,关闭 PB0 的外设复用功能,按 datasheet 语法操作寄存器,也可通过仿真查看寄存器值与引脚电平,排除硬件问题。
少女诗篇 发表于 2025-11-26 13:43 | 显示全部楼层
SH69P461 的 PB0 配置输出后无法赋值,可能是未正确配置端口控制寄存器(如 PBCON),未将 PB0 明确设为输出模式。也可能 PB0 被复用为其他功能(如 ADC、中断),未关闭复用功能。还可能是电源供电异常、芯片 IO 口损坏,或代码中赋值语句逻辑错误(如未操作正确的端口数据寄存器 PBDAT),导致电平无法改写。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

14

主题

18

帖子

0

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