Compare commits

9 Commits

Author SHA1 Message Date
c1c0d33358 new 2014-10-08 21:43:30 +02:00
44bf85a800 change address (0x53) 2014-10-03 17:54:30 +02:00
68ae71db28 fix 2014-10-03 17:51:07 +02:00
hg
2b89c9736b measurement in telegram 2014-10-03 17:27:42 +02:00
18d32c860e 1Hz 2014-10-03 16:52:48 +02:00
33a6a88cc2 fix 2014-10-03 16:28:46 +02:00
hg
8867d95837 adc stuff 2014-10-03 16:09:57 +02:00
hg
6c832eeb88 changes 2014-08-31 18:29:46 +02:00
hg
d6affd7230 Added tag works_so_far for changeset 7a4995fcabfc 2014-06-05 22:43:58 +02:00
13 changed files with 191 additions and 12 deletions

1
.hgtags Normal file
View File

@ -0,0 +1 @@
7a4995fcabfc07a5496a88e91b5a0e9201e604a3 works_so_far

View File

@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<projectDescription> <projectDescription>
<name>MSP430test</name> <name>MBusLightSensor</name>
<comment></comment> <comment></comment>
<projects> <projects>
</projects> </projects>

43
src/adc.cpp Normal file
View File

@ -0,0 +1,43 @@
/*
* adc.cpp
*
* Created on: 03.10.2014
* Author: wn
*/
#include <msp430g2553.h>
#include <isr_compat.h>
#include <stdint.h>
#include "adc.h"
void adcInit() {
ADC10CTL0 = ADC10SHT_2 | ADC10SR | REFON | REF2_5V | ADC10ON;
ADC10CTL1 = INCH_5;
ADC10AE0 = BIT5;
}
uint16_t adcGet() {
uint16_t res = 0xffff;
ADC10CTL0 |= ENC | ADC10SC;
uint32_t timeOut = ADC_TIME_OUT;
while (1) {
timeOut--;
if (timeOut == 0)
break;
if ((ADC10CTL0 & ADC10IFG) != 0) {
res = ADC10MEM;
ADC10CTL0 &= ~(ADC10IFG | ENC);
break;
}
}
return res;
}

22
src/adc.h Normal file
View File

@ -0,0 +1,22 @@
/*
* adc.h
*
* Created on: 03.10.2014
* Author: wn
*/
#ifndef ADC_H_
#define ADC_H_
#include <stdint.h>
const uint32_t ADC_TIME_OUT = 100000;
void adcInit();
uint16_t adcGet();
#endif /* ADC_H_ */

View File

@ -14,10 +14,12 @@
#include "time.h" #include "time.h"
#include "meterBusClient.h" #include "meterBusClient.h"
#include "debug.h" #include "debug.h"
#include "adc.h"
#include "uptime.h"
MeterBusClient meterBusClient; MeterBusClient meterBusClient;
Uptime uptime;
int main() { int main() {
WDTCTL = WDTPW | WDTHOLD; WDTCTL = WDTPW | WDTHOLD;
@ -25,9 +27,10 @@ int main() {
debugInit(); debugInit();
uartInit(); uartInit();
adcInit();
timeInit(); timeInit();
meterBusClient.begin(); meterBusClient.begin(&uptime);
__enable_interrupt(); __enable_interrupt();
@ -36,6 +39,7 @@ int main() {
while (1) { while (1) {
// __bis_status_register(LPM0_bits); // __bis_status_register(LPM0_bits);
meterBusClient.exec(); meterBusClient.exec();
uptime.exec();
} }
} }

View File

@ -23,9 +23,10 @@ MeterBusClient::MeterBusClient() : m_address(0),
void MeterBusClient::begin() { void MeterBusClient::begin(Uptime *uptime) {
// setAddress(Config::getUChar(Config::METERBUSCLIENT_ADDRESS)); // setAddress(Config::getUChar(Config::METERBUSCLIENT_ADDRESS));
setAddress(0x22); setAddress(0x53);
m_uptime = uptime;
} }
void MeterBusClient::setAddress(unsigned char a) { void MeterBusClient::setAddress(unsigned char a) {
@ -132,7 +133,7 @@ bool MeterBusClient::handleFrame() {
typedef enum { typedef enum {
STATE_START, STATE_IDLE, STATE_SHORT_FRAME, STATE_LONG_CTRL_FRAME, STATE_HANDLE, STATE_INVALID, STATE_DONE, STATE_START, STATE_IDLE, STATE_SHORT_FRAME, STATE_LONG_CTRL_FRAME, STATE_HANDLE, STATE_INVALID, STATE_DONE,
STATE_DELAYED_RESPONSE, STATE_DELAY, STATE_RESPONSE, STATE_RECEIVE_ECHO STATE_DELAYED_RESPONSE, STATE_DELAY, STATE_RECEIVE_ECHO
} e_meterBusClientState; } e_meterBusClientState;
typedef enum { typedef enum {

View File

@ -8,7 +8,7 @@
#ifndef METERBUSCLIENT_H_ #ifndef METERBUSCLIENT_H_
#define METERBUSCLIENT_H_ #define METERBUSCLIENT_H_
#include "uptime.h"
@ -52,9 +52,11 @@ struct MeterBusFrame {
class MeterBusClient { class MeterBusClient {
public: public:
MeterBusClient(); MeterBusClient();
void begin(); void begin(Uptime *uptime);
void exec(); void exec();
private: private:
Uptime *m_uptime;
unsigned char m_address; unsigned char m_address;
void setAddress(unsigned char address); void setAddress(unsigned char address);
unsigned char getAddress(); unsigned char getAddress();

View File

@ -7,6 +7,8 @@
#include "meterBusClient.h" #include "meterBusClient.h"
#include "stdint.h" #include "stdint.h"
#include "adc.h"
void MeterBusClient::aSB(unsigned char v) { void MeterBusClient::aSB(unsigned char v) {
m_sendBuffer[m_sendBufferLen] = v; m_sendBuffer[m_sendBufferLen] = v;
@ -106,6 +108,41 @@ void MeterBusClient::REQ_UD2() {
aSB((unsigned int)0); // Signatur aSB((unsigned int)0); // Signatur
// Uptime
// DIF
aSB((unsigned char)0x01);
// VIF
aSB((unsigned char)0x24);
aSB(m_uptime->getSeconds());
// DIF
aSB((unsigned char)0x01);
// VIF
aSB((unsigned char)0x25);
aSB(m_uptime->getMinutes());
// DIF
aSB((unsigned char)0x01);
// VIF
aSB((unsigned char)0x26);
aSB(m_uptime->getHours());
// DIF
aSB((unsigned char)0x02);
// VIF
aSB((unsigned char)0x27);
aSB((unsigned int)m_uptime->getDays());
// Measurement Value
// DIF
aSB((uint8_t)0x02);
aSB((uint8_t)0x7f);
uint16_t measVal = adcGet();
aSB(measVal);
//aSB((uint16_t) 0xaffe);
aSB(calcSendChecksum()); aSB(calcSendChecksum());
aSB((unsigned char)0x16); aSB((unsigned char)0x16);

View File

@ -8,6 +8,7 @@
#include <isr_compat.h> #include <isr_compat.h>
#include <stdint.h> #include <stdint.h>
#include "time.h"
volatile unsigned long timestamp; volatile unsigned long timestamp;
@ -47,3 +48,4 @@ void timeInit() {
unsigned long millis() { unsigned long millis() {
return timestamp; return timestamp;
} }

View File

@ -14,4 +14,6 @@ void timeInit();
unsigned long millis(); unsigned long millis();
#endif /* TIME_H_ */ #endif /* TIME_H_ */

View File

@ -27,16 +27,16 @@ static inline void disableDataRegisterEmptyInterrupt() {
void uartInit() { void uartInit() {
UCA0CTL1 |= UCSWRST; UCA0CTL1 |= UCSWRST;
P1SEL = BIT1 + BIT2; P1SEL = BIT1 + BIT2; // select secondary function TX, RX
P1SEL2 = BIT1 + BIT2; P1SEL2 = BIT1 + BIT2; // dti
UCA0CTL0 |= UCPEN | UCPAR; // even parity UCA0CTL0 |= UCPEN | UCPAR; // even parity
UCA0CTL1 |= UCSSEL0; // ACLK UCA0CTL1 |= UCSSEL0; // ACLK
UCA0BR0 = 13; UCA0BR0 = 13; // divider for 2400@32768
UCA0BR1 = 0; UCA0BR1 = 0;
UCA0MCTL = UCBRS1 | UCBRS2; UCA0MCTL = UCBRS1 | UCBRS2; // modulator for 2400@32768
UCA0CTL1 &= ~UCSWRST; UCA0CTL1 &= ~UCSWRST;

38
src/uptime.cpp Normal file
View File

@ -0,0 +1,38 @@
#include "uptime.h"
#include "time.h"
Uptime::Uptime() : m_seconds(0), m_minutes(0), m_hours(0), m_days(0) {
}
void Uptime::exec() {
static unsigned long lastMillis = 0;
unsigned long currentMillis = millis();
if (currentMillis >= (lastMillis + 1000)) {
m_seconds += ((currentMillis - lastMillis) / 1000);
if (m_seconds >= 60) {
m_seconds -= 60;
m_minutes++;
if (m_minutes >= 60) {
m_minutes -= 60;
m_hours++;
if (m_hours >= 24) {
m_hours -= 24;
m_days++;
}
}
}
lastMillis = currentMillis;
}
}

27
src/uptime.h Normal file
View File

@ -0,0 +1,27 @@
#ifndef UPTIME_H_
#define UPTIME_H_
#include <stdint.h>
class Uptime;
class Uptime {
public:
Uptime();
void exec();
uint8_t getSeconds() { return m_seconds; };
uint8_t getMinutes() { return m_minutes; };
uint8_t getHours() { return m_hours; };
uint16_t getDays() { return m_days; };
private:
uint8_t m_seconds;
uint8_t m_minutes;
uint8_t m_hours;
uint16_t m_days;
};
#endif /* TEST_H_ */