Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/ClusterM/clunet.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSergey V. DUDANOV <sergey.dudanov@gmail.com>2016-07-08 11:06:13 +0300
committerGitHub <noreply@github.com>2016-07-08 11:06:13 +0300
commite4108b123c3281681e47e364052c3ac1289d4f76 (patch)
tree944bad51bcec6d12f26c2417c0a371dbd1d7ce59
parent20598883911be3ad436bfd5e9bd383ea9adf5ed0 (diff)
Update clunet.c
-rw-r--r--clunet.c52
1 files changed, 23 insertions, 29 deletions
diff --git a/clunet.c b/clunet.c
index 5d2c342..8e3dc25 100644
--- a/clunet.c
+++ b/clunet.c
@@ -106,20 +106,16 @@ ISR(CLUNET_TIMER_COMP_VECTOR)
{
uint8_t now = CLUNET_TIMER_REG; // Запоминаем текущее значение таймера
- switch (clunetSendingState)
+ /* Если достигли фазы завершения передачи, то завершим ее и освободим передатчик */
+ if (clunetSendingState == CLUNET_SENDING_STATE_DONE)
{
-
- /* Завершение передачи и освобождение передатчика */
- case CLUNET_SENDING_STATE_DONE:
-
CLUNET_DISABLE_TIMER_COMP; // Выключаем прерывание сравнения таймера
clunetSendingState = CLUNET_SENDING_STATE_IDLE; // Указываем, что передатчик свободен
CLUNET_SEND_0; // Отпускаем линию
- break;
-
- /* Этот блок кода может прижать линию к земле */
- default:
-
+ }
+ /* Иначе если передача активна */
+ else
+ {
// Арбитраж. Если мы линию не держим, но она уже занята.
if (!CLUNET_SENDING && CLUNET_READING)
{
@@ -139,7 +135,24 @@ ISR(CLUNET_TIMER_COMP_VECTOR)
else
switch (clunetSendingState)
{
+ /* Фаза передачи данных */
+ case CLUNET_SENDING_STATE_DATA:
+
+ // Планируем следующее прерывание чтобы отпустить линию в зависимости от значения бита
+ CLUNET_TIMER_REG_OCR = now + ((dataToSend[clunetSendingCurrentByte] & (1 << clunetSendingCurrentBit)) ? CLUNET_1_T : CLUNET_0_T);
+ /* Если передан байт данных */
+ if (++clunetSendingCurrentBit & 8)
+ {
+ /* и не все данные отосланы */
+ if (++clunetSendingCurrentByte < clunetSendingDataLength)
+ clunetSendingCurrentBit = 0; // то начинаем передачу следующего байта с бита 0
+ /* и передача всех данных закончена */
+ else
+ clunetSendingState++; // то переходим к следующей фазе завершения передачи пакета
+ }
+ break;
+
/* Фаза инициализации передачи пакета (время 10Т) */
case CLUNET_SENDING_STATE_INIT:
@@ -160,25 +173,6 @@ ISR(CLUNET_TIMER_COMP_VECTOR)
CLUNET_TIMER_REG_OCR = now + ((clunetCurrentPrio & 1) ? CLUNET_0_T : CLUNET_1_T);
clunetSendingCurrentByte = clunetSendingCurrentBit = 0; // Обнуляем счётчик
clunetSendingState++; // К следующей фазе передачи данных
- break;
-
- /* Фаза передачи данных */
- case CLUNET_SENDING_STATE_DATA:
-
- // Планируем следующее прерывание чтобы отпустить линию в зависимости от значения бита
- CLUNET_TIMER_REG_OCR = now + ((dataToSend[clunetSendingCurrentByte] & (1 << clunetSendingCurrentBit)) ? CLUNET_1_T : CLUNET_0_T);
-
- /* Если передан байт данных */
- if (++clunetSendingCurrentBit & 8)
- {
- /* и не все данные отосланы */
- if (++clunetSendingCurrentByte < clunetSendingDataLength)
- clunetSendingCurrentBit = 0; // то начинаем передачу следующего байта с бита 0
- /* и передача всех данных закончена */
- else
- clunetSendingState++; // то переходим к следующей фазе завершения передачи пакета
- }
-
}
}
}