⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 image_3rd_computer_1012.s43

📁 采用msp430中汇编语言编写的
💻 S43
📖 第 1 页 / 共 5 页
字号:
#include          "msp430x14x.h" 

;P6口的配置
#define     ADDR0                     BIT1
#define     RD                        BIT2
#define     WR                        BIT3
#define     EOI                       BIT4
#define     END_36060                 BIT5
#define     START_36060               BIT6
            ;ZR36060的sleep管脚,低电平有效
#define     ADDR1                     BIT7

;P1口的配置
#define     Reset_36060               BIT0
#define     ACK                       BIT1
#define     PWDN                      BIT2
#define     Reset_7620                BIT3
#define     SIO_DATA                  BIT4
#define     SIO_CLK                   BIT5
#define     Sleep_36060               BIT6
#define     EN_Image                  BIT7

;P2口的配置
#define     Q0                        BIT0
#define     Q1                        BIT1
#define     Q2                        BIT2
#define     Q3                        BIT3
#define     Q4                        BIT4
#define     Q5                        BIT5
#define     Q6                        BIT6
#define     Q7                        BIT7

;P3口的配置
#define     EN_5V_com                 BIT2
#define     EN_3V_Data                BIT3
#define     TXD                       BIT4
#define     RXD                       BIT5
#define     DSR                       BIT6
#define     DTR                       BIT7

;P4口的配置
#define     WEN                       BIT0
#define     MRS                       BIT1
#define     FF_FIFO                   BIT2
#define     EF_FIFO                   BIT3
#define     RCLK                      BIT4
#define     REN                       BIT5
#define     RT_7620                  BIT6        

              
;定义RAM区
#define     RAMSTRT                   020Ah
#define     I2C_ADD                   0300h
                ;当向7620写数据时,该地址内放着传输的首字节
                ;R15中放有总字节数
                ;当向7620读数据时,该地址内放着读出的字节
                ;存7620的寄存器值
#define     REG_36060                 0400h
                ;存36060的寄存器值                
#define     WAIT_TIME                 0204h
                ;循环等待时间    
#define     WAIT_TIME2                0206h
                ;循环等待时间    

#define     RAMEND                    0950h
#define     MEM_7620                  0800h
                ;从0700h到0780h为7620寄存器值存储地址
#define     MEM_36060                 0880h 
                ;从0780h到07FFh为36060寄存器值存储地址                
#define     USARTDATA                 0900h   
                ;

#define     DAY      024Fh
                      ; Byte for counting days
#define     MONTH    0250h
                      ; Byte for counting months
#define     YEAR     0251h                    
                      ; Byte for counting years
#define     DELAY_NUM        0253h               
              ;如果DELAY_NUM等于1,则相当于等候大约半秒钟,以此类推
#define     DELAY_WAIT_N              026Ah
                ; (字节格式) 
#define     DELAY_N                     026Ch  
                ; (字节格式)               
#define	    TRAN_BYTES			02A2h
  ;单片机向GSM模块发数时,除了有效数据外,还有一些头字节等
  ;定义有效数据的字节数为TRAN_BYTES
#define	    TRANDATA_TOGSM_TIMES	02A3h
  ;考虑到单片机向GSM发数有可能不成功,此时应该最多发3次  

;定义标志寄存器R10
#define      Mod_Chip_Flag             1
            ;本次拍摄是否需要修改7620或36060寄存器,需要则为1


;定义特殊变量
#define     XTAL1_FREQ                32768    
                ;如果XTAL1_FREQ的值发生改变,则XTAL_TA0的值也必须随之变化
#define     XTAL1_TA0                 0F000h
                ;它能产生一个15秒的时延:0F000h/(XTAL1_FREQ/8)=15s
                ;如果XTAL1_FREQ不等于32768,则XTAL1_TA0也必须随之变化
#define     XTAL1_025S                  0400h
                ;当XTAL1_FREQ等于32768时,若采用8分频、up方式计时,则计时01000h为1秒            
                ;因此当XTAL1_FREQ改变时,上述这些变量都必须随之改变
                

;-----------------------------------------------------------------------------
             RSEG  CSTACK
             DS    0           
;----------------------------------------------------------------------------- 
NAME         RTC
             RSEG    CODE
;-----------------------------------------------------------------------------
Setup        ;Set up modules 
;----------------------------------------------------------------------------- 
RESET        bit.b   #WDTIFG,&IFG1
             jz      RESET_1
             mov     #SFE(CSTACK),SP         ; Initialize stackpointer
             jmp     SetupPort      
             
RESET_1      mov     #SFE(CSTACK),SP         ; Initialize stackpointer
StopWDT      mov     #WDTPW+WDTHOLD,&WDTCTL  ; stop watchdog 
             CALL    #RAMCLR                 ; clear RAM (from 200h to 800h :1.5Kb)
             mov     #5,&WAIT_TIME2

SetupPort   ;;;;;;;;;;;P1.x                  ; 初始化各端口
            mov.b   #0FDH,&P1DIR        ;11111101
                         ; P1.0: Reset_36060  ZR36060-Reset 低电平有效
                         ; P1.1: ACK          ZR36060-ACK
                         ; P1.2: PWDN         输出至OV7620 1为关闭OV7620
                         ; P1.3: Reset_7620   输出至OV7620 1为将7620复位
                         ; P1.4:SIO_DATA     SIO0    I2C串行数据
                         ; P1.5:SIO_CLK      SIO1    I2C串行时钟
                         ; P1.6:Sleep_36060  输出至ZR36060,负逻辑,0为关闭ZR36060
                         ; P1.7: EN_Image     输出控制7620和ZR36060的3.3V和5V电压信号,0为开启电源
              bic.b   #PWDN+Reset_7620,&P1OUT               ;这两个信号均为高电平有效
              bis.b   #SIO_DATA+SIO_CLK,&P1OUT              ;RD/WR均为低电平有效
              bis.b   #EN_Image,&P1OUT
           mov.b    #00h,&P2DIR
                        ;Q0~Q7
            

            mov.b   #09Ch,&P3DIR        ;10011100
                         ; P3.2   EN_5V_com  输出控制通信单元的5V信号,0为开启电源
                         ; P3.3   EN_3V_Data 输出控制驱动FPGA和SDRAM的电源,0为开启电源
                         ; P3.4:  TXD         输出通信数据
                         ; P3.5:  RXD         输入通信数据
                         ; P3.6:  DSR    
                         ; P3.7:  DTR
            bis.b    #EN_3V_Data,&P3OUT
            bic.b    #EN_5V_com,&P3OUT
	    bic.b    #TXD+RXD,&P3SEL      ; P3.4,5=USART0 TXD/RXD,不能删


            mov.b   #073H,&P4DIR        ;01110011
                         ; P4.0:WEN        输出,允许主控芯片通过WCLK写72V291,低电平有效
                         ; P4.1: MRS        输出,将72V291主复位,低电平有效
                         ; P4.2:FF_FIFO    输入,FIFO的写满标志,低电平有效
                         ; P4.3:EF_FIFO    输入,FIFO的空标志,低电平有效
                         ; P4.4:RCLK       输入或输出,FIFO的写时钟
                         ; P4.5:REN        输出,允许主控芯片通过RCLK读72V291,低电平有效
                         ; P4.6:RT_7620    输出,将READ指针指向0,低电平有效,通常设为1
           bis.b    #RT_7620+WEN+REN,&P4OUT
           bic.b    #MRS,&P4OUT
           
            ;P5口是与ZR36060的数据接口,此处可暂时不定义,到具体程序中再定义
                       

            mov.b   #0CFH,&P6DIR        ;11001111
                         ; P6.0: MAX824_WDI 输出至max824,作为激励信号
                         ; P6.1: ADDR0       ZR36060-ADDR0
                         ; P6.2: RD          ZR36060-RD   
                         ; P6.3: WR          ZR36060-WR 
                         ; P6.4: EOI         图像结束标志(低电平有效,标志FFD9正在被输出)
                         ; P6.5: END_36060   压缩过程结束标志,低电平有效
                         ; P6.6: START_36060,启动压缩,低电平有效
                         ; P6.7: ADDR1       ZR36060-ADDR1   
           bis.b   #START_36060,&P6OUT   ;关闭所有电源
           bis.b   #WR+RD,&P6OUT  
                     mov     #10,&WAIT_TIME
                     CALL    #DELAY_LOOP
                     mov     #10,&WAIT_TIME
                     CALL    #DELAY_LOOP
                     mov     #10,&WAIT_TIME
                     CALL    #DELAY_LOOP
                     mov     #10,&WAIT_TIME
                     CALL    #DELAY_LOOP
                     mov     #10,&WAIT_TIME
                     CALL    #DELAY_LOOP
                     mov     #10,&WAIT_TIME
                     CALL    #DELAY_LOOP
                     mov     #10,&WAIT_TIME
                     CALL    #DELAY_LOOP
                     mov     #10,&WAIT_TIME
                     CALL    #DELAY_LOOP
            bic.b   #EN_5V_com+EN_3V_Data,&P3OUT
         bis.b   #DTR,&P3OUT

            bis     #Mod_Chip_Flag,R10      ;首次拍摄需要配置芯片

            CALL    #Init_USART
	    bis.b   #UTXE0+URXE0,&ME1       ; Enable USART0 TXD/RXD,不能删

             CALL   #Initial_MEM7620        
             CALL   #Initial_MEM36060


	    
SetupTA      mov     #TACLR+TASSEL0+ID1+ID0,&TACTL 
                     ; stop/clear/setup TACTL,with ACLK as clock,8 division
                                      
SetupWDT_2   ;mov     #WDTPW+WDTCNTCL+WDTSSEL,&WDTCTL  ; start watchdog (1秒)
            
SetupC0_TA   mov     #CCIE,&CCTL0   ; CCR0 interrupt enabled
             mov     #XTAL1_TA0,&CCR0   ; load CCR0 with F000h (15S)
             mov     #CCIE,&CCTL1   ; CCR0 interrupt enabled
             mov     #XTAL1_025S,&CCR1   ; load CCR1 with 800h (0.25S)
             mov     #XTAL1_TA0-100,&TAR
             
             eint    
         CALL    #CONFIG_7620
             ;bis     #MC1,&TACTL      ; start TA in "up to CCR0" mode 
;-----------------------------------------------------------------------------
Mainloop     ;
;-----------------------------------------------------------------------------

          ; bis.b   #EN_Image,&P1OUT
          ; bis.b   #EN_3V_Data,&P3OUT
           bis.b   #START_36060,&P6OUT   ;关闭所有电源
;此处判断是否有来自计算机的控制命令
           mov	 #USARTDATA,R15
                     mov     #10,&WAIT_TIME
                     CALL    #DELAY_LOOP
MM_LOOP    
           bit.b   #BIT6,&P3IN        ;如果已经通知可以开始拍摄了,则去拍摄
           jnz      Main_Start_0
           bit.b    #URXIFG0,&IFG1       ;有数据进来?
           jz       MM_LOOP              ;没有则继续等待
           
           
        mov.b    &RXBUF0,0(R15)       ;将数据存到缓冲区中
        cmp      #USARTDATA,R15
        jne      Main_1               ;还是第一个字节吗?
        ;还是第一个字节
        cmp.b    #0ACh,0(R15)         ;判断是否为开始字节
        jne      MM_LOOP              ;不是则表明正式数据尚未开始,继续等待
        ;已经开始了
        inc      R15                  ;存储地址加1
        jmp      MM_LOOP
Main_1    ;已经不是第一个字节了
        inc      R15        
        jmp      MM_LOOP
        
Main_Start_0    ;开始前的初始化
        cmp        #USARTDATA+2,R15   ;如果有效接收数据小于2,则肯定不需要修改配置
        jlo        Main_2     
        mov        #USARTDATA,R13
        mov.b      1(R13),R15
        bic        #0FF00h,R15
        add        #USARTDATA,R15
        dec        R15      ;;;;;此处减去1以使R15指向最后一个字节
        mov        #USARTDATA+2,R13
Main_Start
        ;先判断是否需要修改配置
        cmp        R13,R15              ;判断是否有超过两个的有效字节
        jlo        Main_2               ;没有则表示不需要修改配置
        
        ;需要修改配置
        cmp.b      #080h,0(R13)
        jhs        Main_3               ;需要修改的寄存器不属于7620
        ;属于7620的寄存器
        bis        #Mod_Chip_Flag,R10   ;需要修改配置
        mov.b      0(R13),R6
        inc        R13
        mov.b      0(R13),R8
        inc        R13
        CALL       #MODIFY_7620_1REG
        jmp        Main_Start
        
Main_3  ;需要修改的寄存器不属于7620   ,属于36060
        mov.b      0(R13),R14
        sub.b      #080h,R14
        bic        #0FF00h,R14
        add        #MEM_36060,R14
        inc        R13
        mov.b      0(R13),0(R14)
        inc        R13
        jmp        Main_Start
           
        
Main_2    bic.b   #EN_5V_com+EN_3V_Data,&P3OUT
          bis.b   #DTR,&P3OUT

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -