so far
This commit is contained in:
parent
3b0e8e4dec
commit
04c35a0184
337
src/main.c
337
src/main.c
@ -6,11 +6,38 @@
|
|||||||
#include "uartdrv.h"
|
#include "uartdrv.h"
|
||||||
|
|
||||||
|
|
||||||
|
#define START_GAP_MIN 1500
|
||||||
|
#define ONE_WIDTH_MIN 170
|
||||||
|
#define ONE_WIDTH_MAX 240
|
||||||
|
#define ZERO_WIDTH_MIN 70
|
||||||
|
#define ZERO_WIDTH_MAX 140
|
||||||
|
|
||||||
|
|
||||||
|
typedef struct receivedData_s {
|
||||||
|
uint8_t minuteDigit0;
|
||||||
|
uint8_t minuteDigit1;
|
||||||
|
uint8_t minuteOneCnt;
|
||||||
|
uint8_t hourDigit0;
|
||||||
|
uint8_t hourDigit1;
|
||||||
|
uint8_t hourOneCnt;
|
||||||
|
uint8_t dayDigit0;
|
||||||
|
uint8_t dayDigit1;
|
||||||
|
uint8_t weekdayDigit0;
|
||||||
|
uint8_t monthDigit0;
|
||||||
|
uint8_t monthDigit1;
|
||||||
|
uint8_t yearDigit0;
|
||||||
|
uint8_t yearDigit1;
|
||||||
|
uint8_t dateOneCnt;
|
||||||
|
} receivedData_t;
|
||||||
|
|
||||||
typedef struct clock_s {
|
typedef struct clock_s {
|
||||||
uint8_t hour;
|
uint8_t hour;
|
||||||
uint8_t minute;
|
uint8_t minute;
|
||||||
uint8_t second;
|
uint8_t second;
|
||||||
|
uint8_t day;
|
||||||
|
uint8_t weekday;
|
||||||
|
uint8_t month;
|
||||||
|
uint8_t year;
|
||||||
} clock_t;
|
} clock_t;
|
||||||
|
|
||||||
volatile clock_t clock;
|
volatile clock_t clock;
|
||||||
@ -75,8 +102,11 @@ int main() {
|
|||||||
printf("Hello world!\n");
|
printf("Hello world!\n");
|
||||||
|
|
||||||
|
|
||||||
uint8_t start = 0;
|
uint8_t valid = 0;
|
||||||
uint8_t bit = 0;
|
uint8_t bit = 0;
|
||||||
|
uint8_t state = 0;
|
||||||
|
|
||||||
|
receivedData_t rd;
|
||||||
|
|
||||||
while (1) {
|
while (1) {
|
||||||
if (tick != 0) {
|
if (tick != 0) {
|
||||||
@ -85,25 +115,314 @@ int main() {
|
|||||||
uint16_t pulse = (((uint32_t) captValue) * 1000) / 15625;
|
uint16_t pulse = (((uint32_t) captValue) * 1000) / 15625;
|
||||||
uint16_t gap = (((uint32_t) gapValue) * 1000) / 15625;
|
uint16_t gap = (((uint32_t) gapValue) * 1000) / 15625;
|
||||||
|
|
||||||
if (gap > 1500) {
|
if (gap > START_GAP_MIN) {
|
||||||
start = 1;
|
valid = 1;
|
||||||
|
state = 0;
|
||||||
clock.second = 0;
|
clock.second = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (pulse > 70 && pulse < 130) {
|
if (pulse > ZERO_WIDTH_MIN && pulse < ZERO_WIDTH_MAX) {
|
||||||
bit = 0;
|
bit = 0;
|
||||||
} else if (pulse > 170 && pulse < 230) {
|
} else if (pulse > ONE_WIDTH_MIN && pulse < ONE_WIDTH_MAX) {
|
||||||
bit = 1;
|
bit = 1;
|
||||||
} else {
|
} else {
|
||||||
bit = 2;
|
valid = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
printf("%02d %02d %02d %u %u %u %u \n", clock.hour, clock.minute, clock.second, start, bit, pulse, gap);
|
|
||||||
|
|
||||||
|
if (valid > 0) {
|
||||||
|
switch (state) {
|
||||||
|
case 0:
|
||||||
|
if (bit != 0)
|
||||||
|
valid = 0;
|
||||||
|
break;
|
||||||
|
case 1:
|
||||||
|
break;
|
||||||
|
case 2:
|
||||||
|
break;
|
||||||
|
case 3:
|
||||||
|
break;
|
||||||
|
case 4:
|
||||||
|
break;
|
||||||
|
case 5:
|
||||||
|
break;
|
||||||
|
case 6:
|
||||||
|
break;
|
||||||
|
case 7:
|
||||||
|
break;
|
||||||
|
case 8:
|
||||||
|
break;
|
||||||
|
case 9:
|
||||||
|
break;
|
||||||
|
case 10:
|
||||||
|
break;
|
||||||
|
case 11:
|
||||||
|
break;
|
||||||
|
case 12:
|
||||||
|
break;
|
||||||
|
case 13:
|
||||||
|
break;
|
||||||
|
case 14:
|
||||||
|
break;
|
||||||
|
case 15:
|
||||||
|
break;
|
||||||
|
case 16:
|
||||||
|
break;
|
||||||
|
case 17:
|
||||||
|
break;
|
||||||
|
case 18:
|
||||||
|
break;
|
||||||
|
case 19:
|
||||||
|
break;
|
||||||
|
case 20:
|
||||||
|
if (bit != 1)
|
||||||
|
valid = 0;
|
||||||
|
break;
|
||||||
|
case 21:
|
||||||
|
rd.minuteOneCnt = 0;
|
||||||
|
rd.minuteDigit0 = 0;
|
||||||
|
rd.minuteDigit0 |= bit;
|
||||||
|
if (bit == 1)
|
||||||
|
rd.minuteOneCnt++;
|
||||||
|
break;
|
||||||
|
case 22:
|
||||||
|
rd.minuteDigit0 |= (bit << 1);
|
||||||
|
if (bit == 1)
|
||||||
|
rd.minuteOneCnt++;
|
||||||
|
break;
|
||||||
|
case 23:
|
||||||
|
rd.minuteDigit0 |= (bit << 2);
|
||||||
|
if (bit == 1)
|
||||||
|
rd.minuteOneCnt++;
|
||||||
|
break;
|
||||||
|
case 24:
|
||||||
|
rd.minuteDigit0 |= (bit << 3);
|
||||||
|
if (bit == 1)
|
||||||
|
rd.minuteOneCnt++;
|
||||||
|
break;
|
||||||
|
case 25:
|
||||||
|
rd.minuteDigit1 = 0;
|
||||||
|
rd.minuteDigit1 |= bit;
|
||||||
|
if (bit == 1)
|
||||||
|
rd.minuteOneCnt++;
|
||||||
|
break;
|
||||||
|
case 26:
|
||||||
|
rd.minuteDigit1 |= (bit << 1);
|
||||||
|
if (bit == 1)
|
||||||
|
rd.minuteOneCnt++;
|
||||||
|
break;
|
||||||
|
case 27:
|
||||||
|
rd.minuteDigit1 |= (bit << 2);
|
||||||
|
if (bit == 1)
|
||||||
|
rd.minuteOneCnt++;
|
||||||
|
break;
|
||||||
|
case 28:
|
||||||
|
rd.minuteOneCnt += bit;
|
||||||
|
if (rd.minuteOneCnt % 2 != 0) {
|
||||||
|
printf("MINUTE INVALID\n");
|
||||||
|
valid = 0;
|
||||||
|
} else {
|
||||||
|
printf("MINUTE %u %u\n", rd.minuteDigit0, rd.minuteDigit1);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case 29:
|
||||||
|
rd.hourOneCnt = 0;
|
||||||
|
rd.hourDigit0 = 0;
|
||||||
|
rd.hourDigit0 |= bit;
|
||||||
|
if (bit == 1)
|
||||||
|
rd.hourOneCnt++;
|
||||||
|
break;
|
||||||
|
case 30:
|
||||||
|
rd.hourDigit0 |= (bit << 1);
|
||||||
|
if (bit == 1)
|
||||||
|
rd.hourOneCnt++;
|
||||||
|
break;
|
||||||
|
case 31:
|
||||||
|
rd.hourDigit0 |= (bit << 2);
|
||||||
|
if (bit == 1)
|
||||||
|
rd.hourOneCnt++;
|
||||||
|
break;
|
||||||
|
case 32:
|
||||||
|
rd.hourDigit0 |= (bit << 3);
|
||||||
|
if (bit == 1)
|
||||||
|
rd.hourOneCnt++;
|
||||||
|
break;
|
||||||
|
case 33:
|
||||||
|
rd.hourDigit1 = 0;
|
||||||
|
rd.hourDigit1 |= bit;
|
||||||
|
if (bit == 1)
|
||||||
|
rd.hourOneCnt++;
|
||||||
|
break;
|
||||||
|
case 34:
|
||||||
|
rd.hourDigit1 |= (bit << 1);
|
||||||
|
if (bit == 1)
|
||||||
|
rd.hourOneCnt++;
|
||||||
|
break;
|
||||||
|
case 35:
|
||||||
|
rd.hourOneCnt += bit;
|
||||||
|
if (rd.hourOneCnt % 2 != 0) {
|
||||||
|
printf("HOUR INVALID\n");
|
||||||
|
valid = 0;
|
||||||
|
} else {
|
||||||
|
printf("HOUR %u %u\n", rd.hourDigit0, rd.hourDigit1);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case 36:
|
||||||
|
rd.dateOneCnt = 0;
|
||||||
|
rd.dayDigit0 = 0;
|
||||||
|
rd.dayDigit0 |= bit;
|
||||||
|
if (bit == 1)
|
||||||
|
rd.dateOneCnt++;
|
||||||
|
break;
|
||||||
|
case 37:
|
||||||
|
rd.dayDigit0 |= (bit << 1);
|
||||||
|
if (bit == 1)
|
||||||
|
rd.dateOneCnt++;
|
||||||
|
break;
|
||||||
|
case 38:
|
||||||
|
rd.dayDigit0 |= (bit << 2);
|
||||||
|
if (bit == 1)
|
||||||
|
rd.dateOneCnt++;
|
||||||
|
break;
|
||||||
|
case 39:
|
||||||
|
rd.dayDigit0 |= (bit << 3);
|
||||||
|
if (bit == 1)
|
||||||
|
rd.dateOneCnt++;
|
||||||
|
break;
|
||||||
|
case 40:
|
||||||
|
rd.dayDigit1 = 0;
|
||||||
|
rd.dayDigit1 |= bit;
|
||||||
|
if (bit == 1)
|
||||||
|
rd.dateOneCnt++;
|
||||||
|
break;
|
||||||
|
case 41:
|
||||||
|
rd.dayDigit1 |= (bit << 1);
|
||||||
|
if (bit == 1)
|
||||||
|
rd.dateOneCnt++;
|
||||||
|
break;
|
||||||
|
case 42:
|
||||||
|
rd.weekdayDigit0 = 0;
|
||||||
|
rd.weekdayDigit0 |= bit;
|
||||||
|
if (bit == 1)
|
||||||
|
rd.dateOneCnt++;
|
||||||
|
break;
|
||||||
|
case 43:
|
||||||
|
rd.weekdayDigit0 |= (bit << 1);
|
||||||
|
if (bit == 1)
|
||||||
|
rd.dateOneCnt++;
|
||||||
|
break;
|
||||||
|
case 44:
|
||||||
|
rd.weekdayDigit0 |= (bit << 2);
|
||||||
|
if (bit == 1)
|
||||||
|
rd.dateOneCnt++;
|
||||||
|
break;
|
||||||
|
case 45:
|
||||||
|
rd.monthDigit0 = 0;
|
||||||
|
rd.monthDigit0 |= bit;
|
||||||
|
if (bit == 1)
|
||||||
|
rd.dateOneCnt++;
|
||||||
|
break;
|
||||||
|
case 46:
|
||||||
|
rd.monthDigit0 |= (bit << 1);
|
||||||
|
if (bit == 1)
|
||||||
|
rd.dateOneCnt++;
|
||||||
|
break;
|
||||||
|
case 47:
|
||||||
|
rd.monthDigit0 |= (bit << 2);
|
||||||
|
if (bit == 1)
|
||||||
|
rd.dateOneCnt++;
|
||||||
|
break;
|
||||||
|
case 48:
|
||||||
|
rd.monthDigit0 |= (bit << 3);
|
||||||
|
if (bit == 1)
|
||||||
|
rd.dateOneCnt++;
|
||||||
|
break;
|
||||||
|
case 49:
|
||||||
|
rd.monthDigit1 = 0;
|
||||||
|
rd.monthDigit1 |= bit;
|
||||||
|
if (bit == 1)
|
||||||
|
rd.dateOneCnt++;
|
||||||
|
break;
|
||||||
|
case 50:
|
||||||
|
rd.yearDigit0 = 0;
|
||||||
|
rd.yearDigit0 |= bit;
|
||||||
|
if (bit == 1)
|
||||||
|
rd.dateOneCnt++;
|
||||||
|
break;
|
||||||
|
case 51:
|
||||||
|
rd.yearDigit0 |= (bit << 1);
|
||||||
|
if (bit == 1)
|
||||||
|
rd.dateOneCnt++;
|
||||||
|
break;
|
||||||
|
case 52:
|
||||||
|
rd.yearDigit0 |= (bit << 2);
|
||||||
|
if (bit == 1)
|
||||||
|
rd.dateOneCnt++;
|
||||||
|
break;
|
||||||
|
case 53:
|
||||||
|
rd.yearDigit0 |= (bit << 3);
|
||||||
|
if (bit == 1)
|
||||||
|
rd.dateOneCnt++;
|
||||||
|
break;
|
||||||
|
case 54:
|
||||||
|
rd.yearDigit1 = 0;
|
||||||
|
rd.yearDigit1 |= bit;
|
||||||
|
if (bit == 1)
|
||||||
|
rd.dateOneCnt++;
|
||||||
|
break;
|
||||||
|
case 55:
|
||||||
|
rd.yearDigit1 |= (bit << 1);
|
||||||
|
if (bit == 1)
|
||||||
|
rd.dateOneCnt++;
|
||||||
|
break;
|
||||||
|
case 56:
|
||||||
|
rd.yearDigit1 |= (bit << 2);
|
||||||
|
if (bit == 1)
|
||||||
|
rd.dateOneCnt++;
|
||||||
|
break;
|
||||||
|
case 57:
|
||||||
|
rd.yearDigit1 |= (bit << 3);
|
||||||
|
if (bit == 1)
|
||||||
|
rd.dateOneCnt++;
|
||||||
|
break;
|
||||||
|
case 58:
|
||||||
|
rd.dateOneCnt += bit;
|
||||||
|
if (rd.dateOneCnt % 2 != 0) {
|
||||||
|
printf("DATE INVALID\n");
|
||||||
|
valid = 0;
|
||||||
|
} else {
|
||||||
|
printf("DAY %u %u\n", rd.dayDigit0, rd.dayDigit1);
|
||||||
|
printf("WEEKDAY %u\n", rd.weekdayDigit0);
|
||||||
|
printf("MONTH %u %u\n", rd.monthDigit0, rd.monthDigit1);
|
||||||
|
printf("YEAR %u %u\n", rd.yearDigit0, rd.yearDigit1);
|
||||||
|
|
||||||
|
clock.minute = rd.minuteDigit0 + rd.minuteDigit1 * 10;
|
||||||
|
clock.hour = rd.hourDigit0 + rd.hourDigit1 * 10;
|
||||||
|
clock.day = rd.dayDigit0 + rd.dayDigit1 * 10;
|
||||||
|
clock.weekday = rd.weekdayDigit0;
|
||||||
|
clock.month = rd.monthDigit0 + rd.monthDigit1 * 10;
|
||||||
|
clock.year = rd.yearDigit0 + rd.yearDigit1 * 10;
|
||||||
|
|
||||||
start = 0;
|
valid = 2;
|
||||||
//printf("tick\n");
|
}
|
||||||
|
break;
|
||||||
|
case 59:
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
valid = 0;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
printf("VALID %02d:%02d:%02d %02u.%02u.%02u %u %u %u %u %u %u \n",
|
||||||
|
clock.hour, clock.minute, clock.second,
|
||||||
|
clock.day, clock.month, clock.year, clock.weekday,
|
||||||
|
valid, state, bit, pulse, gap);
|
||||||
|
|
||||||
|
state++;
|
||||||
|
} else {
|
||||||
|
|
||||||
|
printf("INVALID %u %u %u \n", bit, pulse, gap);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -3,10 +3,6 @@
|
|||||||
#include <avr/interrupt.h>
|
#include <avr/interrupt.h>
|
||||||
|
|
||||||
#include "uartdrv.h"
|
#include "uartdrv.h"
|
||||||
#include "debug.h"
|
|
||||||
|
|
||||||
|
|
||||||
volatile uartdrvCmdBuf_t uartdrvCmdBuf;
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@ -18,24 +14,17 @@ void uartdrvInit() {
|
|||||||
DDRD |= (1 << PD1);
|
DDRD |= (1 << PD1);
|
||||||
|
|
||||||
// transmitter enable
|
// transmitter enable
|
||||||
UCSRB = (1 << TXEN) | (1 << RXEN) | (1 << RXCIE);
|
UCSRB = (1 << TXEN);
|
||||||
// 8 data bit, no parity, 1 stop bit
|
// 8 data bit, no parity, 1 stop bit
|
||||||
UCSRC = (1 << UCSZ1) | (1 << UCSZ0);
|
UCSRC = (1 << UCSZ1) | (1 << UCSZ0);
|
||||||
// 19200 Baud @ 16MHz
|
// 115200 Baud @ 16MHz
|
||||||
UBRRL = 51;
|
UBRRL = 8;
|
||||||
UBRRH = 0;
|
UBRRH = 0;
|
||||||
FILE *mystdout = fdevopen(uartdrvPutchar, NULL);
|
FILE *mystdout = fdevopen(uartdrvPutchar, NULL);
|
||||||
stdout = mystdout;
|
stdout = mystdout;
|
||||||
|
|
||||||
uartdrvCmdBuf.idx = 0;
|
|
||||||
uartdrvCmdBuf.cmd = 0;
|
|
||||||
uartdrvCmdBuf.cmdStart = 0;
|
|
||||||
uartdrvCmdBuf.cmdDelay = 0;
|
|
||||||
uartdrvCmdBuf.cmdReady = 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void uartdrvWrite(uint8_t o) {
|
void uartdrvWrite(uint8_t o) {
|
||||||
loop_until_bit_is_clear(PIND, PD2);
|
|
||||||
loop_until_bit_is_set(UCSRA, UDRE);
|
loop_until_bit_is_set(UCSRA, UDRE);
|
||||||
UDR = o;
|
UDR = o;
|
||||||
}
|
}
|
||||||
@ -48,46 +37,5 @@ int uartdrvPutchar(char c, FILE *stream) {
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
void uartdrvCmdCycle() {
|
|
||||||
if (uartdrvCmdBuf.cmdStart == 1) {
|
|
||||||
uartdrvCmdBuf.cmdDelay++;
|
|
||||||
if (uartdrvCmdBuf.cmdDelay > UART_CMD_CYCLES) {
|
|
||||||
uartdrvCmdBuf.idx = 0;
|
|
||||||
uartdrvCmdBuf.cmdStart = 0;
|
|
||||||
uartdrvCmdBuf.cmdDelay= 0;
|
|
||||||
// myPrintf("clear invalid cmd\n");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void uartdrvCmdReceived() {
|
|
||||||
uartdrvWrite(0x7f);
|
|
||||||
uartdrvWrite(uartdrvCmdBuf.cmd);
|
|
||||||
uartdrvWrite(0);
|
|
||||||
uartdrvWrite(0);
|
|
||||||
uartdrvWrite(0);
|
|
||||||
}
|
|
||||||
|
|
||||||
ISR(USART_RXC_vect) {
|
|
||||||
uint8_t c = UDR;
|
|
||||||
if (uartdrvCmdBuf.cmdReady != 1) {
|
|
||||||
if (uartdrvCmdBuf.idx == 0) {
|
|
||||||
uartdrvCmdBuf.cmdStart = 1;
|
|
||||||
uartdrvCmdBuf.cmd = c;
|
|
||||||
uartdrvCmdBuf.idx++;
|
|
||||||
} else if (uartdrvCmdBuf.idx >= 1 && uartdrvCmdBuf.idx <= UART_CMD_BUF_SIZE) {
|
|
||||||
uartdrvCmdBuf.buf[uartdrvCmdBuf.idx - 1] = c;
|
|
||||||
uartdrvCmdBuf.idx++;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (uartdrvCmdBuf.idx == (UART_CMD_BUF_SIZE + 1)) {
|
|
||||||
|
|
||||||
uartdrvCmdBuf.idx = 0;
|
|
||||||
uartdrvCmdBuf.cmdStart = 0;
|
|
||||||
uartdrvCmdBuf.cmdDelay = 0;
|
|
||||||
uartdrvCmdBuf.cmdReady = 1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user