Forum: Mikrocontroller und Digitale Elektronik MSP430F2013 als SPI Slave Sensor


von Stefan A. (ripper121)


Lesenswert?

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.

von Klaus R. (klara)


Lesenswert?

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

von Stefan A. (ripper121)


Lesenswert?

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
von Klaus R. (klara)


Lesenswert?

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

von Stefan A. (ripper121)


Lesenswert?

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.

von Klaus R. (klara)


Angehängte Dateien:

Lesenswert?

Geht doch. Siehe Anhang.

von Stefan A. (ripper121)


Lesenswert?

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
Noch kein Account? Hier anmelden.