1 | #include <msp430x20x3.h>
|
2 | #include <msp430.h>
|
3 | void spi_out(void);
|
4 | volatile unsigned int i = 0x0000;
|
5 | volatile unsigned int adwert = 0x0000;
|
6 | volatile unsigned int adlo = 0x00;
|
7 | volatile unsigned int adhi = 0x00;
|
8 | volatile unsigned int senden = 0x00;
|
9 | volatile unsigned int empfangen = 0x00;
|
10 |
|
11 | void main(void)
|
12 | {
|
13 | WDTCTL = WDTPW + WDTHOLD; // Stop watchdog Timer
|
14 |
|
15 | BCSCTL1 = CALBC1_1MHZ; // Master clk auf 1MHz setzen um Stromsparend zu arbeiten
|
16 | DCOCTL = CALDCO_1MHZ;
|
17 | // BCSCTL3 = LFXT1S_2; // Setze LFTX1 auf VLO = 12kHz
|
18 |
|
19 | //######################### I/O setup ###################################
|
20 | P1DIR &= ~(BIT4); // Input direction
|
21 | P1OUT &= ~(BIT4); // Pulldown resistor
|
22 | P1REN |= (BIT4); // Pulldown enable
|
23 |
|
24 | //######################### ADC setup ###################################
|
25 |
|
26 | SD16CTL = SD16REFON + SD16VMIDON + SD16SSEL_1; //Referenzspannung ein, Clock einstellen
|
27 | P1SEL |= BIT3;
|
28 | SD16INCTL0 = SD16INCH_0; // Auswahl ADC0(Pin:1.0+1.1)
|
29 | SD16CCTL0 = SD16UNI + SD16IE; //Unipolar, Interrupt einschalten
|
30 | SD16AE = SD16AE0; //schaltet digitale Schaltung für diesen Pin ein
|
31 |
|
32 | //######################### SPI setup ###################################
|
33 |
|
34 | USICTL0 = USIPE7 + USIPE6 + USIPE5 + USIOE + USIGE; // Port, SPI Slave
|
35 | USICTL1 = USIIE; // Counter interrupt, flag remains set
|
36 | USICNT = 8; // init-load counter
|
37 | USICNT &= ~USI16B; // 16-bit-transmission
|
38 | USICTL0 &= ~USISWRST; //release for operation
|
39 | USICKCTL |= USICKPL; //Clock polarität, inaktiv=high
|
40 | // __bis_SR_register(LPM1_bits + GIE); // Enter low power mode & enable interrupt
|
41 |
|
42 | __bis_SR_register(LPM4_bits + GIE);
|
43 |
|
44 | }
|
45 |
|
46 | // ADC interrupt service routine
|
47 | #if defined(__TI_COMPILER_VERSION__) || defined(__IAR_SYSTEMS_ICC__)
|
48 | #pragma vector = SD16_VECTOR
|
49 | __interrupt void SD16ISR(void)
|
50 | #elif defined(__GNUC__)
|
51 | void __attribute__ ((interrupt(SD16_VECTOR))) SD16ISR (void)
|
52 | #else
|
53 | #error Compiler not supported!
|
54 | #endif
|
55 | {
|
56 | SD16CCTL0 &= ~ SD16IFG; // clear ADC Interrupt Flag
|
57 | SD16CCTL0 |= SD16SC; // AD Wandler starten
|
58 | while (!(SD16CCTL0 & SD16IFG)); // AD Wandlung fertig ?
|
59 | adwert=SD16MEM0;
|
60 | adlo = (adwert & 0x00FF);
|
61 | adhi = (adwert & 0xFF00);
|
62 |
|
63 | }
|
64 |
|
65 | // USI interrupt service routine
|
66 | #if defined(__TI_COMPILER_VERSION__) || defined(__IAR_SYSTEMS_ICC__)
|
67 | #pragma vector=USI_VECTOR
|
68 | __interrupt void universal_serial_interface(void)
|
69 | #elif defined(__GNUC__)
|
70 | void __attribute__ ((interrupt(USI_VECTOR))) universal_serial_interface (void)
|
71 | #else
|
72 | #error Compiler not supported!
|
73 | #endif
|
74 | {
|
75 | USICTL0 |= USISWRST;
|
76 | empfangen = USISRL; // <-- Lesezugriff USISR
|
77 | SD16CCTL0 |= SD16IFG; // clear ADC Interrupt Flag
|
78 |
|
79 | if (empfangen == 0x19) //Abfrage ADC High byte
|
80 | {
|
81 | for (i = 0; i < 0x3600; i++);
|
82 | senden = (adhi >> 8);
|
83 | }
|
84 | else if (empfangen == 0x54) // Abfrage ADC Low byte
|
85 | {
|
86 | senden = adlo;
|
87 | }
|
88 | else if (empfangen == 0x20) // Abfrage IO Pins 3&4 normaly low
|
89 | {
|
90 | /* if((P1IN & BIT3)) //Pin4
|
91 | {
|
92 | if (P1IN &(BIT4)) //Pin4 und 5
|
93 | {
|
94 | senden = 0x88;
|
95 | }
|
96 | else
|
97 | {
|
98 | senden = 0x08;
|
99 | }
|
100 | }
|
101 | ############ if wieder hinter else setzen!!!
|
102 | else */
|
103 | if ((P1IN &(BIT4))) //Pin5
|
104 | {
|
105 | senden = 0x80;
|
106 | }
|
107 | else
|
108 | {
|
109 | senden = 0x11; //falls keiner high ist sende 11
|
110 | }
|
111 | }
|
112 | else
|
113 | {
|
114 | senden = 0xE7; //Fehlercode, nichts empfangen
|
115 | }
|
116 |
|
117 | USISRL = senden; // <-- Schreibzugriff USISR
|
118 | USICNT = 8; // enable
|
119 | USICTL0 &= ~USISWRST;
|
120 | }
|