Форум программистов, компьютерный форум, киберфорум
Наши страницы
Микроконтроллеры ATmega AVR
Войти
Регистрация
Восстановить пароль
 
Рейтинг 5.00/3: Рейтинг темы: голосов - 3, средняя оценка - 5.00
АлександрФедо
0 / 0 / 0
Регистрация: 27.02.2013
Сообщений: 12
1

Не могу найти ошибку в коде реализации протокола обмена

14.11.2014, 20:48. Просмотров 582. Ответов 16
Метки нет (Все метки)

Помогите пожалуйста, не могу найти ошибку в коде.
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
include <avr/io. h>
// Подключение заголовочного файла, который позволяет объявлять булевские переменные
#include <stdbool. h>
// Определение пользовательского типа данных byteunsigned char byte;
// Константы, определённые для обращения к выводам порта А
#define C1 (PINA & 0x01) /* 0-вой вывод порта А, на который приходит сигнал С1 */
#define C2 (PINA & 0x02) /* 1-вой вывод порта А, на который приходит сигнал С2 */
#define DATAIN ( (PINA & 0x04) >> 2) /* 2-вой вывод порта А, на который приходит информация. Чтение информации из порта */
#define DATAOUT (x) PORTA = (PORTA & ~ (0x04)) | (x << 2) /* 2-вой вывод порта А, на который приходит информация. Ввод информации в порт */
// Символы сигналов связи варианта задания на курсовой проект #4
#define ATTENTION 217 // Внимание
#define ADDRESS 57 // Адрес
#define READY 237 // Готов
#define BUSY 253 // Занят
#define END_OF_TRANSFER_SEQUENCE 114 // Конец передачи
#define END_OF_RECEIVE 174 // Конец приёма
#define REPEAT_TRANSFER 154 // Повторить передачу
// Символы сигналов связи от Абонента
#define END_OF_WORK 1 // Конец работы
#define TRANSFER_ERROR 2 // Ошибка передачи
// Глобальные переменные
byte frameFromArbiter = 0;abonentStateReceived = false;frameCameFromArbiter = false;AddressCameFromArbiter = false;frameToAbonentWasSent = false;requestToAbonentWasSent = false;stateOfAbonentWasSentToArbiter = false;DataMessageRefered = false;
int abonentState = 0;
// Получаем побитово байт от Арбитра
void ReceiveFrameFromArbiter ()
{int C2Count = 0;bool C1Came = false;bool C2Out = true;
if (C1) // Если пришёл сигнал С1,{Came = true; // запоминаем что сигнал С1 приходил
}(C1Came) // Если сигнал С1 приходил
{(C2 && C2Out) // Если сигнал С2 пришёл,
{= (frameFromArbiter & ~ (1 << C2Count)) | (DATAIN << C2Count); // считываем очередной бит с информационной линии
/*
(1 << C2Count) даст нам байт с единицой, установленной на том бите, который мы должны установить
~ (1 << C2Count) инвертирование даст нам байт с нулём, установленным на том бите, который мы должны установить
(frameFromArbiter & ~ (1 << C2Count)) даст нам исходный frameFromArbiter с нулём, установленным на том бите, который мы должны установить<< C2Count) даст нам бит со значением пришедшим по информационной линии, который установлен в байте на том бите, который мы должны установить
Итоговое поразрядное ИЛИ даст нам исходный frameFromArbiter со значением пришедшим по информационной линии, которое установится в frameFromArbiter на номере бита, равном номеру сигнала С2
*/Count++; // Считаем номер пришёдшего сигнала С2Out = false; // Запоминаем, что С2 пришёл, но ещё не уходил
}(C2Count == 8) // Если пришло 8 сигналов С2, значит мы приняли целиком байт
{Count = 0; // Обнуляем количество сигналов С2Came = false; // Запоминаем что пришёдший после С1 байт уже обработан, ждём следующий С1
C2Out = true;= true; // Запоминаем что байт пришёл
}(! C2) { // Если сигнал С2 ушёлOut = true; // Запоминаем, что сигнал С2 ушёл
}
}
}
// Ждём поступления от Арбитра адреса микроконтроллераWaitAddressFromArbiter ()
{= 0x00; // Указываем микроконтроллеру настроить все выводы на приём информации
bool attentionCame = false;(); // Получить байт от Арбитра(frameCameFromArbiter) // Если байт от Арбитра пришёл
{(attentionCame) // Если сигнал Внимание уже приходил
{(frameFromArbiter == ADDRESS) // И пришедший байт равен адресу микроконтроллера
{= true; // Запоминаем, что адрес пришёл
}= false;
}(frameFromArbiter == ATTENTION) // Если пришёл байт равный сигналу Внимание
{= true; // Запоминаем, что приходил сигнал Внимание
}= false; // Записываем, что мы уже обработали пришедший байт
}
}
// Посылаем параллельно байт АбонентуSendFrameToAbonent (byte sendFrame)
{bool C1Came = false;(C1) // Если пришёл сигнал С1,{Came = true; // запоминаем что сигнал С1 приходил
}(C1Came) // Если сигнал С1 приходил
{= sendFrame; // Выдаём на выводы порта B байт
}(! C1 && C1Came) // Если сигнал С1 ушёл и приходил
{= true; // Запоминаем что байт был отосланCame = false;
}
}
// Посылаем Абоненту запрос о его состоянииSendToAbonentRequestAboutAbonentState ()
{= 0xFF; // Указываем микроконтроллеру настроить все выводы порта B на вывод информации(READY); // Посылаем байт ГОТОВ Абоненту(frameToAbonentWasSent) // Если байт был послан
{= true; // Запоминаем, что запрос Абоненту был послан
}
}
// Получаем от Абонента его состояниеReceiveFromAbonentAbonentState ()
{= 0x00; // Указываем микроконтроллеру настроить все выводы порта B на приём информации
static bool C1Came = false;(C1) // Если пришёл сигнал С1,{Came = true; // запоминаем что сигнал С1 приходил
}(C1Came) // Если сигнал С1 приходил
{= PINA; // Выдаём на выводы порта B байт
}(! C1 && C1Came) // Если сигнал С1 ушёл и приходил
{= true; // Запоминаем что получили состояние АбонентаCame = false;
}
}
// Посылаем Арбитру состояние Абонента
void SendToArbiterAbonentState (byte frame)
{= 0x04;int C2Count = 0;bool C1Came = false;bool C2Out = true;(C1) // Если пришёл сигнал С1,{Came = true; // запоминаем что сигнал С1 приходил
}(C1Came) // Если сигнал С1 приходил
{(C2 && C2Out) // Если сигнал С2 пришёл,
{( (frame & (1 << C2Count)) >> C2Count); // Записываем очередной бит на информационную линиюCount++; // Считаем номер пришёдшего сигнала С2Out = false; // Запоминаем, что С2 пришёл, но ещё не уходил
}(C2Count == 8)
{Count = 0; // Обнуляем количество сигналов С2Came = false; // Запоминаем что пришёдший после С1 байт уже обработан, ждём следующий С1Out = true;= true; // Запоминаем, что состояние Абонента было отослано Арбитру
}(! C2) { // Если сигнал С2 ушёлOut = true; // Запоминаем, что сигнал С2 ушёл
}
}
}
// Получаем информационное сообщение от Арбитра и пересылаем АбонентуReceiveDataMessageFromArbiterAndReferToAbonent ()
{= 0x00; // Указываем микроконтроллеру настроить все выводы на приём информации(); // Получить байт от Арбитра(frameCameFromArbiter) // Если байт от АРбитра пришёл
{(frameFromArbiter); // Посылаем байт Абоненту= false; // Запоминаем, что мы обработали байт, пришедший от Арбитра(frameFromArbiter == END_OF_TRANSFER_SEQUENCE) // Если пришёдший байт совпадает с символом КОНЕЦ ПЕРЕДАЧИ
{= true; // Запоминаем что информационное сообщение переслали
}
}
}main (void)
{(1) // Запускаем бесконечный цикл
{(! AddressCameFromArbiter) // Если адрес МК ещё не пришёл от Арбитра,
{(); // ждём
}(AddressCameFromArbiter) // Если от Арбитра пришёл адрес МК
{(); // посылаем Абоненту запрос о его состоянии(requestToAbonentWasSent) // Если запрос о состоянии Абонента был послан
{(); // получаем ответ
}(abonentStateReceived) // Если получили состояние Абонента,
{(abonentState == END_OF_WORK) // и состояние равно КОНЕЦ РАБОТЫ,
{(READY); // посылаем Арбитру сигнал ГОТОВ(stateOfAbonentWasSentToArbiter) // Если состояние Абонента отослалось Арбитру
{(); // Начинаем принимать информационное сообщение от Арбитра и пересылать его Абоненту(DataMessageRefered) // Если информационное сообщение было отослано
{(); // Посылаем Абоненту запрос о его состоянии(requestToAbonentWasSent) // Если запрос о состоянии Абонента был послан,
{(); // ждём ответ
}(abonentStateReceived) // Если получили состояние Абонента,
{(abonentState == TRANSFER_ERROR) // Если состояние Абонента равно ОШИБКА ПЕРЕДАЧИ
{SendToArbiterAbonentState (REPEAT_TRANSFER); // Посылаем Арбитру сигнал ПОВТОРИТЬ ПЕРЕДАЧУ
}// Если ошибки не произошло
{
SendToArbiterAbonentState (END_OF_RECEIVE); // Посылаем Арбитру сигнал КОНЕЦ ПРИЁМА
}
}
}
}
}// Если состояние не равно КОНЕЦ РАБОТЫ
{(BUSY); // Посылаем Арбитру, что Абонент ЗАНЯТ
}
}
}
}
}
0
QA
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
14.11.2014, 20:48
Ответы с готовыми решениями:

не могу найти ошибку в коде. прошу помощи
накрылся сенсорный кран в ванной,используя его клапан(управляется подачей импульса прямой и...

Нужно найти ошибку в коде реализации метода половинного деления
Программа должна решать методом половинного деления уравнение: #include &lt;stdio.h&gt; #include...

Не могу найти ошибку в реализации алгоритма
Нужно перевести алгоритм в код. Вот мой код, но он не работает: double a = -10; ...

Двумерный массив. Поиск нулей.Не могу найти ошибку ошибку в коде
Вот,например массив 5 5 0 1 0 1 0 1 1 1 1 1 0 0 0 0 1 0 0 1 0 0 1 0 0 0 0 считываются два...

Не могу найти ошибку в коде
Есть вот такой вот код #include &lt;iostream&gt; #include &lt;math.h&gt; using namespace std; int main()...

16
pyzhman
1161 / 516 / 76
Регистрация: 15.05.2012
Сообщений: 2,959
15.11.2014, 07:35 2
C
1
2
if (...) // ...{Came = true; // ...
}(...) // ...
Я вот стесняюсь спросить - это в чём писано?
0
Витальич
1277 / 1183 / 175
Регистрация: 02.12.2013
Сообщений: 4,886
15.11.2014, 08:24 3
АлександрФедо, кто Вас научил так писать или где Вы об этом прочитали, напишите плз.
0
АлександрФедо
0 / 0 / 0
Регистрация: 27.02.2013
Сообщений: 12
15.11.2014, 16:35  [ТС] 4
Витальич,
я не писал, нам задали найти ошибку в этом коде.
0
15.11.2014, 16:35
Витальич
1277 / 1183 / 175
Регистрация: 02.12.2013
Сообщений: 4,886
15.11.2014, 17:03 5
Цитата Сообщение от АлександрФедо Посмотреть сообщение
не могу найти ошибку в коде
В нем нет ошибок, этот гАвнокод одна большая ошибка.
Цитата Сообщение от АлександрФедо Посмотреть сообщение
нам задали найти ошибку в этом коде.
Передайте тому кто дал, что пора завязывать с тяжелыми наркотиками.
Можете сослаться на меня.
Так и сказать: "а вот Витальич с форума считает, что он учит разбираться в сортах гАвна".
3
ValeryS
Модератор
7944 / 5915 / 783
Регистрация: 14.02.2011
Сообщений: 20,347
Завершенные тесты: 1
15.11.2014, 22:00 6
Цитата Сообщение от АлександрФедо Посмотреть сообщение
нам задали найти ошибку в этом коде.
ужель ты расскажешь, на каком языке это писано, то может и смогу
Цитата Сообщение от АлександрФедо Посмотреть сообщение
}main (void)
{(1) // Запускаем бесконечный цикл
языки которые я знаю, таких конструкций не допускают, особливо это
Цитата Сообщение от АлександрФедо Посмотреть сообщение
(1)

Не по теме:

Цитата Сообщение от Витальич Посмотреть сообщение
этот гАвнокод одна большая ошибка.
"Дурак - это не отсутствие ума, это такой ум"(с) генерал Лебедь

0
АлександрФедо
0 / 0 / 0
Регистрация: 27.02.2013
Сообщений: 12
16.11.2014, 12:19  [ТС] 7
это ассемблер.
0
Витальич
1277 / 1183 / 175
Регистрация: 02.12.2013
Сообщений: 4,886
16.11.2014, 12:34 8
Цитата Сообщение от АлександрФедо Посмотреть сообщение
include <avr/io. h>
Цитата Сообщение от АлександрФедо Посмотреть сообщение
это ассемблер.
Ага, а я президент США.
Вот как в AVR(овском) асме подключаются файлы: .INCLUDE "имя_файла" и так я могу написать про каждую строчку почему не асм.
Это у Вас СИ.
Не знаю что за эксперименты над Вами там препод ставит, но такой подход к изучению языка я считаю не верным. Я честно попробовал исправить ошибки, но стало просто противно. Закрыл редактор и написал свой предыдущий пост.
P.S. Извиняюсь за резкие высказывание в предыдущем своём посте.
0
ValeryS
Модератор
7944 / 5915 / 783
Регистрация: 14.02.2011
Сообщений: 20,347
Завершенные тесты: 1
16.11.2014, 15:26 9
Цитата Сообщение от Витальич Посмотреть сообщение
Это у Вас СИ.
если бы
Цитата Сообщение от АлександрФедо Посмотреть сообщение
}(frameFromArbiter == ATTENTION) // Если пришёл байт равный сигналу Внимание
{= true; // Запоминаем, что приходил сигнал Внимание
}= false; // Записываем, что мы уже обработали пришедший байт
}
по отсутствию переменных, можно заподозрить что то функциональное, типа ЛИСП, но
а) у него совершенно другой синтаксис
б)я не слышал о ЛИСПе для микроконтроллеров
0
Витальич
1277 / 1183 / 175
Регистрация: 02.12.2013
Сообщений: 4,886
16.11.2014, 15:43 10
Цитата Сообщение от ValeryS Посмотреть сообщение
если бы
Мне кажется у них препод пииии, пииии, прикалывается и надо так:
}(frameFromArbiter == ATTENTION) // Если пришёл байт равный сигналу Внимание
меняем на }if(frameFromArbiter == ATTENTION)

{= true; // Запоминаем, что приходил сигнал Внимание
меняем на {abonentStateReceived = true;
итд
0
АлександрФедо
0 / 0 / 0
Регистрация: 27.02.2013
Сообщений: 12
17.11.2014, 00:16  [ТС] 11
извиняюсь, это реально язык си, препод сказал, что максимум пару строк не верные)
0
ValeryS
Модератор
7944 / 5915 / 783
Регистрация: 14.02.2011
Сообщений: 20,347
Завершенные тесты: 1
17.11.2014, 01:10 12
Цитата Сообщение от АлександрФедо Посмотреть сообщение
что максимум пару строк не верные)
пара
Цитата Сообщение от АлександрФедо Посмотреть сообщение
}main (void)
{(1) // Запускаем бесконечный цикл
{(! AddressCameFromArbiter) // Если адрес МК ещё не пришёл от Арбитра,
{(); // ждём
}(AddressCameFromArbiter) // Если от Арбитра пришёл адрес МК
{(); // посылаем Абоненту запрос о его состоянии(requestToAbonentWasSent) // Если запрос о состоянии Абонента был послан
{(); // получаем ответ
}(abonentStateReceived) // Если получили состояние Абонента,
{(abonentState == END_OF_WORK) // и состояние равно КОНЕЦ РАБОТЫ,
{(READY); // посылаем Арбитру сигнал ГОТОВ(stateOfAbonentWasSentToArbiter) // Если состояние Абонента отослалось Арбитру
{(); // Начинаем принимать информационное сообщение от Арбитра и пересылать его Абоненту(DataMessageRefered) // Если информационное сообщение было отослано
{(); // Посылаем Абоненту запрос о его состоянии(requestToAbonentWasSent) // Если запрос о состоянии Абонента был послан,
{(); // ждём ответ
}(abonentStateReceived) // Если получили состояние Абонента,
это я еще не все скопировал
тут в каждой строчке ошибки, и не по одной
что за набор скобок???
что означают эти фигурные скобки???
где команды?
Си это все таки Императивный язык
единственно что правильно это коментарии
0
Витальич
1277 / 1183 / 175
Регистрация: 02.12.2013
Сообщений: 4,886
17.11.2014, 07:24 13
Цитата Сообщение от АлександрФедо Посмотреть сообщение
препод сказал, что максимум пару строк не верные)
Ну и пошлите его на х, а сами в армию сходите, через год вернетесь другим человеком.
В первых 64 строках больше трех десятков ошибок, не считая уё форматирования и все ошибки в этих 64 строках я не исправил, нужно смотреть весь контекст программы.
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
#include <avr/io.h>
// Подключение заголовочного файла, который позволяет объявлять булевские переменные
#include <stdbool. h>
 
// Определение пользовательского типа данных byteunsigned char byte;
// Константы, определённые для обращения к выводам порта А
#define C1 (PINA & 0x01)                                        /* 0-вой вывод порта А, на который приходит сигнал С1 */
#define C2 (PINA & 0x02)                                        /* 1-вой вывод порта А, на который приходит сигнал С2 */
#define DATAIN ( (PINA & 0x04) >> 2)                            /* 2-вой вывод порта А, на который приходит информация. Чтение информации из порта */
#define DATAOUT (x) PORTA = (PORTA & ~ (0x04)) | (x << 2)       /* 2-вой вывод порта А, на который приходит информация. Ввод информации в порт */
 
// Символы сигналов связи варианта задания на курсовой проект #4
#define ATTENTION 217   // Внимание
#define ADDRESS 57      // Адрес
#define READY 237       // Готов
#define BUSY 253        // Занят
 
#define END_OF_TRANSFER_SEQUENCE 114    // Конец передачи
#define END_OF_RECEIVE 174              // Конец приёма
#define REPEAT_TRANSFER 154             // Повторить передачу
// Символы сигналов связи от Абонента
#define END_OF_WORK 1                   // Конец работы
#define TRANSFER_ERROR 2                // Ошибка передачи
 
// Глобальные переменные
byte frameFromArbiter = 0,abonentStateReceived = false;
byte frameCameFromArbiter = false,AddressCameFromArbiter = false;
byte frameToAbonentWasSent = false,requestToAbonentWasSent = false;
byte stateOfAbonentWasSentToArbiter = false,DataMessageRefered = false;
int abonentState = 0;
 
// Получаем по битово байт от Арбитра
void ReceiveFrameFromArbiter ()
{
  int C2Count = 0;
  bool C1Came = false;
  bool C2Out = true;
 
 if (C1)                                    // Если пришёл сигнал С1,{Came = true; // запоминаем что сигнал С1 приходил
 {
 }
  if(C1Came)                                // Если сигнал С1 приходил
   {
     if(C2 && C2Out) // Если сигнал С2 пришёл,
      {
        = (frameFromArbiter & ~ (1 << C2Count)) | (DATAIN << C2Count); // считываем очередной бит с информационной линии
          /*
            (1 << C2Count) даст нам байт с единицой, установленной на том бите, который мы должны установить
            ~ (1 << C2Count) инвертирование даст нам байт с нулём, установленным на том бите, который мы должны установить
            (frameFromArbiter & ~ (1 << C2Count)) даст нам исходный frameFromArbiter с нулём, установленным на том бите, который мы должны установить<< C2Count) даст нам бит со значением пришедшим по информационной линии, который установлен в байте на том бите, который мы должны установить
            Итоговое поразрядное ИЛИ даст нам исходный frameFromArbiter со значением пришедшим по информационной линии, которое установится в frameFromArbiter на номере бита, равном номеру сигнала С2
          */
        Count++; // Считаем номер пришёдшего сигнала С2Out = false; // Запоминаем, что С2 пришёл, но ещё не уходил
      }
  if(C2Count == 8) // Если пришло 8 сигналов С2, значит мы приняли целиком байт
   {
     Count = 0; // Обнуляем количество сигналов С2Came = false; // Запоминаем что пришёдший после С1 байт уже обработан, ждём следующий С1
     C2Out = true;
     = true; // Запоминаем что байт пришёл
   }
  if(! C2) 
   { // Если сигнал С2 ушёлOut = true; // Запоминаем, что сигнал С2 ушёл
   }
  }
}
// Ждём поступления от Арбитра адреса микроконтроллераWaitAddressFromArbiter ()
{= 0x00; // Указываем микроконтроллеру настроить все выводы на приём информации
bool attentionCame = false;(); // Получить байт от Арбитра(frameCameFromArbiter) // Если байт от Арбитра пришёл
{(attentionCame) // Если сигнал Внимание уже приходил
{(frameFromArbiter == ADDRESS) // И пришедший байт равен адресу микроконтроллера
{= true; // Запоминаем, что адрес пришёл
}= false;
}(frameFromArbiter == ATTENTION) // Если пришёл байт равный сигналу Внимание
{= true; // Запоминаем, что приходил сигнал Внимание
}= false; // Записываем, что мы уже обработали пришедший байт
}
}
// Посылаем параллельно байт АбонентуSendFrameToAbonent (byte sendFrame)
{bool C1Came = false;(C1) // Если пришёл сигнал С1,{Came = true; // запоминаем что сигнал С1 приходил
}(C1Came) // Если сигнал С1 приходил
{= sendFrame; // Выдаём на выводы порта B байт
}(! C1 && C1Came) // Если сигнал С1 ушёл и приходил
{= true; // Запоминаем что байт был отосланCame = false;
}
}
// Посылаем Абоненту запрос о его состоянииSendToAbonentRequestAboutAbonentState ()
{= 0xFF; // Указываем микроконтроллеру настроить все выводы порта B на вывод информации(READY); // Посылаем байт ГОТОВ Абоненту(frameToAbonentWasSent) // Если байт был послан
{= true; // Запоминаем, что запрос Абоненту был послан
}
}
// Получаем от Абонента его состояниеReceiveFromAbonentAbonentState ()
{= 0x00; // Указываем микроконтроллеру настроить все выводы порта B на приём информации
static bool C1Came = false;(C1) // Если пришёл сигнал С1,{Came = true; // запоминаем что сигнал С1 приходил
}(C1Came) // Если сигнал С1 приходил
{= PINA; // Выдаём на выводы порта B байт
}(! C1 && C1Came) // Если сигнал С1 ушёл и приходил
{= true; // Запоминаем что получили состояние АбонентаCame = false;
}
}
// Посылаем Арбитру состояние Абонента
void SendToArbiterAbonentState (byte frame)
{= 0x04;int C2Count = 0;bool C1Came = false;bool C2Out = true;(C1) // Если пришёл сигнал С1,{Came = true; // запоминаем что сигнал С1 приходил
}(C1Came) // Если сигнал С1 приходил
{(C2 && C2Out) // Если сигнал С2 пришёл,
{( (frame & (1 << C2Count)) >> C2Count); // Записываем очередной бит на информационную линиюCount++; // Считаем номер пришёдшего сигнала С2Out = false; // Запоминаем, что С2 пришёл, но ещё не уходил
}(C2Count == 8)
{Count = 0; // Обнуляем количество сигналов С2Came = false; // Запоминаем что пришёдший после С1 байт уже обработан, ждём следующий С1Out = true;= true; // Запоминаем, что состояние Абонента было отослано Арбитру
}(! C2) { // Если сигнал С2 ушёлOut = true; // Запоминаем, что сигнал С2 ушёл
}
}
}
// Получаем информационное сообщение от Арбитра и пересылаем АбонентуReceiveDataMessageFromArbiterAndReferToAbonent ()
{= 0x00; // Указываем микроконтроллеру настроить все выводы на приём информации(); // Получить байт от Арбитра(frameCameFromArbiter) // Если байт от АРбитра пришёл
{(frameFromArbiter); // Посылаем байт Абоненту= false; // Запоминаем, что мы обработали байт, пришедший от Арбитра(frameFromArbiter == END_OF_TRANSFER_SEQUENCE) // Если пришёдший байт совпадает с символом КОНЕЦ ПЕРЕДАЧИ
{= true; // Запоминаем что информационное сообщение переслали
}
}
}main (void)
{(1) // Запускаем бесконечный цикл
{(! AddressCameFromArbiter) // Если адрес МК ещё не пришёл от Арбитра,
{(); // ждём
}(AddressCameFromArbiter) // Если от Арбитра пришёл адрес МК
{(); // посылаем Абоненту запрос о его состоянии(requestToAbonentWasSent) // Если запрос о состоянии Абонента был послан
{(); // получаем ответ
}(abonentStateReceived) // Если получили состояние Абонента,
{(abonentState == END_OF_WORK) // и состояние равно КОНЕЦ РАБОТЫ,
{(READY); // посылаем Арбитру сигнал ГОТОВ(stateOfAbonentWasSentToArbiter) // Если состояние Абонента отослалось Арбитру
{(); // Начинаем принимать информационное сообщение от Арбитра и пересылать его Абоненту(DataMessageRefered) // Если информационное сообщение было отослано
{(); // Посылаем Абоненту запрос о его состоянии(requestToAbonentWasSent) // Если запрос о состоянии Абонента был послан,
{(); // ждём ответ
}(abonentStateReceived) // Если получили состояние Абонента,
{(abonentState == TRANSFER_ERROR) // Если состояние Абонента равно ОШИБКА ПЕРЕДАЧИ
{SendToArbiterAbonentState (REPEAT_TRANSFER); // Посылаем Арбитру сигнал ПОВТОРИТЬ ПЕРЕДАЧУ
}// Если ошибки не произошло
{
SendToArbiterAbonentState (END_OF_RECEIVE); // Посылаем Арбитру сигнал КОНЕЦ ПРИЁМА
}
}
}
}
}// Если состояние не равно КОНЕЦ РАБОТЫ
{(BUSY); // Посылаем Арбитру, что Абонент ЗАНЯТ
}
}
}
}
}
Я увсё, может другие желающие найдутся.
0
ValeryS
Модератор
7944 / 5915 / 783
Регистрация: 14.02.2011
Сообщений: 20,347
Завершенные тесты: 1
17.11.2014, 08:00 14
Витальич,
я кажется понял пару строк где ошибка
первая строка
C
1
#if 0
последняя
C
1
#endif


Добавлено через 5 минут
Цитата Сообщение от Витальич Посмотреть сообщение
Я увсё, может другие желающие найдутся.
а если по серьезному
то нужно знать камень
среду разработки, и что за протокол,его физическую сущность
это даже не псевдокод
преклоняюсь перед твоим упорством,что хоть 64 строки разобрал в этой белебирде
проще с нуля написать
1
Витальич
1277 / 1183 / 175
Регистрация: 02.12.2013
Сообщений: 4,886
17.11.2014, 08:48 15
Цитата Сообщение от ValeryS Посмотреть сообщение
Код C
1
#if 0
последняя
Код C
1
#endif
Формально да, исправит весь код. Препроцессор это сила и средства борьбы с таким кодом
Цитата Сообщение от ValeryS Посмотреть сообщение
преклоняюсь перед твоим упорством,что хоть 64 строки разобрал в этой белебирде
После пробежки пока ждал когда вскипит чайник. ТС(у) не повезло что он был не полный
ИМХО: Меня поражает современное образование, я думал что курс информатики школы (ребенок вопросы задает) это предел маразма. Оказалось что нет.
0
АлександрФедо
0 / 0 / 0
Регистрация: 27.02.2013
Сообщений: 12
17.11.2014, 15:19  [ТС] 16
Витальич,
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
/*
Подключение заголовочного файла io.h, который в свою очередь подключит iom169.h
iom169.h - заголовочный файл, который ставит в соответствие константам PORTA и PORTB реальные адреса выводов конкретного контроллера (в нашем случае ATmega169)
Таким образом io.h позволяет работать с портами ввода-вывода
*/
#include <avr/io.h>
 
// Подключение заголовочного файла, который позволяет объявлять булевские переменные
#include <stdbool.h>
 
// Определение пользовательского типа данных byte
typedef unsigned char byte;
 
// Константы, определённые для обращения к выводам порта А
#define C1          (PINA & 0x01) /* 0-вой вывод порта А, на который приходит сигнал С1  */
#define C2          (PINA & 0x02) /* 1-вой вывод порта А, на который приходит сигнал С2  */
#define DATAIN      ((PINA & 0x04) >> 2) /* 2-вой вывод порта А, на который приходит информация. Чтение информации из порта */
#define DATAOUT(x)  PORTA = (PORTA & ~(0x04)) | (x << 2) /* 2-вой вывод порта А, на который приходит информация. Ввод информации в порт */
 
// Символы сигналов связи варианта задания на курсовой проект #4
#define ATTENTION 217                   // Внимание
#define ADDRESS 57                      // Адрес
#define READY 237                       // Готов
#define BUSY 253                        // Занят
#define END_OF_TRANSFER_SEQUENCE 114    // Конец передачи
#define END_OF_RECEIVE 174              // Конец приёма
#define REPEAT_TRANSFER 154             // Повторить передачу
 
// Символы сигналов связи от Абонента
#define END_OF_WORK 1                   // Конец работы
#define TRANSFER_ERROR 2                // Ошибка передачи
 
// Глобальные переменные
byte frameFromArbiter = 0;
bool abonentStateReceived = false;
bool frameCameFromArbiter = false;
bool AddressCameFromArbiter = false;
bool frameToAbonentWasSent = false;
bool requestToAbonentWasSent = false;
bool stateOfAbonentWasSentToArbiter = false;
bool DataMessageRefered = false;
int  abonentState = 0;
 
// Получаем побитово байт от Арбитра
void ReceiveFrameFromArbiter()
{
    static int C2Count = 0;
    static bool C1Came = false;
    static bool C2Out = true;
 
    if(C1) // Если пришёл сигнал С1,
    {
        C1Came = true; // запоминаем что сигнал С1 приходил
    }   
 
    if(C1Came) // Если сигнал С1 приходил
    {
        if(C2 && C2Out) // Если сигнал С2 пришёл,
        {
            frameFromArbiter = (frameFromArbiter & ~(1 << C2Count)) | (DATAIN << C2Count); // считываем очередной бит с информационной линии
            /*
                (1 << C2Count) даст нам байт с единицой, установленной на том бите, который мы должны установить
                ~(1 << C2Count) инвертирование даст нам байт с нулём, установленным на том бите, который мы должны установить
                (frameFromArbiter & ~(1 << C2Count)) даст нам исходный frameFromArbiter с нулём, установленным на том бите, который мы должны установить
                
                (DATAIN << C2Count) даст нам бит со значением пришедшим по информационной линии, который установлен в байте  на том бите, который мы должны установить
 
                Итоговое поразрядное ИЛИ даст нам исходный frameFromArbiter со значением пришедшим по информационной линии, которое установится в frameFromArbiter  на номере бита, равном номеру сигнала С2
            */
 
 
            C2Count++; // Считаем номер пришёдшего сигнала С2
            C2Out = false; // Запоминаем, что С2 пришёл, но ещё не уходил
        }
            
        if(C2Count == 8) // Если пришло 8 сигналов С2, значит мы приняли целиком байт
        {
            C2Count = 0; // Обнуляем количество сигналов С2
            C1Came = false; // Запоминаем что пришёдший после С1 байт уже обработан, ждём следующий С1
            C2Out = true;
            frameCameFromArbiter = true; // Запоминаем что байт пришёл
        }
 
        if(!C2){ // Если сигнал С2 ушёл
            C2Out = true; // Запоминаем, что сигнал С2 ушёл
        }
    }
}
 
 
 
 
// Ждём поступления от Арбитра адреса микроконтроллера
void WaitAddressFromArbiter()
{
    DDRA = 0x00; // Указываем микроконтроллеру настроить все выводы на приём информации
    bool attentionCame = false;
    ReceiveFrameFromArbiter(); // Получить байт от Арбитра
 
    if(frameCameFromArbiter) // Если байт от Арбитра пришёл
    {
        if(attentionCame) // Если сигнал Внимание уже приходил
        {
            if(frameFromArbiter == ADDRESS) // И пришедший байт равен адресу микроконтроллера
            {
                AddressCameFromArbiter = true; // Запоминаем, что адрес пришёл
            }
            attentionCame = false;
        }
 
        if(frameFromArbiter == ATTENTION) // Если пришёл байт равный сигналу Внимание
        {
            attentionCame = true; // Запоминаем, что приходил сигнал Внимание
        }
        frameCameFromArbiter = false; // Записываем, что мы уже обработали пришедший байт
    }
}
 
// Посылаем параллельно байт Абоненту
void SendFrameToAbonent(byte sendFrame)
{
    static bool C1Came = false;
    if(C1) // Если пришёл сигнал С1,
    {
        C1Came = true; // запоминаем что сигнал С1 приходил
    }   
 
    if(C1Came) // Если сигнал С1 приходил
    {
        PORTB = sendFrame; // Выдаём на выводы порта B байт
    }
    
    if(!C1 && C1Came) // Если сигнал С1 ушёл и приходил
    {
        frameToAbonentWasSent = true; // Запоминаем что байт был отослан
        C1Came = false;
    }
 
}
 
// Посылаем Абоненту запрос о его состоянии
void SendToAbonentRequestAboutAbonentState()
{
    DDRB = 0xFF; // Указываем микроконтроллеру настроить все выводы порта B на вывод информации
    SendFrameToAbonent(READY); // Посылаем байт ГОТОВ Абоненту
    
    if(frameToAbonentWasSent) // Если байт был послан
    {
        requestToAbonentWasSent = true; // Запоминаем, что запрос Абоненту был послан
    }
}
 
 
 
 
// Получаем от Абонента его состояние
void ReceiveFromAbonentAbonentState()
{
    
    DDRB = 0x00; // Указываем микроконтроллеру настроить все выводы порта B на приём информации
    static bool C1Came = false;
    if(C1) // Если пришёл сигнал С1,
    {
        C1Came = true; // запоминаем что сигнал С1 приходил
    }   
 
    if(C1Came) // Если сигнал С1 приходил
    {
        abonentState = PINA; // Выдаём на выводы порта B байт
    }
    
    if(!C1 && C1Came) // Если сигнал С1 ушёл и приходил
    {
        abonentStateReceived = true; // Запоминаем что получили состояние Абонента
        C1Came = false;
    }
 
}
 
// Посылаем Арбитру состояние Абонента
void SendToArbiterAbonentState(byte frame)
{
    DDRA = 0x04;
    static int C2Count = 0;
    static bool C1Came = false;
    static bool C2Out = true;
 
    if(C1) // Если пришёл сигнал С1,
    {
        C1Came = true; // запоминаем что сигнал С1 приходил
    }   
 
    if(C1Came) // Если сигнал С1 приходил
    {
        if(C2 && C2Out) // Если сигнал С2 пришёл,
        {
            DATAOUT((frame & (1 << C2Count)) >> C2Count); // Записываем очередной бит на информационную линию
            C2Count++; // Считаем номер пришёдшего сигнала С2
            C2Out = false; // Запоминаем, что С2 пришёл, но ещё не уходил
        }
 
        if(C2Count == 8)
        {
            C2Count = 0; // Обнуляем количество сигналов С2
            C1Came = false; // Запоминаем что пришёдший после С1 байт уже обработан, ждём следующий С1
            C2Out = true;
            stateOfAbonentWasSentToArbiter = true; // Запоминаем, что состояние Абонента было отослано Арбитру
        }
 
        if(!C2){ // Если сигнал С2 ушёл
            C2Out = true; // Запоминаем, что сигнал С2 ушёл
        }
    
        
    }
}
 
// Получаем информационное сообщение от Арбитра и пересылаем Абоненту
void ReceiveDataMessageFromArbiterAndReferToAbonent()
{
    DDRA = 0x00; // Указываем микроконтроллеру настроить все выводы на приём информации
    ReceiveFrameFromArbiter(); // Получить байт от Арбитра
    if(frameCameFromArbiter) // Если байт от АРбитра пришёл
    {
        SendFrameToAbonent(frameFromArbiter); // Посылаем байт Абоненту
        frameCameFromArbiter = false; // Запоминаем, что мы обработали байт, пришедший от Арбитра
 
        if(frameFromArbiter == END_OF_TRANSFER_SEQUENCE) // Если пришёдший байт совпадает с символом КОНЕЦ ПЕРЕДАЧИ
        {
            DataMessageRefered = true; // Запоминаем что информационное сообщение переслали
        }
    }
}
 
 
 
int main (void)
{
    
    while(1) // Запускаем бесконечный цикл
    {
        if(!AddressCameFromArbiter) // Если адрес МК ещё не пришёл от Арбитра,
        {
            WaitAddressFromArbiter(); // ждём
        }
        
        if(AddressCameFromArbiter) // Если от Арбитра пришёл адрес МК
        {
            SendToAbonentRequestAboutAbonentState(); // посылаем Абоненту запрос о его состоянии
 
            if(requestToAbonentWasSent) // Если запрос о состоянии Абонента был послан
            {
                ReceiveFromAbonentAbonentState(); // получаем ответ
            }
            
            if(abonentStateReceived) // Если получили состояние Абонента,
            {
                if(abonentState == END_OF_WORK) // и состояние равно КОНЕЦ РАБОТЫ,
                {
                    SendToArbiterAbonentState(READY); // посылаем Арбитру сигнал ГОТОВ
 
                    if(stateOfAbonentWasSentToArbiter) // Если состояние Абонента отослалось Арбитру
                    {
                        ReceiveDataMessageFromArbiterAndReferToAbonent(); // Начинаем принимать информационное сообщение от Арбитра и пересылать его Абоненту
 
                        if(DataMessageRefered) // Если информационное сообщение было отослано
                        {
                            SendToAbonentRequestAboutAbonentState(); // Посылаем Абоненту запрос о его состоянии
                
                            if(requestToAbonentWasSent) // Если запрос о состоянии Абонента был послан,
                            {
                                ReceiveFromAbonentAbonentState(); // ждём ответ
                            }
            
                            if(abonentStateReceived) // Если получили состояние Абонента,
                            {
                                if(abonentState == TRANSFER_ERROR) // Если состояние Абонента равно ОШИБКА ПЕРЕДАЧИ
                                {
                                    SendToArbiterAbonentState(REPEAT_TRANSFER); // Посылаем Арбитру сигнал ПОВТОРИТЬ ПЕРЕДАЧУ
                                }
                                else // Если ошибки не произошло
                                {
                                    SendToArbiterAbonentState(END_OF_RECEIVE); // Посылаем Арбитру сигнал КОНЕЦ ПРИЁМА
                                }
                            }
                        }
                    }
                }
                else // Если состояние не равно КОНЕЦ РАБОТЫ
                {
                    SendToArbiterAbonentState(BUSY); // Посылаем Арбитру, что Абонент ЗАНЯТ
                }
            }
        }
    }
}
как вам данный вариант? тут все исправлено и уже ошибки только в алгоритме.
0
Voland_
1736 / 1069 / 107
Регистрация: 04.01.2010
Сообщений: 3,654
17.11.2014, 17:06 17
Цитата Сообщение от АлександрФедо Посмотреть сообщение
// Символы сигналов связи варианта задания на курсовой проект #4
#define ATTENTION 217 // Внимание
#define ADDRESS 57 // Адрес
#define READY 237 // Готов
#define BUSY 253 // Занят
#define END_OF_TRANSFER_SEQUENCE 114 // Конец передачи
#define END_OF_RECEIVE 174 // Конец приёма
#define REPEAT_TRANSFER 154 // Повторить передачу
Стесняюсь спросить, AVR Studio глотает такое?

АлександрФедо, ну, допустим, последнее предложенное больше похоже Сишный код, нежели то что было. Но как вы предлагаете искать ошибку? Ошибку в чем? Что должен делать код, и чего не делает? В каком месте запинается? Пробегитесь в отладчике от функции к функции, проверьте промежуточные данные...
1
17.11.2014, 17:06
Answers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
17.11.2014, 17:06

Не могу найти ошибку в коде
Нужно чтобы при заходе на форму на нажатие бутон 1 он скрывал предыдущие радиобутоны и показывал...

Не могу найти ошибку в коде
Было дано следующее задание: Дана строка, состоящая из русских слов, разделенных пробелами (одним...

Не могу найти ошибку в коде
Добрый вечер. Собственно, в универе дали задачу Программу я сделал, работает она верно при...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
17
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.