;------------------------------------------------------------------------- ; MSP430-1121STK - MSP430F1121 STARTER KIT DEVELOPMENT BOARD ;------------------------------------------------------------------------- ; http://www.olimex.com/dev ; ; Hardware: MSP430-1121STK-PCB-A ; POWER 3V/2xAA BATTERIES, MCU MSP430F1121 / 32768 Hz crystall ; 2 pcs LEDs, 2 pcs BUTTONs, BUZZER, FREQUENCY INPUT ; DALLAS INPUT, RS232 TX,RX ; ; Date: 14.04.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 "msp430x11x1.h" ;------------------------------------------- ; PORT definitions ;------------------------------------------- #define FREQ_IN BIT0 /* FREQUENCY P1.0 */ #define RS232TX BIT1 /* RS232 Tx P1.1 */ #define B_RIGHT BIT2,&P1IN /* RIGHT BUTTON P1.2 */ #define DALLAS BIT3 /* DALLAS P1.3 */ #define BUZ_1 BIT0,&P2OUT /* BUZZER 1 P2.0 */ #define B_LEFT BIT1,&P2IN /* LEFT BUTTON P2.1 */ #define RS232RX BIT2 /* RS232 Rx P2.2 */ #define LED_LEFT BIT3,&P2OUT /* LEFT LED P2.3 */ #define LED_RIGHT BIT4,&P2OUT /* RIGHT LED P2.4 */ #define BUZ_2 BIT5,&P2OUT /* BUZZER 2 P2.5 */ #define P1DEF 00000010b /* P1.x definitions */ #define P2DEF 00111001b /* P2.x definitions */ ;------------------------------------------- ; Program constants ;------------------------------------------- #define Delta 150 /* DCO 150*32768/4 */ #define Bitime_5 64 /* 9600 bps half bit */ #define Bitime 128 /* 104 us bit time */ #define CR 0Dh /* ASCII CR */ #define LF 0Ah /* ASCII LF */ #define RXWAIT 0FFFFh /* Host RX wait time constant */ #define w600us 00F3h /* 600 us delay */ #define w15us 0003h /* 15 us delay */ #define w60us 0008h /* 60 us delay */ #define w240us 0021h /* 240 us delay */ ;-------------------------------------------- ; Register variables ;-------------------------------------------- #define DSCNTR R8 /* Dallas routines counter */ #define FREQUENCY R9 /* Beep frequency */ #define RXData R10 /* ISR RS232 buffer */ #define TXData R11 /* ISR RS232 buffer */ #define BitCnt R12 /* ISR RS232 bit counter */ #define SPTR R13 /* String RS232 send ptr */ #define TEMP R14 /* buzzer temp variable */ #define DCO_TR0 R14 /* temprary registers for DCO */ #define CNTR R15 /* buzzer temp variable */ #define DCO_TR1 R15 /* calibration */ ;-------------------------------------------- ; Code memory ;-------------------------------------------- org 0F000h ; RESET mov.w #0300h,SP ;Initialize stackpointer SetupWDT mov.w #WDT_ADLY_250,&WDTCTL ;init WDT SetupTA mov.w #TASSEL1+TACLR,&TACTL ;Clear TAR & set TAR source = SMCLK SetupBC mov.b #XT2OFF+DIVA1+RSEL2+RSEL0,&BCSCTL1 ; ACLK/4 RSEL=5 SetupC0 mov.w #OUT,&CCTL0 ;TXD idle as mark bis.b #RS232TX,&P1SEL ;P1.1 to output TA0 for TXD to PC bis.b #RS232RX,&P2SEL ;P2.2 to input TA0 for RXD from PC mov.b #P1DEF,&P1DIR ; mov.b #P2DEF,&P2DIR ; mov.b #BIT3+BIT4,&P2OUT ; bis.w #MC1,&TACTL ;Start Timer_A in continous mode call #Delay ;Delay for crystal stabalization call #Set_DCO ;Calibrate DCO to 1228800 hz eint ;General interrupt enable mov.w #GREET,SPTR ;MSP430-1121STK string display call #TX_String ; mov.w #COPYR,SPTR ;copyright(c) display call #TX_String ; mov.w #WEB,SPTR ;web address display call #TX_String ; call #RXSetup ;setup RS232 receive ;-------------------------------------------- mainloop ;main loop bit.b #B_RIGHT ;right button pressed? jz rbutton_pressed ; bit.b #B_LEFT ;left button pressed? jz lbutton_pressed ; bit #CCIE,&CCTL0 ;received byte by RS232? jz RX_complete ; call #DS_CHK ;Dallas iButton present jc DS_present ; jmp mainloop ; ;-------------------------------------------- DS_present ;if Dallas iButton present bic.b #LED_RIGHT ; bic.b #LED_LEFT ;flash both LEDs & beep mov.b #80h,FREQUENCY ; mov.w #0100h,CNTR ; call #Beep_0 ; bis.b #LED_RIGHT ; bis.b #LED_LEFT ; jmp mainloop ; ;-------------------------------------------- rbutton_pressed ;right button pressed bic.b #LED_RIGHT ; call #Beep_Hi ;flash right LED & beep hi tone bis.b #LED_RIGHT ; mov.w #RBPS,SPTR ; call #TX_String ; call #RXSetup ; jmp mainloop ; ;-------------------------------------------- lbutton_pressed ;left button pressed bic.b #LED_LEFT ; call #Beep_Lo ;flash left LED & beep lo tone bis.b #LED_LEFT ; mov.w #LBPS,SPTR ; call #TX_String ; call #RXSetup ; jmp mainloop ; ;-------------------------------------------- RX_complete call #Beep_rx ;received char on RS232 port call #RXSetup ;convert ASCII code to sound jmp mainloop ; ;-------------------------------------------- Beep_rx mov.w RXData,FREQUENCY ;Buzzer procedures rla.w FREQUENCY ; mov.w #0100h,CNTR ; jmp Beep_0 ; Beep_Hi mov.w #00E0h,FREQUENCY ; mov.w #0100h,CNTR ; jmp Beep_0 ; Beep_Lo mov.w #0120h,FREQUENCY ; mov.w #0100h,CNTR ; Beep_0 ; bis.b #BUZ_1 ; bic.b #BUZ_2 ; mov.w FREQUENCY,TEMP ; Beep_2 ; dec.w TEMP ; jnz Beep_2 ; bis.b #BUZ_2 ; bic.b #BUZ_1 ; mov.w FREQUENCY,TEMP ; Beep_3 ; dec.w TEMP ; jnz Beep_3 ; dec.w CNTR ; jnz Beep_0 ; ret ; ;-------------------------------------------- ; Dallas routines ;-------------------------------------------- DSdelay dec.w DSCNTR ; jnz DSdelay ; ret ; ;-------------------------------------------- DS_CHK bic.b #DALLAS,&P1OUT ;Dallas check present bis.b #DALLAS,&P1DIR ; mov.w #w600us,DSCNTR ; call #DSdelay ; bic.b #DALLAS,&P1DIR ; mov.w #w15us,DSCNTR ; call #DSdelay ; bit.b #DALLAS,&P1IN ; jz DS_CHK_0 ; mov.w #w60us,DSCNTR ; DS_1 bit.b #DALLAS,&P1IN ; jz DS_2 ; dec.w DSCNTR ; jnz DS_1 ; jmp DS_CHK_0 ; DS_2 mov.w #w240us,DSCNTR ; DS_3 bit.b #DALLAS,&P1IN ; jnz DS_CHK_1 ; dec.w DSCNTR ; jnz DS_3 ; DS_CHK_0 clrc ; ret ; DS_CHK_1 setc ; ret ; ;-------------------------------------------- ; Calibrate DCO to 1228800 Hz (150*32768/4) ;-------------------------------------------- Delay push #0FFFFh ; L1 dec 0(SP) ; jnz L1 ; incd SP ; ret ; ;-------------------------------------------- Set_DCO clr DCO_TR0 ; Setup_CC2 mov #CCIS0+CM0+CAP,&CCTL2 ;Define CCR2=ACLK,CAP mode,pos. edge Test_DCO bit #CCIFG,&CCTL2 ;capture occured? jz Test_DCO ; bic #CCIFG,&CCTL2 ;Yes, clear interrupt flag AdjDCO mov &CCR2,DCO_TR0 ; sub DCO_TR1,DCO_TR0 ; mov &CCR2,DCO_TR1 ; cmp #Delta,DCO_TR0 ;Delta = SMCLK/(32768/4)? jlo IncDCO ;if lower increment DCO jeq DoneDCO ; DecDCO dec.b &DCOCTL ;if higher decrement DCO jmp Test_DCO ; IncDCO inc.b &DCOCTL ; jmp Test_DCO ; DoneDCO clr &CCTL2 ; ret ; ;-------------------------------------------- ; UART routines ;-------------------------------------------- RXSetup mov.b #0,RXData ;Setup for receiving from RS232 mov #RX_Count,BitCnt ; mov #CCIS0+CM1+CCIE+CAP+OUT,&CCTL0 ;Set up mode and interrupt ret ; ;-------------------------------------------- TX_String ;Send ASCII strings, SPTR used as pointer TX_S1 mov.b @SPTR+,TXData ;terminated with null character = 0 call #TX_Byte ; tst.b 0(SPTR) ; jnz TX_S1 ; ret ; ;-------------------------------------------- TX_Byte mov #TX_Count,BitCnt ;Transmit TXData character to RS232 push &TAR ; add #Bitime,0(SP) ; pop &CCR0 ; mov #OUTMOD2+OUTMOD0+CCIE,&CCTL0 ;Set up mode and interrupt, TX_Wait bit #CCIE,&CCTL0 ;TX complete? CCIE cleared in TA0_ISR jnz TX_Wait ; ret ; ;-------------------------------------------- TA0_ISR add #Bitime,&CCR0 ;Add offset for next bit br @BitCnt+ ;Branch to next routine in ;RX_count or TX_count table, set above TX_Bit rra.b TXData ;LSB is shifted to carry jc TX_Mark ;Jump if bit = 1 TX_Space bis #OUTMOD2,&CCTL0 ;TX space to PC reti ; TX_Comp bic #CCIE,&CCTL0 ;All Bits TX, disable interrupt TX_Mark bic #OUTMOD2,&CCTL0 ;TX mark to PC reti ; RX_Edge bic #CAP,&CCTL0 ;Switch to compare mode add #Bitime_5,&CCR0 ;First databit 1.5 bits from edge reti ;on stack. Use LPM0 since need DCO on RX_Bit bit #SCCI,&CCTL0 ;Get bit waiting in SCCI rrc.b RXData ;Store received bit reti ; RX_Comp bic #CCIE,&CCTL0 ;All bits RX, disable interrupt reti ; ;-------------------------------------------- RX_Count DW RX_Edge ;Set up Timer_A for RX DW RX_Bit ;RX first data bit DW RX_Bit ; second DW RX_Bit ; third DW RX_Bit ; fourth DW RX_Bit ; fifth DW RX_Bit ; sixth DW RX_Bit ; seventh DW RX_Bit ; RX eighth (last) data bit DW RX_Comp ; RX complete, process RX data TX_Count DW TX_Bit ; TX first data bit DW TX_Bit ; second DW TX_Bit ; third DW TX_Bit ; fourth DW TX_Bit ; fifth DW TX_Bit ; sixth DW TX_Bit ; seventh DW TX_Bit ; TX eighth (last) data bit DW TX_Mark ; TX stop bit = mark TX_End DW TX_Comp ; TX complete ;-------------------------------------------- GREET db CR,LF,LF,"MSP430-1121 Starter kit" COPYR db CR,LF,"Copyright(C) 2002, OLIMEX Ltd." WEB db CR,LF,"http://www.olimex.com/dev" RBPS db CR,LF,LF,"RIGHT button pressed!" LBPS db CR,LF,LF,"LEFT button pressed!" ;-------------------------------------------- ; Interrupt Vectors MSP430F1121 ;-------------------------------------------- rseg INTVEC dw RESET ;0 reserved dw RESET ;1 reserved dw RESET ;2 port 1 Vector dw RESET ;3 port 2 Vector dw RESET ;4 reserved dw RESET ;5 reserved dw RESET ;6 reserved dw RESET ;7 reserved dw RESET ;8 TIMER_A CC1-2 TA Vector dw TA0_ISR ;9 TIMER_A CC0 Vector dw RESET ;10 WDT Vector dw RESET ;11 Comparator Vector dw RESET ;12 reserved dw RESET ;13 reserved dw RESET ;14 NMI Vector dw RESET ;15 RESET Vector END