#include "hardware.h" ;variables .data .comm rxdata,1,1 ;char var .comm rxshift,1,1 ;char var .comm rxbit,2,2 ;short var, aligned .text interrupt(TIMERA0_VECTOR) ;register interrupt vector ;interrupt handler to receive as Timer_A UART .global ccr0 ;place a label afterwards so ccr0: ;that it is used in the listing add rxbit, r0 jmp .Lrxstart ;start bit jmp .Lrxdatabit ;D0 jmp .Lrxdatabit ;D1 jmp .Lrxdatabit ;D2 jmp .Lrxdatabit ;D3 jmp .Lrxdatabit ;D4 jmp .Lrxdatabit ;D5 jmp .Lrxdatabit ;D6 ; jmp .Lrxlastbit ;D7 that one is following anyway .Lrxlastbit: ;last bit, handle byte bit #SCCI, &CCTL0 ;read last bit rrc.b rxshift ;and save it clr rxbit ;reset state mov #CCIE|CAP|CM_2|CCIS_1|SCS, &CCTL0 ;restore capture mode mov.b rxshift, rxdata ;copy received data bic #CPUOFF|OSCOFF|SCG0|SCG1, 0(r1) ;exit all lowpower modes ;here you might do other things too, like setting a flag ;that the wakeup comes from the Timer_A UART. however ;it should not take longer than one bit time, otherwise ;charcetrs will be lost. reti .Lrxstart: ;startbit, init clr rxshift ;clear input buffer add #(BAUD/2), &CCR0 ;startbit + 1.5 bits -> first bit mov #CCIE|CCIS_1|SCS, &CCTL0;set compare mode, sample bits jmp .Lrxex ;set state,... .Lrxdatabit: ;save databit bit #SCCI, &CCTL0 ;measure databit rrc.b rxshift ;rotate in databit .Lrxex: add #BAUD, &CCR0 ;one bit delay incd rxbit ;setup next state reti ; void serPutc(char) ;use an other Capture/Compare than for receiving (full duplex). ;this one is without interrupts and OUTMOD, because only ;this way P1.1 can be used. P1.1 is prefered because the ;BSL is on that pin too. .global putchar .type putchar, @function putchar: ;send a byte mov #0, &CCTL1 ;select compare mode mov #10, r13 ;ten bits: Start, 8 Data, Stop rla r15 ;shift in start bit (0) bis #0x0200, r15 ;set tenth bit (1), thats the stop bit mov &TAR, &CCR1 ;set up start time .Lt1lp: add #BAUD, &CCR1 ;set up for one bit rrc r15 ;shift data trough carry jc .Lt1 ;test carry bit .Lt0: bic.b #TX, &P1OUT ;generate pulse jmp .Ltc ; .Lt1: bis.b #TX, &P1OUT ;just use the same amount of time as for a zero jmp .Ltc ; .Ltc: bit #CCIFG, &CCTL1 ;wait for compare jz .Ltc ;loop until the bit is set bic #CCIFG, &CCTL1 ;clear for next loop dec r13 ;decrement bit counter jnz .Lt1lp ;loop until all bits are transmitted ret