In diesem Beispiel-Programm wird ein Lauflicht mit zwei Schieberegistern (MOS4094, kaskadiert) programmiert. Die 16 LEDs sind in einem Rechteck/Quadrat/Kreis angeordnet. Die Schieberegister bekommen ihre Daten seriell, somit werden nur 3-4 Ports am MSP430 benötigt um 16 LEDs anzusteuern. Das Programm soll erstmal nur ein kleiner Test für ein größeres Projekt sein.
Schaltplan
In dem Schaltplan fehlen die Stützkondensatoren (100nF), nicht vergessen! Für einen kleinen Testaufbau nicht so tragisch, kann aber trotzdem böse enden.
Bild & Video
ASM-Programm
FILE: main.asm
;***********************************************
; ___ _ _
; | |_ _ _| |___ ___ _| |___
; | | |_'_| . | -_| _|_| . | -_|
; |___|_,_|___|___|___|_|___|___|
;
; FILE: main.asm
; Author: declis (xdec.de)
;***********************************************
.cdecls "msp430g2231.h"
.cdecls "defs.h"
.ref clock_gen,init_regs,init_TimerA,ISR_TimerA
.global main
.text
main:
mov.w #0x280,SP ;initialize stack pointer
mov.w #WDTPW+WDTHOLD,&WDTCTL ;stop watchdog timer
bis.b #data+clock+strobe,&P1DIR ;P1.0,P1.1,P1.2 -> output
bic.b #data+clock+strobe,&P1OUT ;clear data,clock,strobe
mov.w #0,R15 ;global flag for TimerA interrupt
;if R15=1, TimerA interrupt triggered
bis.b #strobe,&P1OUT ;storage registers high
call #init_regs ;initialize shift registers (all LEDs off)
call #init_TimerA ;initialize TimerA
EINT ;interrupt enable
loop_start:
bis.b #data,&P1OUT ;data port high
call #clock_gen ;shift one bit into shift-register
;(one LED on)
bic.b #data,&P1OUT ;data port low
mov.w #led_number,R4 ;counter for LED position
loop_main:
cmp.w #1,R15 ;if TimerA interrupt triggered
jz loop_shift
jmp loop_main
loop_shift:
call #clock_gen ;shift to next stage
mov.w #0,R15 ;reset ISR flag
dec.w R4 ;counter-1
cmp.w #0,R4 ;if LED-Position 0 (15th LED on), start again
jz loop_start
jmp loop_main
.sect TIMERA0_VECTOR ;0xFFF2 Timer A CC0 (".int09")
.word ISR_TimerA ;interrupt service routine for TimerA
.endFILE: lib_func.asm
;***********************************************
; ___ _ _
; | |_ _ _| |___ ___ _| |___
; | | |_'_| . | -_| _|_| . | -_|
; |___|_,_|___|___|___|_|___|___|
;
; FILE: lib_func.asm
; Author: declis (xdec.de)
;***********************************************
.cdecls "msp430g2231.h"
.cdecls "defs.h"
.def clock_gen,init_regs,init_TimerA,ISR_TimerA
.text
;------------------------------------------
; Name: clock_gen
; Description: generates a rising edge
; _||_ (0-1-0)
; Input: nothing
; Returns: nothing
; Destroys: nothing
;------------------------------------------
clock_gen:
bic.b #clock,&P1OUT
bis.b #clock,&P1OUT
bic.b #clock,&P1OUT
ret
;------------------------------------------
; Name: init_regs
; Description: initialize shift registers
; (all outputs low)
; Input: nothing
; Returns: nothing
; Destroys: nothing
;------------------------------------------
init_regs:
push.w SR
push.w R5
bic.b #data,&P1OUT ;data port low
mov.w #led_number,R5 ;counter (16 LEDs)
cmp.w #0,R5
loop:
jz alloff ;shift-registers filled up with 0's
call #clock_gen ;shift 0 into shift-registers
dec.w R5 ;counter-1
jmp loop
alloff:
pop.w R5
pop.w SR
ret
;------------------------------------------
; Name: init_TimerA
; Description: initialize Timer A
; cycles=(seconds*10^6Hz)/8
; seconds=(8*cycles)/10^6Hz
; 62500 cycles = 500ms
; SMCLK=~1MHz
; Input: nothing
; Returns: nothing
; Destroys: nothing
;------------------------------------------
init_TimerA:
bis.w #TASSEL_2+ID_3,&TACTL ;SMCLK, 8x divider
mov.w #cycles,&TACCR0
bis.w #CCIE,&TACCTL0 ;enable TimerA interrupt
bis.w #MC_1,&TACTL ;start timer in up-mode
ret
;------------------------------------------
; Name: ISR_TimerA
; Description: Interrupt Service Routine TA
; Input: nothing
; Returns: nothing
; Destroys: R15
;------------------------------------------
ISR_TimerA:
mov.w #1,R15 ;set interrupt flag
;everything else will be calculated in main
reti
.endDas Unterprogramm “init_regs” kann man sich theoretisch sparen.
FILE: defs.asm
;*********************************************** ; ___ _ _ ; | |_ _ _| |___ ___ _| |___ ; | | |_'_| . | -_| _|_| . | -_| ; |___|_,_|___|___|___|_|___|___| ; ; FILE: defs.h ; Author: declis (xdec.de) ;*********************************************** #ifndef DEFS_H_ #define DEFS_H_ #define cycles 6250 /* 50ms delay between shift process */ #define data 0x01 /* DATA (serial input) on P1.0 */ #define clock 0x02 /* CLOCK on P1.1 */ #define strobe 0x04 /* STROBE (storage register) on P1.2 */ #define led_number 16 /* number of LEDs */ #endif /*DEFS_H_*/


