mirror of
https://github.com/halleysfifthinc/Toyota-AVC-LAN
synced 2025-06-07 16:06:12 +00:00
Update signal measuring and apply new measurements to bit-timings
This commit is contained in:
parent
bcd07d0ffb
commit
da6a3371fd
@ -8,7 +8,9 @@
|
|||||||
"generator": "Unix Makefiles",
|
"generator": "Unix Makefiles",
|
||||||
"binaryDir": "${sourceDir}/build",
|
"binaryDir": "${sourceDir}/build",
|
||||||
"cacheVariables": {
|
"cacheVariables": {
|
||||||
"CMAKE_BUILD_TYPE": "Debug"
|
"CMAKE_BUILD_TYPE": "Debug",
|
||||||
|
"FREQSEL": "20MHz",
|
||||||
|
"TCB_CLKSEL": "TCB_CLKSEL_CLKDIV1_gc"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@ -17,8 +19,11 @@
|
|||||||
"description": "Configure with RelWithDebInfo build settings",
|
"description": "Configure with RelWithDebInfo build settings",
|
||||||
"generator": "Unix Makefiles",
|
"generator": "Unix Makefiles",
|
||||||
"binaryDir": "${sourceDir}/build",
|
"binaryDir": "${sourceDir}/build",
|
||||||
|
"inherits": "default",
|
||||||
"cacheVariables": {
|
"cacheVariables": {
|
||||||
"CMAKE_BUILD_TYPE": "RelWithDebInfo"
|
"CMAKE_BUILD_TYPE": "RelWithDebInfo",
|
||||||
|
"FREQSEL": "20MHz",
|
||||||
|
"TCB_CLKSEL": "TCB_CLKSEL_CLKDIV1_gc"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
|
131
src/avclandrv.c
131
src/avclandrv.c
@ -271,7 +271,13 @@ void AVCLAN_init() {
|
|||||||
EVSYS.ASYNCUSER0 = EVSYS_ASYNCUSER0_ASYNCCH0_gc; // USER0 is TCB0
|
EVSYS.ASYNCUSER0 = EVSYS_ASYNCUSER0_ASYNCCH0_gc; // USER0 is TCB0
|
||||||
|
|
||||||
// TCB0 for read bit timing
|
// TCB0 for read bit timing
|
||||||
TCB0.CTRLB = TCB_CNTMODE_PW_gc;
|
#ifdef SOFTWARE_DEBUG
|
||||||
|
#define TCB_CNTMODE TCB_CNTMODE_FRQPW_gc
|
||||||
|
#else
|
||||||
|
#define TCB_CNTMODE TCB_CNTMODE_PW_gc
|
||||||
|
#endif
|
||||||
|
|
||||||
|
TCB0.CTRLB = TCB_CNTMODE;
|
||||||
TCB0.INTCTRL = TCB_CAPT_bm;
|
TCB0.INTCTRL = TCB_CAPT_bm;
|
||||||
TCB0.EVCTRL = TCB_CAPTEI_bm;
|
TCB0.EVCTRL = TCB_CAPTEI_bm;
|
||||||
TCB0.CTRLA = TCB_CLKSEL | TCB_ENABLE_bm;
|
TCB0.CTRLA = TCB_CLKSEL | TCB_ENABLE_bm;
|
||||||
@ -324,7 +330,7 @@ void AVCLAN_sendbit_ACK() {
|
|||||||
while (INPUT_IS_CLEAR) {
|
while (INPUT_IS_CLEAR) {
|
||||||
// Wait for approx the length of a bit; any longer and something has clearly
|
// Wait for approx the length of a bit; any longer and something has clearly
|
||||||
// gone wrong
|
// gone wrong
|
||||||
if (TCB1.CNT >= AVCLAN_BIT_LENGTH)
|
if (TCB1.CNT >= AVCLAN_BIT_LENGTH_MAX)
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -404,9 +410,22 @@ uint8_t AVCLAN_sendbyte(const uint8_t *byte) {
|
|||||||
#define READING_NBITS GPIOR2
|
#define READING_NBITS GPIOR2
|
||||||
#define READING_PARITY GPIOR3
|
#define READING_PARITY GPIOR3
|
||||||
|
|
||||||
|
#ifdef SOFTWARE_DEBUG
|
||||||
|
uint8_t pulse_count = 0;
|
||||||
|
uint16_t period = 0;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
uint16_t pulsewidth = 0;
|
||||||
|
|
||||||
ISR(TCB0_INT_vect) {
|
ISR(TCB0_INT_vect) {
|
||||||
|
#ifdef SOFTWARE_DEBUG
|
||||||
|
pulse_count++;
|
||||||
|
period = TCB0.CNT;
|
||||||
|
#endif
|
||||||
|
|
||||||
// If input was set for less than 26 us (a generous half period), bit was a 1
|
// If input was set for less than 26 us (a generous half period), bit was a 1
|
||||||
if (TCB0.CCMP < (uint16_t)AVCLAN_READBIT_THRESHOLD) {
|
pulsewidth = TCB0.CCMP;
|
||||||
|
if (pulsewidth < (uint16_t)AVCLAN_READBIT_THRESHOLD) {
|
||||||
READING_BYTE++;
|
READING_BYTE++;
|
||||||
READING_PARITY++;
|
READING_PARITY++;
|
||||||
}
|
}
|
||||||
@ -431,8 +450,8 @@ uint8_t AVCLAN_readbitsi(uint8_t *bits, uint8_t len) {
|
|||||||
|
|
||||||
TCB1.CNT = 0;
|
TCB1.CNT = 0;
|
||||||
while (READING_NBITS != 0) {
|
while (READING_NBITS != 0) {
|
||||||
// Duration of `len` bits + 10%
|
// 200% the duration of `len` bits
|
||||||
if (TCB1.CNT > (((uint16_t)AVCLAN_BIT_LENGTH * 11 * len) / 10)) {
|
if (TCB1.CNT > ((uint16_t)AVCLAN_BIT_LENGTH_MAX * 2 * len)) {
|
||||||
READING_BYTE = 0;
|
READING_BYTE = 0;
|
||||||
READING_PARITY = 0;
|
READING_PARITY = 0;
|
||||||
break; // Should have finished by now; something's wrong
|
break; // Should have finished by now; something's wrong
|
||||||
@ -469,8 +488,8 @@ uint8_t AVCLAN_readbyte(uint8_t *byte) {
|
|||||||
|
|
||||||
TCB1.CNT = 0;
|
TCB1.CNT = 0;
|
||||||
while (READING_NBITS != 0) {
|
while (READING_NBITS != 0) {
|
||||||
// Duration of byte + 10%
|
// 200% the length of a byte
|
||||||
if (TCB1.CNT > (((uint16_t)AVCLAN_BIT_LENGTH * 11 * 8) / 10)) {
|
if (TCB1.CNT > ((uint16_t)AVCLAN_BIT_LENGTH_MAX * 2 * 8)) {
|
||||||
READING_BYTE = 0;
|
READING_BYTE = 0;
|
||||||
READING_PARITY = 0;
|
READING_PARITY = 0;
|
||||||
break; // Should have finished by now; something's wrong
|
break; // Should have finished by now; something's wrong
|
||||||
@ -494,7 +513,7 @@ uint8_t AVCLAN_readbit_ACK() {
|
|||||||
while (1) {
|
while (1) {
|
||||||
if (INPUT_IS_SET && (TCB1.CNT > AVCLAN_READBIT_THRESHOLD))
|
if (INPUT_IS_SET && (TCB1.CNT > AVCLAN_READBIT_THRESHOLD))
|
||||||
break; // ACK
|
break; // ACK
|
||||||
if (TCB1.CNT > AVCLAN_BIT_LENGTH)
|
if (TCB1.CNT > AVCLAN_BIT_LENGTH_MAX)
|
||||||
return 1; // NAK
|
return 1; // NAK
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -696,7 +715,7 @@ uint8_t AVCLAN_sendframe(const AVCLAN_frame_t *frame) {
|
|||||||
do {
|
do {
|
||||||
while (INPUT_IS_CLEAR) {
|
while (INPUT_IS_CLEAR) {
|
||||||
// Wait for 120% of a bit length
|
// Wait for 120% of a bit length
|
||||||
if (TCB1.CNT >= (uint16_t)(AVCLAN_BIT_LENGTH * 12 / 10))
|
if (TCB1.CNT >= (uint16_t)(AVCLAN_BIT_LENGTH_MAX * 12 / 10))
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
if (TCB1.CNT > 864)
|
if (TCB1.CNT > 864)
|
||||||
@ -1008,94 +1027,40 @@ void AVCLAN_printframe(const AVCLAN_frame_t *frame) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
#ifdef SOFTWARE_DEBUG
|
#ifdef SOFTWARE_DEBUG
|
||||||
uint16_t temp_b[100];
|
uint16_t pulses[100];
|
||||||
|
uint16_t periods[100];
|
||||||
|
|
||||||
void AVCLan_Measure() {
|
void AVCLan_Measure() {
|
||||||
STOPEvent;
|
STOPEvent;
|
||||||
|
|
||||||
// uint16_t tmp, tmp1, tmp2, bit0, bit1;
|
uint8_t tmp = 0;
|
||||||
uint8_t n = 0;
|
|
||||||
|
|
||||||
cbi(TCCR1B, CS12);
|
RS232_Print(
|
||||||
TCCR1B = _BV(CS10);
|
"Timing config: F_CPU=" STR(F_CPU) ", TCB_CLKSEL=" STR(TCB_CLKSEL) "\n");
|
||||||
TCNT1 = 0;
|
RS232_Print("Sampling bit (pulse-width and period) timing...\n");
|
||||||
|
|
||||||
char str[5];
|
for (uint8_t n = 0; n < 100; n++) {
|
||||||
|
while (pulse_count == tmp) {}
|
||||||
while (n < 100) {
|
pulses[n] = pulsewidth;
|
||||||
temp_b[n] = TCNT1;
|
periods[n] = period;
|
||||||
while (INPUT_IS_CLEAR) {}
|
tmp = pulse_count;
|
||||||
temp_b[n + 1] = TCNT1;
|
|
||||||
while (INPUT_IS_SET) {}
|
|
||||||
temp_b[n + 2] = TCNT1;
|
|
||||||
while (INPUT_IS_CLEAR) {}
|
|
||||||
temp_b[n + 3] = TCNT1;
|
|
||||||
while (INPUT_IS_SET) {}
|
|
||||||
temp_b[n + 4] = TCNT1;
|
|
||||||
while (INPUT_IS_CLEAR) {}
|
|
||||||
temp_b[n + 5] = TCNT1;
|
|
||||||
while (INPUT_IS_SET) {}
|
|
||||||
temp_b[n + 6] = TCNT1;
|
|
||||||
while (INPUT_IS_CLEAR) {}
|
|
||||||
temp_b[n + 7] = TCNT1;
|
|
||||||
while (INPUT_IS_SET) {}
|
|
||||||
temp_b[n + 8] = TCNT1;
|
|
||||||
while (INPUT_IS_CLEAR) {}
|
|
||||||
temp_b[n + 9] = TCNT1;
|
|
||||||
while (INPUT_IS_SET) {}
|
|
||||||
//
|
|
||||||
// while (INPUT_IS_CLEAR) {}
|
|
||||||
//
|
|
||||||
// tmp1 = TCNT1;
|
|
||||||
//
|
|
||||||
// while (INPUT_IS_SET) {}
|
|
||||||
//
|
|
||||||
// tmp2 = TCNT1;
|
|
||||||
//
|
|
||||||
// bit0 = tmp1-tmp;
|
|
||||||
// bit1 = tmp2-tmp1;
|
|
||||||
//
|
|
||||||
// RS232_Print("1,");
|
|
||||||
// RS232_PrintDec(bit1);
|
|
||||||
// RS232_Print("\n");
|
|
||||||
//
|
|
||||||
// RS232_Print("0,");
|
|
||||||
// RS232_PrintDec(bit0);
|
|
||||||
// RS232_Print("\n");
|
|
||||||
n += 10;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
RS232_Print("Pulses:\n");
|
||||||
for (uint8_t i = 0; i < 100; i++) {
|
for (uint8_t i = 0; i < 100; i++) {
|
||||||
itoa(temp_b[i], str);
|
RS232_PrintHex8(*(((uint8_t *)&pulses[i]) + 1));
|
||||||
if (i & 1) {
|
RS232_PrintHex8(*(((uint8_t *)&pulses[i]) + 0));
|
||||||
RS232_Print("High,");
|
RS232_Print("\n");
|
||||||
} else {
|
|
||||||
RS232_Print("Low,");
|
|
||||||
}
|
}
|
||||||
RS232_Print(str);
|
|
||||||
|
RS232_Print("Periods:\n");
|
||||||
|
for (uint8_t i = 0; i < 100; i++) {
|
||||||
|
RS232_PrintHex8(*(((uint8_t *)&periods[i]) + 1));
|
||||||
|
RS232_PrintHex8(*(((uint8_t *)&periods[i]) + 0));
|
||||||
RS232_Print("\n");
|
RS232_Print("\n");
|
||||||
}
|
}
|
||||||
RS232_Print("\nDone.\n");
|
RS232_Print("\nDone.\n");
|
||||||
|
|
||||||
cbi(TCCR1B, CS10);
|
|
||||||
TCCR1B = _BV(CS12);
|
|
||||||
|
|
||||||
STARTEvent;
|
STARTEvent;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef HARDWARE_DEBUG
|
|
||||||
void SetHighLow() {
|
|
||||||
AVC_OUT_EN();
|
|
||||||
sbi(TCCR1B, CS10);
|
|
||||||
uint16_t n = 60000;
|
|
||||||
TCNT1 = 0;
|
|
||||||
AVC_SET_LOGICAL_1();
|
|
||||||
while (TCNT1 < n) {}
|
|
||||||
TCNT1 = 0;
|
|
||||||
AVC_SET_LOGICAL_0();
|
|
||||||
while (TCNT1 < n) {}
|
|
||||||
cbi(TCCR1B, CS10);
|
|
||||||
AVC_OUT_DIS();
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
15
src/timing.h
15
src/timing.h
@ -49,17 +49,18 @@
|
|||||||
#error "Not implemented"
|
#error "Not implemented"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#define AVCLAN_STARTBIT_LOGIC_0 (166e3 / TCB_TICK)
|
// Measured at ±0.02 μs @ F_CPU=20MHz, TCB_CLKSEL=TCB_CLKSEL_CLKDIV1_gc
|
||||||
#define AVCLAN_STARTBIT_LOGIC_1 (19e3 / TCB_TICK)
|
#define AVCLAN_STARTBIT_LOGIC_0 (169e3 / TCB_TICK)
|
||||||
|
#define AVCLAN_STARTBIT_LOGIC_1 (20.6e3 / TCB_TICK)
|
||||||
|
|
||||||
#define AVCLAN_BIT1_LOGIC_0 (20.5e3 / TCB_TICK)
|
#define AVCLAN_BIT1_LOGIC_0 (19.7e3 / TCB_TICK)
|
||||||
#define AVCLAN_BIT1_LOGIC_1 (19e3 / TCB_TICK)
|
#define AVCLAN_BIT1_LOGIC_1 (18.1e3 / TCB_TICK)
|
||||||
|
|
||||||
#define AVCLAN_BIT0_LOGIC_0 (34e3 / TCB_TICK)
|
#define AVCLAN_BIT0_LOGIC_0 (32.85e3 / TCB_TICK)
|
||||||
#define AVCLAN_BIT0_LOGIC_1 (5.5e3 / TCB_TICK)
|
#define AVCLAN_BIT0_LOGIC_1 (6.2e3 / TCB_TICK)
|
||||||
|
|
||||||
#define AVCLAN_READBIT_THRESHOLD (26e3 / TCB_TICK)
|
#define AVCLAN_READBIT_THRESHOLD (26e3 / TCB_TICK)
|
||||||
|
|
||||||
#define AVCLAN_BIT_LENGTH (39.5e3 / TCB_TICK)
|
#define AVCLAN_BIT_LENGTH_MAX (39.1e3 / TCB_TICK)
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
Loading…
x
Reference in New Issue
Block a user