From 23426ef144bc9eba4b0a7629e315ff56a29d6a85 Mon Sep 17 00:00:00 2001 From: Mats van Reenen Date: Sun, 24 Jan 2021 15:47:56 +0100 Subject: [PATCH] Revert "remove file not for the CC3220" This reverts commit 44d2cfc70d6bd565e943fce9a578daac3bd01809. --- msp430/main.c | 112 +++++++++++++++++++++++++++++ tests/mpptTest/README.md | 26 +++++++ tests/mpptTest/mpptTest.ino | 139 ++++++++++++++++++++++++++++++++++++ tests/mpptTest/pinout.md | 26 +++++++ 4 files changed, 303 insertions(+) create mode 100644 msp430/main.c create mode 100644 tests/mpptTest/README.md create mode 100644 tests/mpptTest/mpptTest.ino create mode 100644 tests/mpptTest/pinout.md diff --git a/msp430/main.c b/msp430/main.c new file mode 100644 index 0000000..2ca666f --- /dev/null +++ b/msp430/main.c @@ -0,0 +1,112 @@ +#include +#include + +#define READBUFFER_LEN 10 +#define WRITEBUFFER_LEN 10 + +// this buffers store the the receved and send data +unsigned char ReadBuffer[READBUFFER_LEN]; +unsigned char WriteBuffer[WRITEBUFFER_LEN]; + +// the pointers are used to remenber the location it was on the buffer +unsigned char *ReadBuffer_p = &ReadBuffer[0]; +unsigned char *WriteBuffer_p = &WriteBuffer[0]; + +// if it finisched receving/sending a packet this wil become true +bool NewPacket = false; + +enum {SLEEP, WRITE, READ} State; +typedef enum {} PacketID_t; //TODO: add packet ids + +void Setup(void); + +int main(void) +{ + WDTCTL = WDTPW + WDTHOLD; // Stop WDT + + P1SEL |= BIT6 + BIT7; // Assign I2C pins to USCI_B0 + P1SEL2|= BIT6 + BIT7; // Assign I2C pins to USCI_B0 + + Setup(); + State = SLEEP; + + while(1){ + while(!NewPacket){ + //TODO: add sleep mode + } + + __disable_interrupt(); // don't want the interupt to destoy you beautiful packet + NewPacket = false; // recet new packet flag + uint8_t bytesReceved = ReadBuffer_p - &ReadBuffer[0]; + uint8_t data[READBUFFER_LEN]; + + // copy data from the buffer used for the communication so it can receve the next packet + memcpy(&data[0], &ReadBuffer[0], bytesReceved); + + __enable_interrupt(); // data is save + + switch (data[0]){ + case /* packet id */: + /* read packet */ + break; + } + } +} + +/* + * Deze interrupt is beide voor RXIFG en TXIFG. + * Dus vlaggetjes bekijken om te zien wat er gebeurd + */ +#pragma vector = USCIAB0TX_VECTOR +__interrupt void USCIAB0TX_ISR(void) +{ + if(IFG2 & UCB0TXIFG && State == WRITE){ + // Read data from I2C + UCB0TXBUF = *WriteBuffer_p; + WriteBuffer_p++; + if(WriteBuffer_p > &WriteBuffer[WRITEBUFFER_LEN]){ + State = SLEEP; + NewPacket = true; + } + }else if(IFG2 & UCB0RXIFG && State == READ){ + // Write data to I2C + *ReadBuffer_p = UCB0RXBUF; + ReadBuffer_p++; + if(ReadBuffer_p > &ReadBuffer[READBUFFER_LEN]){ + State = WRITE; + } + } +} + +/* + * Hier krijgen we de start/stop condities + */ +#pragma vector = USCIAB0RX_VECTOR +__interrupt void USCIAB0RX_ISR(void) +{ + if(UCB0STAT & UCSTTIFG){ + // start signaal ontvangen + State = READ; + // reset pointers + WriteBuffer_p = &WriteBuffer[0]; + ReadBuffer_p = &ReadBuffer[0]; + }else if(UCB0STAT & UCSTPIFG){ + // stop signaal, klaar met transactie + State = SLEEP; + NewPacket = true; + } + + // Clear interrupt flags + UCB0STAT &= ~(UCSTPIFG + UCSTTIFG); +} + +void Setup(void){ + __disable_interrupt(); + UCB0CTL1 |= UCSWRST; // reset + UCB0CTL0 = UCMODE_3 + UCSYNC; // I2C Slave, synchronous mode + UCB0I2COA = 0x48; // eigen slave adres is 048h + UCB0CTL1 &= ~UCSWRST; // reset uit + UCB0I2CIE |= UCSTPIE + UCSTTIE; // detectie voor start en stop + IE2 |= UCB0RXIE | UCB0TXIE; // interrupts aan + __enable_interrupt(); +} diff --git a/tests/mpptTest/README.md b/tests/mpptTest/README.md new file mode 100644 index 0000000..094670c --- /dev/null +++ b/tests/mpptTest/README.md @@ -0,0 +1,26 @@ +# MPPT test + +De MPPT test wordt grootendeels handmatig uitgevoerdt. Er wordt een arduino gebruikt om de initalisatie te starten. + +## setup + +### CC3220S + +In debugmode met de orginaile code. + +#### breakboints + +* mppt.c: mppt_start(): last usleep + +### Arduino + +De arduino wordt gebuikt voor het simuleeren van de volgende signaalen: + +* start initialisatie +* start +* SPI (direct naar de CC3220S ipv met I2C via de MSP) + +### dingen die gemeten worden + +* vermogen uit de motor +* PWM signaal diff --git a/tests/mpptTest/mpptTest.ino b/tests/mpptTest/mpptTest.ino new file mode 100644 index 0000000..2216523 --- /dev/null +++ b/tests/mpptTest/mpptTest.ino @@ -0,0 +1,139 @@ +#include +#include +#include + +#define I2C Wire + +#define startInit_PIN 9 +#define startSys_PIN 8 +#define ready_PIN 7 +#define noodstop_PIN 6 + +#define CSK_PIN 13 +#define MISO_PIN 12 +#define MOSI_PIN 11 +#define CSMSP_PIN 10 + +typedef enum { + SPIPARM_maxVermogen, + SPIPARM_maxSnelheid, + SPIPARM_maxTemperatuur, + SPIPARM_setpoint, + SPIPARM_vermogen, + SPIPARM_snelheid, + SPIPARM_temperatuur, + SPIPARM_count +} SPI_Register_t; +uint8_t SPI_RxBuffer[4]; +uint8_t * SPI_TxBuffer; +uint8_t SPI_Params[SPIPARM_count][2]; +uint8_t pos; + +void setSetpoint(uint8_t v){ + SPI_Params[SPIPARM_setpoint][0] = v; +} +void setMaxVermogen(uint8_t v){ + SPI_Params[SPIPARM_maxVermogen][0] = v; +} +void setMaxTemperatuur(uint8_t v){ + SPI_Params[SPIPARM_maxTemperatuur][0] = v; +} +void setMaxSnelheid(uint16_t v){ + SPI_Params[SPIPARM_maxSnelheid][0] = v & 0x0FF; + SPI_Params[SPIPARM_maxSnelheid][1] = v > 8; +} + +void setup(){ + Serial.begin(115200); + Serial.println("The Fantastic Five - Belasting regelaar - MPPT Test"); + Serial.println("Init Arduino"); + + // init GPIO + pinMode(noodstop_PIN, INPUT); + digitalWrite(startInit_PIN, LOW); + pinMode(startInit_PIN, OUTPUT); + digitalWrite(startSys_PIN, LOW); + pinMode(startSys_PIN, OUTPUT); + + // init I2C + I2C.begin(); + + // init SPI + pinMode(MISO_PIN, OUTPUT); + SPCR |= _BV(SPE); // set SPI in slave mode + SPI.attachInterrupt(); + + Serial.println("Init CC3220S"); + + // set all SPI params to 0 + memset(&SPI_Params[0][0], 0x00, sizeof(SPI_Params)); + + // set max limits + setMaxVermogen(250); // deci watts; 0 to 250 + setMaxTemperatuur(120); // deg c; 60 to 120 + setMaxSnelheid(60000); // RPM; 0 to 60000 + + // set inital setpoint + setSetpoint(50); // deci watt; 0 to 250 + + // trigger the initalisation + digitalWrite(startInit_PIN, HIGH); + + // sync paramaters until the CC3220S is ready + uint16_t timer = millis(); + while(!digitalRead(ready_PIN)){ + spiRun(); + } + + Serial.println("Start CC3220S"); + + // start the system + digitalWrite(startSys_PIN, 1); +} + +ISR(SPI_STC_vect){ + SPI_RxBuffer[pos] = SPDR; + if(pos == 0) + SPDR = *(SPI_TxBuffer); + else + SPDR = *(SPI_TxBuffer + 1); + pos--; +} + +void spiRun(){ + while(pos == 3) + continue; + + SPI_TxBuffer = &SPI_Params[SPI_RxBuffer[3]][0]; + + while(!digitalRead(CSMSP_PIN)) + continue; + + pos = 3; +} + +void loop(){ + spiRun(); + + switch(SPI_RxBuffer[3]){ + case SPIPARM_vermogen: + Serial.print("vermogen: "); + Serial.print(SPI_RxBuffer[1], DEC); + Serial.println(" deci watt"); + if(SPI_RxBuffer[1] > 3 == SPI_Params[SPIPARM_setpoint][0] > 3){ + Serial.println("reached setpoint :)"); + setSetpoint((SPI_Params[SPIPARM_setpoint][0] == 50) ? 100 : 50); + } + break; + case SPIPARM_snelheid: + Serial.print("snelheid: "); + Serial.print(SPI_RxBuffer[1] + SPI_RxBuffer[0]*0x100, DEC); + Serial.println(" RPM"); + break; + case SPIPARM_temperatuur: + Serial.print("temperatuur: "); + Serial.print(SPI_RxBuffer[1], DEC); + Serial.println(" dec c"); + break; + } +} diff --git a/tests/mpptTest/pinout.md b/tests/mpptTest/pinout.md new file mode 100644 index 0000000..7fe6aa5 --- /dev/null +++ b/tests/mpptTest/pinout.md @@ -0,0 +1,26 @@ +# pinout Arduino + +## GPIO + +| lable | pin | +|------------|----:| +| start init | 9 | +| start sys | 8 | +| ready | 7 | +| noodstop | 6 | + +## I2C + +| lable | pin | +|-------|----:| +| SDA | A4 | +| SCL | A5 | + +## SPI + +| lable | pin | +|--------|----:| +| CSK | 13 | +| MISO | 12 | +| MOSI | 11 | +| CS MSP | 10 |