Переписываем код arduino для MSP430 на примере nRF24_multipro, проекта для управления игрушечными мультикоптерами


, , . Arduino IDE arduino pro mini nrf24l01+ ( XN297, nrf24l01) , PPM . .
Eachine H8 mini Radiolink AT9. .

MSP430 , 3.3 , nrf24l01 3.3 , MPS430 - . 3V3, OUT, GND, .

, , = , .



IDE Energia ( Arduino IDE MSP430 TI) , . , . , .


nRF24_multipro.ino include’. atomic EEPROM.

atomic


#include <util/atomic.h>
void update_ppm()
ATOMIC_BLOCK(ATOMIC_RESTORESTATE)
__disable_interrupt();
__enable_interrupt();

ATOMIC_BLOCK() , «» , , ATOMIC_BLOCK().

EEPROM


MSP430 EEPROM , FLASH MspFlash.
#include <EEPROM.h>
MspFlash (Sketch->Import Library…->MspFlash), FLASH
#define flash SEGMENT_D
void selectProtocol()
else 
	current_protocol = constrain(EEPROM.read(ee_PROTOCOL_ID),0,PROTO_END-1);      
// update eeprom 
EEPROM.update(ee_PROTOCOL_ID, current_protocol);

// update eeprom 
Flash.write(flash+ee_PROTOCOL_ID, & current_protocol,1);
(, ).
void set_txid(bool renew) , . FLASH . FLASH 1, ( 1). (set_txid) selectProtocol, .
:
void set_txid(bool renew)
{
    uint8_t i;
    for(i=0; i<4; i++)
        transmitterID[i] = EEPROM.read(ee_TXID0+i);
    if(renew || (transmitterID[0]==0xFF && transmitterID[1]==0x0FF)) {
        for(i=0; i<4; i++) {
            transmitterID[i] = random() & 0xFF;
            EEPROM.update(ee_TXID0+i, transmitterID[i]); 
        }            
    }
}

:
void set_txid(bool renew)
{
    uint8_t i;
    unsigned char p;
    for(i=0; i<4; i++) {
        Flash.read(flash+ee_TXID0+i,&p,1);
        transmitterID[i] =p;
    }
	Flash.read(flash+ee_PROTOCOL_ID,&p,1);
    current_protocol = constrain(p,0,PROTO_END-1);
	Flash.erase(flash);
    if(renew || (transmitterID[0]==0xFF && transmitterID[1]==0x0FF)) {
        for(i=0; i<4; i++) {
            transmitterID[i] = random(0xff) & 0xFF;
            p = transmitterID[i];
            Flash.write(flash+ee_TXID0+i, &p,1); 
        }            
    }else{
        for(i=0; i<4; i++) {
            p = transmitterID[i];
            Flash.write(flash+ee_TXID0+i, &p,1); 
        }  	
	}
}
, , , , . FLASH flash+ee_PROTOCOL_ID (0xFF), selectProtocol() , .


. SPI, «» .
#define PPM_pin   2  // PPM in
//SPI Comm.pins with nRF24L01
#define MOSI_pin  3  // MOSI - D3
#define SCK_pin   4  // SCK  - D4
#define CE_pin    5  // CE   - D5
#define MISO_pin  A0 // MISO - A0
#define CS_pin    A1 // CS   - A1
#define ledPin    13 // LED  - D13
#define PPM_pin   P1_5  // PPM in
//SPI Comm.pins with nRF24L01
#define MOSI_pin  P2_0  // MOSI 
#define SCK_pin   P2_1  // SCK  
#define CE_pin    P2_2  // CE 
#define MISO_pin  P2_3 // MISO 
#define CS_pin    P2_4 // CS   
#define ledPin    P1_4 // LED  
#define MOSI_on PORTD |= _BV(3)  // PD3
#define MOSI_off PORTD &= ~_BV(3)// PD3
#define SCK_on PORTD |= _BV(4)   // PD4
#define SCK_off PORTD &= ~_BV(4) // PD4
#define CE_on PORTD |= _BV(5)    // PD5
#define CE_off PORTD &= ~_BV(5)  // PD5
#define CS_on PORTC |= _BV(1)    // PC1
#define CS_off PORTC &= ~_BV(1)  // PC1
// SPI input
#define  MISO_on (PINC & _BV(0)) // PC0
#define MOSI_on P2OUT |= _BV(0)// P2_0
#define MOSI_off P2OUT &= ~_BV(0)// P2_0
#define SCK_on P2OUT |= _BV(1)// P2_1
#define SCK_off P2OUT &= ~_BV(1)// P2_1
#define CE_on P2OUT |= _BV(2)// P2_2
#define CE_off P2OUT &= ~_BV(2)// P2_2
#define CS_on P2OUT |= _BV(4)// P2_4
#define CS_off P2OUT &= ~_BV(4) // P2_4
// SPI input
#define  MISO_on (P2IN & _BV(3)) // P2_3

ATMEL PORTx MSP430 PxOUT. - PINx PxIN . , _BV(x) IDE Energia , :
#define _BV(val) 1<<val
void setup()
randomSeed((analogRead(A4) & 0x1F) | (analogRead(A5) << 5));
randomSeed((analogRead(A0) & 0x1F) | (analogRead(A1) << 5));
MSP430 A0, A1, A2, …, A7 P1_0, P1_1,P1_2, ..., P1_7.
attachInterrupt(PPM_pin - 2, ISR_ppm, CHANGE);
attachInterrupt(PPM_pin , ISR_ppm, CHANGE);
Arduino Uno, Nano, Mini, . mega328 2 (2, 3) attachInterrupt , MSP430. attachInterrupt().


void setup()
TCCR1A = 0;  //reset timer1
TCCR1B = 0;
TCCR1B |= (1 << CS11);  //set timer1 to increment every 1 us @ 8MHz, 0.5 us @16MHz
TACTL = TASSEL_2 + ID_3 + MC_2 + TACLR; //16000000 / 8
PPM. 2 ( 16 8).
void ISR_ppm()
counterPPM = TCNT1;
TCNT1 = 0;

counterPPM = TAR;
TAR = 0;
TCNT1 TAR .

random()


, random() Energia , , nRF24_multipro.ino Bayang.ino
random() & 0xFF; 
random(0xFF);
random() % 0x42;
random(0x41);

???


MJX.ino void MJX_bind() mjx_init2;
.




, , , , .
, , SPI , .

Source: https://habr.com/ru/post/fr392609/


All Articles