Hallo, ich habe mir den MSP430-PIR Sensor von Olimex geholt und einen ez430-F2013 USB Stick zum entickeln. Jetzt würde ich den MSP430-PIR code gern so anpassen das ich ihn mit einem anderen µC (z.B. Atmel) über Spi auslesen kann. Leider habe ich keine Beispiele für das IAR Workbench gefunden mit den man mal den SPI Slave mit dem msp430-2013 testen kann. Habt ihr vielleicht was für mich.
Stefan A. schrieb: > MSP430-PIR Ein Link wäre etwas netter gewesen. >Jetzt würde ich den MSP430-PIR code gern so anpassen das ich ihn mit >einem anderen µC (z.B. Atmel) über Spi auslesen kann. Hast Du auch einen MSP430F2013? TI hat Samples, auch für SPI. Also solltest Du alles zusammen bekomemn. mfg Klaus
Das ist der Code vom PIR Sensor und hier ein Link(https://www.olimex.com/Products/MSP430/Starter/MSP430-PIR/)
1 | #include <msp430x20x3.h> |
2 | |
3 | #define LED_OUT BIT0 // Bit location for LED
|
4 | #define SENSOR_PWR BIT7 // Bit location for power to sensor
|
5 | #define THRESHOLD 50 // Threshold for motion
|
6 | |
7 | static unsigned int result_old = 0; // Storage for last conversion |
8 | char LED_ENABLE = 1; // LED control |
9 | |
10 | void main(void) |
11 | {
|
12 | WDTCTL = WDTPW+WDTTMSEL+WDTCNTCL+WDTSSEL; // ACLK/32768, int timer: ~10s |
13 | BCSCTL1 = CALBC1_1MHZ; // Set DCO to 1MHz |
14 | DCOCTL = CALDCO_1MHZ; |
15 | BCSCTL1 |= DIVA_2; // ACLK = VLO/4 |
16 | BCSCTL3 |= LFXT1S_2; |
17 | |
18 | P1OUT = 0x10; // P1OUTs |
19 | P1SEL = 0x08; // Select VREF function |
20 | P1DIR = 0xEF; // Unused pins as outputs |
21 | P1REN |= 0x10; // P1.4 pullup |
22 | P1IE |= 0x10; // P1.4 interrupt enabled |
23 | P1IES |= 0x10; // P1.4 Hi/lo edge |
24 | P1IFG &= ~0x10; // P1.4 IFG cleared |
25 | P2OUT = 0x00 + SENSOR_PWR; // P2OUTs |
26 | P2SEL &= ~SENSOR_PWR; // P2.7 = GPIO |
27 | P2DIR = 0xff; // Unused pins as outputs |
28 | |
29 | SD16CTL = SD16VMIDON + SD16REFON + SD16SSEL_1;// 1.2V ref, SMCLK |
30 | SD16INCTL0 = SD16GAIN_4 + SD16INCH_4; // PGA = 4x, Diff inputs A4- & A4+ |
31 | SD16CCTL0 = SD16SNGL + SD16IE; // Single conversion, 256OSR, Int enable |
32 | SD16CTL &= ~SD16VMIDON; // VMID off: used to settle ref cap |
33 | SD16AE = SD16AE1 + SD16AE2; // P1.1 & P1.2: A4+/- SD16_A inputs |
34 | |
35 | // Wait for PIR sensor to settle: 1st WDT+ interval
|
36 | P1SEL |= LED_OUT; // Turn LED on with ACLK (for low Icc) |
37 | while(!(IFG1 & WDTIFG)); // ~5.4s delay: PIR sensor settling |
38 | P1SEL &= ~LED_OUT; // Turn LED off with ACLK (for low Icc) |
39 | |
40 | // Reconfig WDT+ for normal operation: interval of ~341msec
|
41 | WDTCTL = WDTPW+WDTTMSEL+WDTCNTCL+WDTSSEL+WDTIS1;// ACLK/512, int timer: 341msec |
42 | BCSCTL1 |= DIVA_3; // ACLK = VLO/8 |
43 | IE1 |= WDTIE; // Enable WDT interrupt |
44 | |
45 | _BIS_SR(LPM3_bits + GIE); // Enter LPM3 with interrupts |
46 | }
|
47 | |
48 | /******************************************************
|
49 | // SD16_A interrupt service routine
|
50 | ******************************************************/
|
51 | #pragma vector = SD16_VECTOR
|
52 | __interrupt void SD16ISR(void) |
53 | { unsigned int result_new; |
54 | |
55 | SD16CTL &= ~SD16REFON; // Turn off SD16_A ref |
56 | result_new = SD16MEM0; // Save result (clears IFG) |
57 | |
58 | if (result_new > result_old) // Get difference between samples |
59 | result_old = result_new - result_old; |
60 | else
|
61 | result_old = result_old - result_new; |
62 | |
63 | if (result_old > THRESHOLD) // If motion detected... |
64 | if (LED_ENABLE & 0x01) |
65 | P1OUT |= LED_OUT; // Turn LED on |
66 | |
67 | result_old = SD16MEM0; // Save last conversion |
68 | |
69 | __bis_SR_register_on_exit(SCG1+SCG0); // Return to LPM3 after reti |
70 | }
|
71 | |
72 | /******************************************************
|
73 | // Watchdog Timer interrupt service routine
|
74 | ******************************************************/
|
75 | #pragma vector=WDT_VECTOR
|
76 | __interrupt void watchdog_timer(void) |
77 | {
|
78 | if (!(P1OUT & LED_OUT)) // Has motion already been detected? |
79 | {
|
80 | SD16CTL |= SD16REFON; // If no, turn on SD16_A ref |
81 | SD16CCTL0 |= SD16SC; // Set bit to start new conversion |
82 | __bic_SR_register_on_exit(SCG1+SCG0); // Keep DCO & SMCLK on after reti |
83 | }
|
84 | else
|
85 | P1OUT &= ~LED_OUT; // If yes, turn off LED, measure on next loop |
86 | }
|
87 | |
88 | // Port 1 interrupt service routine
|
89 | #pragma vector=PORT1_VECTOR
|
90 | __interrupt void Port_1(void) |
91 | {
|
92 | LED_ENABLE ^= 0x01; // Toggle LED enable for current measurement |
93 | P1IFG &= ~0x10; // P1.4 IFG cleared |
94 | }
|
Spi Slave suche ich leider vergebens nach einem Beispiel code für den MSP430-F2013
:
Bearbeitet durch User
http://www.ti.com/product/MSP430F2013/toolssoftware http://www.ti.com/general/docs/lit/getliterature.tsp?baseLiteratureNumber=slac080&fileType=zip Ist doch da! msp430x20x3_usi_02.s43 SPI full-Duplex 3-wire Master msp430x20x3_usi_03.s43 SPI full-Duplex 3-wire Slave msp430x20x3_usi_04.s43 USI SPI Interface to HC165/164 Shift Registers msp430x20x3_usi_05.s43 USI SPI Interface to TLC549 8-bit ADC mfg klaus
Hab das auch schon gesehen kann es leider nicht laden Der link geht bei mir irwie nicht:
1 | Texas Instrumen |
2 | ts
|
3 | |
4 | |
5 | Sorry! We are currently doing site maintenance. |
6 | |
7 | This part of the TI website is currently undergoing scheduled system maintenance. |
8 | We apologize for the inconvenience and ask that you try again later. |
Ok hab es.
1 | //******************************************************************************
|
2 | // MSP430F20x2/3 Demo - SPI full-Duplex 3-wire Slave
|
3 | //
|
4 | // Description: SPI Master communicates full-duplex with SPI Slave using
|
5 | // 3-wire mode. The level on P1.4 is TX'ed and RX'ed to P1.0.
|
6 | // Master will pulse slave reset for synch start.
|
7 | // ACLK = n/a, MCLK = SMCLK = Default DCO
|
8 | //
|
9 | // Slave Master
|
10 | // MSP430F20x2/3 MSP430F20x2/3
|
11 | // ----------------- -----------------
|
12 | // | XIN|- /|\| XIN|-
|
13 | // | | | | |
|
14 | // | XOUT|- --|RST XOUT|-
|
15 | // | | /|\ | |
|
16 | // | RST/NMI|--+<----|P1.2 |
|
17 | // LED <-|P1.0 | | P1.4|<-
|
18 | // ->|P1.4 | | P1.0|-> LED
|
19 | // | SDI/P1.7|<-------|P1.6/SDO |
|
20 | // | SDO/P1.6|------->|P1.7/SDI |
|
21 | // | SCLK/P1.5|<-------|P1.5/SCLK |
|
22 | //
|
23 | // M. Buccini / L. Westlund
|
24 | // Texas Instruments Inc.
|
25 | // October 2005
|
26 | // Built with CCE Version: 3.2.0 and IAR Embedded Workbench Version: 3.40A
|
27 | //******************************************************************************
|
28 | |
29 | #include <msp430.h> |
30 | |
31 | int main(void) |
32 | {
|
33 | WDTCTL = WDTPW + WDTHOLD; // Stop watchdog timer |
34 | P1OUT = 0x10; // P1.4 set, else reset |
35 | P1REN |= 0x10; // P1.4 pullup |
36 | P1DIR = 0x01; // P1.0 output, else input |
37 | USICTL0 |= USIPE7 + USIPE6 + USIPE5 + USIOE; // Port, SPI slave |
38 | USICTL1 |= USIIE; // Counter interrupt, flag remains set |
39 | USICTL0 &= ~USISWRST; // USI released for operation |
40 | USISRL = P1IN; // init-load data |
41 | USICNT = 8; // init-load counter |
42 | |
43 | __bis_SR_register(LPM0_bits + GIE); // Enter LPM0 w/ interrupt |
44 | }
|
45 | |
46 | // USI interrupt service routine
|
47 | #if defined(__TI_COMPILER_VERSION__) || defined(__IAR_SYSTEMS_ICC__)
|
48 | #pragma vector=USI_VECTOR
|
49 | __interrupt void universal_serial_interface(void) |
50 | #elif defined(__GNUC__)
|
51 | void __attribute__ ((interrupt(USI_VECTOR))) universal_serial_interface (void) |
52 | #else
|
53 | #error Compiler not supported!
|
54 | #endif
|
55 | {
|
56 | if (0x10 & USISRL) |
57 | P1OUT |= 0x01; |
58 | else
|
59 | P1OUT &= ~0x01; |
60 | USISRL = P1IN; |
61 | USICNT = 8; // re-load counter |
62 | }
|
Ich würde jetzt gern ein Arduino (3.3V) zum testen dran hängen. Kann ich da den SPI Sample code hier nehmen, was muss ich noch dran ändern um den befehl für LED An/Aus zu senden?
1 | #include "SPI.h" // necessary library |
2 | int ss=10; // using digital pin 10 for SPI slave select |
3 | int del=200; // used for various delays |
4 | |
5 | void setup() |
6 | {
|
7 | pinMode(ss, OUTPUT); // we use this for SS pin |
8 | SPI.begin(); // wake up the SPI bus. |
9 | SPI.setBitOrder(MSBFIRST); |
10 | }
|
11 | |
12 | void setValue(int value) |
13 | {
|
14 | digitalWrite(ss, LOW); |
15 | SPI.transfer(0); // send command byte |
16 | SPI.transfer(value); // send value (0~255) |
17 | digitalWrite(ss, HIGH); |
18 | }
|
19 | |
20 | void loop() |
21 | {
|
22 | setValue(1); |
23 | delay(del); |
24 | setValue(0); |
25 | delay(del); |
26 | }
|
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.