;------------------------------------------------------------------------- ; MSP430-413STK - MSP430F413 STARTER KIT DEVELOPMENT BOARD ;------------------------------------------------------------------------- ; http://www.olimex.com/dev ; ; Hardware: MSP430-413STK-PCB-B ; POWER 3V/2xAA BATTERIES, MCU MSP430F413 / 32768 Hz crystall ; LCD, 4 pcs BUTTONs, BUZZER, FREQUENCY INPUT ; DALLAS INPUT, RS232 TX,RX ; ; Date: 30.06.2002 ; ; This software is provided "as is" for evaluation of our MSP430-1121STK ; development board. You are free to use this code in your projects, but ; without warranty of any kind. If you can't understand how and what the ; code does it's better to start by learning the MSP430 datasheets, and ; assembly language, but don't call OLIMEX with questions regarding this ; software. OLIMEX will not teach you how to write assembly language nor ; how to use MSP430 peripherials, there is plenty of datasheets about them. ; ; (C) 2002 OLIMEX Ltd, All rights reserved ;------------------------------------------------------------------------- #include "include\msp430x41x.h" ;------------------------------------------- ; PORT definitions ;------------------------------------------- #define RS232TX BIT0 /* RS232 Tx P1.0 */ #define RS232RX BIT1 /* RS232 Rx P1.1 */ #define FREQ BIT5 /* Frequency input P1.5 */ #define P1DEF 00000001b #define DALLAS BIT1 /* Dallas input P2.1 */ #define B4 BIT2,&P2IN /* Button 4 P2.2 */ #define B3 BIT3,&P2IN /* Button 3 P2.3 */ #define B2 BIT4,&P2IN /* Button 2 P2.4 */ #define B1 BIT5,&P2IN /* Button 1 P2.5 */ #define BUZ1 BIT6,&P2OUT /* Buzzer line P2.6 */ #define BUZ2 BIT7,&P2OUT /* Buzzer line P2.7 */ #define P2DEF 11000000b ;------------------------------------------- ; Program constants ;------------------------------------------- #define LCD_2D 0000000000000001b #define LCD_2E 0000000000000010b #define LCD_2DP 0000000000000100b #define LCD_3C 0000000000001000b #define LCD_3D 0000000000010000b #define LCD_3E 0000000000100000b #define LCD_3DP 0000000001000000b #define LCD_1_ 0000000010000000b #define LCD_MINUS 0000000100000000b #define LCD_COM 0000001000000000b #define LCD_BAT 0000010000000000b #define LCD_PLUS 0000100100000000b #define LCD_ARR 0001000000000000b #define LCD_AC 0010000000000000b #define LCD_3G 0100000000000000b #define LCD_3F 1000000000000000b #define LCD_3A 0000000000000001b #define LCD_3B 0000000000000010b #define LCD_2C 0000000000000100b #define LCD_1DP 0000000000001000b #define LCD_1E 0000000000010000b #define LCD_1D 0000000000100000b #define LCD_1C 0000000001000000b #define LCD_1B 0000000010000000b #define LCD_1A 0000000100000000b #define LCD_1F 0000001000000000b #define LCD_1G 0000010000000000b #define LCD_2B 0000100000000000b #define LCD_2A 0001000000000000b #define LCD_2F 0010000000000000b #define LCD_2G 0100000000000000b #define LCD_L 1000000000000000b #define Bitime_5 128 /* 9600 bps half bit */ #define Bitime 256 /* 104 us bit time */ #define CR 0Dh /* ASCII CR */ #define LF 0Ah /* ASCII LF */ ;------------------------------------------- ; Register variables ;------------------------------------------- #define INDEX R6 /* INDEX EEPROM, RS232 RX */ #define BitCnt R7 /* ISR RS232 */ #define SPTR R8 /* String RS232 send ptr */ #define FREQUENCY R9 /* Beep frequency */ #define HOURMIN R10 /* Hours : minutes */ #define SECONDS R11 /* Seconds RTC */ #define TIME R12 /* 1 second counter */ #define LCD R13 /* LCD conversion register */ #define LCD_1REG R14 /* LCD register WDT_ISR */ #define LCD_2REG R15 /* LCD register WDT_ISR */ ;------------------------------------------- ; Data variables ;------------------------------------------- org 0200h ;RAM address RXTXData dw 1 ;RS232 working word DataConv db 1 ;HEX to ASCII converter variable LCD_update_flag db 1 ;time to LCD update in main Blink db 1 ;LCD blink sign ;------------------------------------------- org 0E000h ;Code memory ;------------------------------------------- #include "include\uart.h" WDT_ISR ;R14,R15 LCD registers xor.w #0FFFFh,LCD_1REG ; xor.w #0FFFFh,LCD_2REG ; mov.b LCD_1REG,&P3OUT ; push LCD_1REG ; swpb LCD_1REG ; mov.b LCD_1REG,&P4OUT ; pop LCD_1REG ; mov.b LCD_2REG,&P5OUT ; push LCD_2REG ; swpb LCD_2REG ; mov.b LCD_2REG,&P6OUT ; pop LCD_2REG ; inc.w TIME ; cmp.w #040h,TIME ; jz RTC_CLOCK ; RTC_exit ; reti ; RTC_CLOCK clr.w TIME ; mov.b #1,LCD_update_flag ; clrc ;time update each second dadd.w #0100h,SECONDS ; cmp.w #6000h,SECONDS ; jne RTC_exit ; clrc ; dadd.w #4000h,SECONDS ; dadc.w HOURMIN ; cmp.b #60h,HOURMIN ; jne RTC_exit ; clrc ; dadd.w #0040h,HOURMIN ; cmp.w #1300h,HOURMIN ; jne RTC_exit ; mov.w #0100h,HOURMIN ; jmp RTC_exit ; LCD_update bic.b #WDTIE,&IE1 ;disable WDT clr.w LCD_1REG ; clr.w LCD_2REG ; push LCD ;fisrt digit rlc.w LCD ; and.w #01Eh,LCD ; bis.w LCD_1(LCD),LCD_2REG ; pop LCD ; push LCD ;second digit rrc.w LCD ; rrc.w LCD ; rrc.w LCD ; and.w #01Eh,LCD ; bis.w LCD_2a(LCD),LCD_2REG ; bis.w LCD_2b(LCD),LCD_1REG ; pop LCD ; push LCD ;third digit rrc.w LCD ; rrc.w LCD ; rrc.w LCD ; rrc.w LCD ; rrc.w LCD ; rrc.w LCD ; rrc.w LCD ; and.w #01Eh,LCD ; bis.w LCD_3a(LCD),LCD_1REG ; bis.w LCD_3b(LCD),LCD_2REG ; pop LCD ; push LCD ;forth digit and.w #0F000h,LCD ; cmp.w #01000h,LCD ; jnz no1 ; bis.w #LCD_1_,LCD_1REG ; no1 pop LCD ; tst.b Blink ; jnz noblink ; bis.w #LCD_L,LCD_2REG ; noblink bis.b #WDTIE,&IE1 ;enable WDT ret ; Delay push INDEX ;delay push SPTR ; mov.w #0,INDEX ; dly0 mov.w #6,SPTR ; dly1 dec.w SPTR ; jnz dly1 ; dec.w INDEX ; jnz dly0 ; pop SPTR ; pop INDEX ; ret ; LCD_1 dw LCD_1A+LCD_1B+LCD_1C+LCD_1D+LCD_1E+LCD_1F ;0 dw LCD_1B+LCD_1C ;1 dw LCD_1A+LCD_1B+LCD_1D+LCD_1E+LCD_1G ;2 dw LCD_1A+LCD_1B+LCD_1C+LCD_1D+LCD_1G ;3 dw LCD_1B+LCD_1C+LCD_1F+LCD_1G ;4 dw LCD_1A+LCD_1C+LCD_1D+LCD_1F+LCD_1G ;5 dw LCD_1A+LCD_1C+LCD_1D+LCD_1E+LCD_1F+LCD_1G ;6 dw LCD_1A+LCD_1B+LCD_1C ;7 dw LCD_1A+LCD_1B+LCD_1C+LCD_1D+LCD_1E+LCD_1F+LCD_1G ;8 dw LCD_1A+LCD_1B+LCD_1C+LCD_1D+LCD_1F+LCD_1G ;9 dw LCD_1A+LCD_1B+LCD_1C+LCD_1E+LCD_1F+LCD_1G ;A dw LCD_1C+LCD_1D+LCD_1E+LCD_1F+LCD_1G ;b dw LCD_1A+LCD_1D+LCD_1E+LCD_1F ;C dw LCD_1B+LCD_1C+LCD_1D+LCD_1E+LCD_1G ;d dw LCD_1A+LCD_1D+LCD_1E+LCD_1F+LCD_1G ;E dw LCD_1A+LCD_1E+LCD_1F+LCD_1G ;F LCD_2a ;abcfg,LCD2_REG dw LCD_2A+LCD_2B+LCD_2C+LCD_2F ;0 dw LCD_2B+LCD_2C ;1 dw LCD_2A+LCD_2B+LCD_2G ;2 dw LCD_2A+LCD_2B+LCD_2C+LCD_2G ;3 dw LCD_2B+LCD_2C+LCD_2F+LCD_2G ;4 dw LCD_2A+LCD_2C+LCD_2F+LCD_2G ;5 dw LCD_2A+LCD_2C+LCD_2F+LCD_2G ;6 dw LCD_2A+LCD_2B+LCD_2C ;7 dw LCD_2A+LCD_2B+LCD_2C+LCD_2F+LCD_2G ;8 dw LCD_2A+LCD_2B+LCD_2C+LCD_2F+LCD_2G ;9 dw LCD_2A+LCD_2B+LCD_2C+LCD_2F+LCD_2G ;A dw LCD_2C+LCD_2F+LCD_2G ;b dw LCD_2A+LCD_2F ;C dw LCD_2B+LCD_2C+LCD_2G ;D dw LCD_2A+LCD_2F+LCD_2G ;E dw LCD_2A+LCD_2F+LCD_2G ;F LCD_2b ;de,LCD1_REG dw LCD_2D+LCD_2E ;0 dw 0 ;1 dw LCD_2D+LCD_2E ;2 dw LCD_2D ;3 dw 0 ;4 dw LCD_2D ;5 dw LCD_2D+LCD_2E ;6 dw 0 ;7 dw LCD_2D+LCD_2E ;8 dw LCD_2D ;9 dw LCD_2E ;A dw LCD_2D+LCD_2E ;b dw LCD_2D+LCD_2E ;C dw LCD_2D+LCD_2E ;D dw LCD_2D+LCD_2E ;E dw LCD_2E ;F LCD_3a ;cdefg,LCD_1REG dw LCD_3C+LCD_3D+LCD_3E+LCD_3F ;0 dw LCD_3C ;1 dw LCD_3D+LCD_3E+LCD_3G ;2 dw LCD_3C+LCD_3D+LCD_3G ;3 dw LCD_3C+LCD_3F+LCD_3G ;4 dw LCD_3C+LCD_3D+LCD_3F+LCD_3G ;5 dw LCD_3C+LCD_3D+LCD_3E+LCD_3F+LCD_3G ;6 dw LCD_3C ;7 dw LCD_3C+LCD_3D+LCD_3E+LCD_3F+LCD_3G ;8 dw LCD_3C+LCD_3D+LCD_3F+LCD_3G ;9 dw LCD_3C+LCD_3E+LCD_3F+LCD_3G ;A dw LCD_3C+LCD_3D+LCD_3E+LCD_3F+LCD_3G ;b dw LCD_3D+LCD_3E+LCD_3F ;C dw LCD_3C+LCD_3D+LCD_3E+LCD_3G ;D dw LCD_3D+LCD_3E+LCD_3F+LCD_3G ;E dw LCD_3E+LCD_3F+LCD_3G ;F LCD_3b ;ab dw LCD_3A+LCD_3B ;0 dw LCD_3B ;1 dw LCD_3A+LCD_3B ;2 dw LCD_3A+LCD_3B ;3 dw LCD_3B ;4 dw LCD_3A ;5 dw LCD_3A ;6 dw LCD_3A+LCD_3B ;7 dw LCD_3A+LCD_3B ;8 dw LCD_3A+LCD_3B ;9 dw LCD_3A+LCD_3B ;A dw 0 ;b dw LCD_3A ;C dw LCD_3B ;D dw LCD_3A ;E dw LCD_3A ;F ;-------------------------------------------- ; Code memory ;-------------------------------------------- RESET mov.w #0300h,SP ;Initialize stackpointer SetupWDT mov.w #WDT_ADLY_16,&WDTCTL ;init WDT for 16ms SetupTA mov.w #TASSEL1+TACLR,&TACTL ;Clear TAR & set TAR source = SMCLK mov.b #XCAP10PF,&FLL_CTL0 ;10 pf mov.b #FLL_DIV_4,&FLL_CTL1 ;ACLK/4 mov.b #74,&SCFQCTL ;fDCO=75*32768=2457600 mov.w #0FFFFh,INDEX ; wait0 dec.w INDEX ;wait DCO to stabilize jnz wait0 ; SetupC0 mov.w #OUT,&CCTL0 ;TXD idle as mark bis.b #RS232TX+RS232RX,&P1SEL ;P1.0 to output TA0 for TXD to PC ;P1.1 to input TA0 for RXD from PC mov.b #11111111b,&P1OUT ; mov.b #P1DEF,&P1DIR ; bis.w #MC1,&TACTL ;Start Timer_A in continous mode mov.b #P2DEF,&P2DIR ; mov.b #0FFh,P3DIR ;P3-P6 outputs mov.b #0FFh,P4DIR ; mov.b #0FFh,P5DIR ; mov.b #0FFh,P6DIR ; mov.w #LCD_COM,LCD_1REG ;all segments ON mov.w #0,LCD_2REG ; mov.w #0100h,HOURMIN ; mov.w #0,SECONDS ; mov.b #0,Blink ; mov.w #0,TIME ; mov.b #0,LCD_update_flag ; bis.b #WDTIE,&IE1 ;enable WDT interrupts eint ; call #LCD_update ;update display mainloop ; bit.b #B2 ;MINUTES++ jnz check_2 ; bic.b #WDTIE,&IE1 ;disable WDT dadd.w #01h,HOURMIN ; cmp.b #60h,HOURMIN ; jne chk1_exit ; and.w #0FF00h,HOURMIN ; chk1_exit mov.w HOURMIN,LCD ; call #LCD_update ;update display mov.w #B2S,SPTR ;B2 string call #TX_String ; call #Beep_B2 ; check_2 bit.b #B1 ;HOURS++ jnz check_3 ; bic.b #WDTIE,&IE1 ;disable WDT dadd.w #00100h,HOURMIN ; cmp.w #01300h,HOURMIN ; jlo chk2_exit ; and.w #000FFh,HOURMIN ; bis.w #00100h,HOURMIN ; chk2_exit mov.w HOURMIN,LCD ; call #LCD_update ;update display mov.w #B1S,SPTR ;B1 string call #TX_String ; call #Beep_B1 ; check_3 bit.b #B3 ;HOURS++ jnz check_4 ; mov.w #B3S,SPTR ;B2 string call #TX_String ; call #Beep_B3 ; check_4 bit.b #B4 ;HOURS++ jnz check_exit ; mov.w #B4S,SPTR ;B2 string call #TX_String ; call #Beep_B4 ; check_exit tst.b LCD_update_flag ; jz mainloop ; mov.w HOURMIN,LCD ; call #LCD_update ; clr.b LCD_update_flag ; xor.b #1,Blink ; jmp mainloop ; ERRVEC ; jmp ERRVEC ; reti ; Beep_B1 mov.w #0100h,FREQUENCY ; mov.w #00200h,SPTR ; jmp Beep_0 ; Beep_B2 mov.w #0150h,FREQUENCY ; mov.w #00200h,SPTR ; jmp Beep_0 ; Beep_B3 mov.w #01A0h,FREQUENCY ; mov.w #00200h,SPTR ; jmp Beep_0 ; Beep_B4 mov.w #0200h,FREQUENCY ; mov.w #00200h,SPTR ; Beep_0 ; bis.b #BUZ1 ; bic.b #BUZ2 ; mov.w FREQUENCY,INDEX ; Beep_2 ; dec.w INDEX ; jnz Beep_2 ; bis.b #BUZ2 ; bic.b #BUZ1 ; mov.w FREQUENCY,INDEX ; Beep_3 ; dec.w INDEX ; jnz Beep_3 ; dec.w SPTR ; jnz Beep_0 ; ret ; B1S db CR,LF,"B1 pressed!" B2S db CR,LF,"B2 pressed!" B3S db CR,LF,"B3 pressed!" B4S db CR,LF,"B4 pressed!" ;-------------------------------------------- ; Interrupt Vectors MSP430F413 ;-------------------------------------------- rseg INTVEC dw ERRVEC ;0 reserved dw ERRVEC ;1 reserved dw ERRVEC ;2 port 1 Vector dw ERRVEC ;3 port 2 Vector dw ERRVEC ;4 reserved dw ERRVEC ;5 reserved dw TA0_ISR ;6 TIMER_A CC0 Vector dw ERRVEC ;7 reserved dw ERRVEC ;8 TIMER_A CC1-2 TA Vector dw ERRVEC ;9 reserved dw WDT_ISR ;10 WDT Vector dw ERRVEC ;11 Comparator Vector dw ERRVEC ;12 reserved dw ERRVEC ;13 reserved dw ERRVEC ;14 NMI Vector dw RESET ;15 RESET Vector END