#include "msp430g2231.h" #include "inttypes.h" #include "stdlib.h" #include "stdio.h" #define LED1 BIT0 // red Led #define LED2 BIT6 // green Led #define TXD BIT1 // TXD on P1.1 #define Bitime 104 // 9600 Baud, SMCLK=1MHz (1MHz/9600)=104 uint8_t BitCnt; // Bit count, used when transmitting byte char TXByte; int integer; char string[20]; // TXByte via UART when Transmit() is called // Function Definitions void Transmit (void); void sendChar (char c); void UartPutS (char *s); void main (void) { WDTCTL = WDTPW + WDTHOLD; // Stop watchdog timer BCSCTL1 = CALBC1_1MHZ; // Set range DCOCTL = CALDCO_1MHZ; // SMCLK = DCO = 1MHz P1SEL |= TXD + BIT3; P1DIR |= TXD + BIT6 + BIT4 + BIT0; P1DIR |= 0x41; // Set P1.0, P1.6 to output direction P1IE |= 0x08; // P1.3 interrupt enabled P1IES |= 0x08; // P1.3 Hi/lo edge P1IFG &= ~0x08; //AD Wandelung ADC10CTL0 = ADC10ON + REFON + REF2_5V + SREF_1; //ADC10CTL0 = ADC10SHT_2 | ADC10ON | REFON | REF2_5V; // Input channel 1, trigger using ADC10SC bit , no clock division , // internal ADC clock , single channel single conversions ADC10CTL1 = INCH_3 | SHS_0 | ADC10DIV_0 | ADC10SSEL_0 | CONSEQ_0; ADC10AE0 = BIT3; // Enable analog input on channel 1 ADC10CTL0 |= ENC; // Enable conversions for (;;) { ADC10CTL0 |=ADC10SC; // Trigger new conversion while ((ADC10CTL1 & ADC10BUSY) == ADC10BUSY) { // Loop while conversion takes place if (ADC10MEM >= BIT9) // Is output in top half of range? { P1OUT = BIT6; // Yes: Turn LED on } else { P1OUT = 0; // No: Turn LED off } } sprintf(string, "\n%d string", ADC10MEM); P1IFG &= ~0x08; // P1.3 IFG cleared P1OUT ^= (LED1 + LED2); // Toggle Led if key is pressed __bis_SR_register(GIE); UartPutS (string); __bis_SR_register(GIE); // interrupts enabled } } void UartPutS (char *s) { while (*s) { sendChar (*s++); } } void sendChar (char c) { TXByte = c; Transmit (); __delay_cycles (50); // ~ 60 µSec. } void Transmit (void) { CCTL0 = OUT; // TXD Idle as Mark TACTL = TASSEL_2 + MC_2; // SMCLK, continuous mode BitCnt = 0xA; // Load Bit counter, 8 bits + ST/SP CCR0 = TAR; CCR0 += Bitime; // Set time till first bit TXByte |= 0x100; // Add stop bit to TXByte (which is logical 1) TXByte <<= 1; // Add start bit (which is logical 0) CCTL0 = CCIS0 + OUTMOD0 + CCIE; // Set signal, intial value, enable interrupts while (CCTL0 & CCIE); // Wait for TX completion TACTL = TASSEL_2; // SMCLK, timer off (for power consumption) } // Timer A0 interrupt service routine #pragma vector=TIMERA0_VECTOR __interrupt void Timer_A (void) { CCR0 += Bitime; // Add Offset to CCR0 if (BitCnt == 0) { // If all bits TXed, disable interrupt CCTL0 &= ~ CCIE ; } else { CCTL0 |= OUTMOD2; // TX Space if (TXByte & 0x01) CCTL0 &= ~ OUTMOD2; // TX Mark TXByte >>= 1; BitCnt --; } }