📄 image_3rd_computer_1012.s43
字号:
#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 + -