почему не работает RS485
|
|
ivan_fd |
Дата: Вт, 15.09.2015, 13:26 | Сообщение # 31 |
Группа:
Модераторы
Ранг:
Специалист
Сообщений:
894
Замечания:
±
На сайте с 12.01.2009
Статус:
Offline
|
Цитата vladh ( ) Это сделал компилятор. А при выходе из этой подпрограммы компилятор его восстанавливает.
Это делает не компилятор. Вы, что не читаете даташиты?
Цитата При переходе на подпрограмму обработки прерываний бит GIE аппаратно сбрасывается в ‘0’ запрещая прерывания, адрес возврата из подпрограммы обработки прерываний помещается в стек, а в счетчик команд PC загружается вектор прерывания 0004h. Источник прерываний может быть определен проверкой флагов прерываний, которые должны быть сброшены программно перед разрешением прерываний, чтобы избежать повторного вызова.
Цитата При возвращении из подпрограммы обработки прерывания, по команде RETFIE, бит GIE аппаратно устанавливается в ‘1 ’ разрешая все немаскированные прерывания.
|
|
|
|
vladh |
Дата: Вт, 15.09.2015, 15:28 | Сообщение # 32 |
Группа:
Проверенные
Ранг:
Помогаю всем
Сообщений:
258
Замечания:
±
На сайте с 15.10.2007
Статус:
Offline
|
Цитата ivan_fd ( ) Это делает не компилятор. Вы, что не читаете даташиты? Ну конечно же читаю. Но не всё. и не каждый раз, как в общем то делает большинство, и я подозреваю и Иван. Во первых откуда эта цитата? А теперь из процитированного объясните, каким образом МК узнал, где у нас подпрограмма обработки прерываний? Как он туда попадает?
|
|
|
|
ADMIN |
Дата: Вт, 15.09.2015, 16:02 | Сообщение # 33 |
Администратор
Группа:
Администраторы
Ранг:
Специалист
Сообщений:
1086
Замечания:
±
На сайте с 20.08.2007
Статус:
Offline
|
У микроконтроллеров PIC вектор прерывания жестко определен по адресу 0х0004. Это следует из даташитов на микроконтроллеры. Если открыть любую ассемблерную листовку, можно увидеть директиву ORG 0 - это начало выполнения программы. Директива ORG 4 указывает на адрес нахождения обработчика прерывания. Попадает программа туда автоматически по совокупности битов разрешения различных прерываний.
|
|
|
|
ivan_fd |
Дата: Вт, 15.09.2015, 16:06 | Сообщение # 34 |
Группа:
Модераторы
Ранг:
Специалист
Сообщений:
894
Замечания:
±
На сайте с 12.01.2009
Статус:
Offline
|
Это цитата из даташита. И как админ уже написал, МК знает, он это делает на железном уровне.
|
|
|
|
vladh |
Дата: Вт, 15.09.2015, 16:32 | Сообщение # 35 |
Группа:
Проверенные
Ранг:
Помогаю всем
Сообщений:
258
Замечания:
±
На сайте с 15.10.2007
Статус:
Offline
|
Цитата ivan_fd ( ) Это цитата из даташита. И как админ уже написал, МК знает, он это делаетна железном уровне. Вообще когда приводите цитаты необходимо указывать на источник. Даташитов разных много. Ну в данном случае уже не важно. Да, ADMIN убедил меня в том что в МК серии ПИК в памяти отведена область начиная с адреса 04, в которую записывается подпрограмма обработки прерываний. Следовательно при возникновении разрешенного прерывания МК переходит автоматом на подпрограмму по этому адресу, отключая при этом бит GIE. В этом Иван Вы правы. Хотя если честно мне все равно куда записывается моя подпрограмма и кто отключает этот бит, МК или компилятор, главное, что отключают.
Сообщение отредактировал
vladh - Вт, 15.09.2015, 16:40
|
|
|
|
vladh |
Дата: Вт, 22.09.2015, 10:15 | Сообщение # 36 |
Группа:
Проверенные
Ранг:
Помогаю всем
Сообщений:
258
Замечания:
±
На сайте с 15.10.2007
Статус:
Offline
|
Кстати, забыл здесь отчитаться в том, что удалось таки заставить работать 485 канал связи. Правда это было сделано с Помощью Kazus'а. В том числе и Анатолия. Я прикладываю здесь решение. Но вот вчера нашел вариант без использования высокоуровневых команд. Есл кому то это интересно я потом могу выложить их здесь.
|
|
|
|
vladh |
Дата: Ср, 23.09.2015, 06:55 | Сообщение # 37 |
Группа:
Проверенные
Ранг:
Помогаю всем
Сообщений:
258
Замечания:
±
На сайте с 15.10.2007
Статус:
Offline
|
Вчера выявилась еще одна беда. Причины её и способ решения никак не могу найти. В приложенном примере все работает хорошо. Пока принимаются по два байта. Но мне вообще то надо пересылать по 6 байт. Я переделал код(файлы с расширением в названии есть слово new) и стал пробовать передавать-принимать. Передача вроде идет без проблем (для версии S232), а вот прием - плохо. Не принимаются все байты. Проходят только два байта, а все последующие пропадают и МК непонятно чем начинает заниматься. Может у кого есть какие соображения на этот счет? Я снова прикладываю пример. Файлы кодов в названиях которых присутствует new, это файлы с большим числом пересылаемых параметров.
Сообщение отредактировал
vladh - Ср, 23.09.2015, 08:36
|
|
|
|
ivan_fd |
Дата: Ср, 23.09.2015, 10:43 | Сообщение # 38 |
Группа:
Модераторы
Ранг:
Специалист
Сообщений:
894
Замечания:
±
На сайте с 12.01.2009
Статус:
Offline
|
А где Вы принимаете 6 байт? Вижу только 2.
Я бы сделал прием прямо в прерывании, но не через HSerIn, а командами ассемблера, так надежнее.
|
|
|
|
vladh |
Дата: Ср, 23.09.2015, 11:04 | Сообщение # 39 |
Группа:
Проверенные
Ранг:
Помогаю всем
Сообщений:
258
Замечания:
±
На сайте с 15.10.2007
Статус:
Offline
|
Цитата ivan_fd ( ) А где Вы принимаете 6 байт? Вижу только 2. А Вы подключите к контроллерам файлы: Adin_rab_new.* и Pult_rab_new.*. Цитата ivan_fd ( ) Я бы сделал прием прямо в прерывании, но не через HSerIn,а командами ассемблера, так надежнее. Поскольку асм-ом я не пользуюсь(мне конечно стыдно но я его не знаю), то такой вариант для себя я исключаю. Я правда вместо команды HSerIn делал поочередное считывание из регистра RCREG. Что то типа:
B1 = RCREG if n=0 then Perem=B1 if n=1 then Reg=B1 if n=2 then Tok_k = B1 ............. inc n
Но программа считывала только 2 байта. Это похоже связано с тем, что этот регистр двухбайтовый. Но как решить эту заковыку ничего не могу сообразить.
Сообщение отредактировал
vladh - Ср, 23.09.2015, 11:06
|
|
|
|
ivan_fd |
Дата: Ср, 23.09.2015, 12:22 | Сообщение # 40 |
Группа:
Модераторы
Ранг:
Специалист
Сообщений:
894
Замечания:
±
На сайте с 12.01.2009
Статус:
Offline
|
Цитата vladh ( ) А Вы подключите к контроллерам файлы Как раз они и подключены. В файле
Код ****************** ' Подпрограмма приема данных по РС232 '***************** RS232_in: HSerIn [A, Perem] DelayUS 20 Pr_k = 0 PIE1.5 = 1 Return Где здесь прием 6 байт?
|
|
|
|
vladh |
Дата: Ср, 23.09.2015, 12:30 | Сообщение # 41 |
Группа:
Проверенные
Ранг:
Помогаю всем
Сообщений:
258
Замечания:
±
На сайте с 15.10.2007
Статус:
Offline
|
Цитата ivan_fd ( ) Как раз они и подключены. В файле Вы немного не туда смотрите. Это кусок кода, принимаемый пультом. Вы посмотрите ниже там где пульт передает. А второй контроллер этот код принимает.
|
|
|
|
ivan_fd |
Дата: Ср, 23.09.2015, 13:08 | Сообщение # 42 |
Группа:
Модераторы
Ранг:
Специалист
Сообщений:
894
Замечания:
±
На сайте с 12.01.2009
Статус:
Offline
|
Теперь посмотрел туда. У Вас переполняется буфер, следовательно устанавливается бит ошибки и логика приемника отключается.
Делайте как я Вам говорил.
В прерывании читайте по одному байту данные. Не забывайте сбрасывать бит ошибки. И, может еще, передавайте данные не все сразу, а делайте паузу между каждым байтом. А то Вы сразу лупите 6 байт а в приемнике еще и паузу в 1мс поставили.
Сообщение отредактировал
ivan_fd - Ср, 23.09.2015, 13:09
|
|
|
|
vladh |
Дата: Чт, 24.09.2015, 06:54 | Сообщение # 43 |
Группа:
Проверенные
Ранг:
Помогаю всем
Сообщений:
258
Замечания:
±
На сайте с 15.10.2007
Статус:
Offline
|
А Цитата ivan_fd ( ) И, может еще, передавайте данные не все сразу, а делайте паузу А как быть с примером(прилагается), который я нашел где то в И-нете? Там передаются сразу 8 байт. Правда как строковые переменные. В описании на контроллер сказано, что бит ошибки снимается отключением и повторным включение МК. Попробовал изменить раздел приема на вот этот:
Rs232_in: HSerIn [Perem,Reg] RCSTA.4 = 0 DelayUS 10 RCSTA.4 = 1 HSerIn [Tok_k,T_imp] RCSTA.4 = 0 DelayUS 10 RCSTA.4 = 1 HSerIn [T_paus, Dekr] RCSTA.4 = 0 DelayUS 10 RCSTA.4 = 1 Pr_k = 0 PIE1.5 = 1 Return
Ничего не изменилось.
Добавлено (24.09.2015, 05:35) --------------------------------------------- Странно, вчера пробовал последний вариант с отключением и включением приемника - не шло. Сегодня с утра вдруг пошло
Добавлено (24.09.2015, 06:53) --------------------------------------------- Ну вот, наконец разобрался. "Дело было не в бобине..." Всему виновата задержка, которая идет во второй строке после метки Main:. Т.е. по приходу данных от передатчика, срабатывало прерывание и программа уходила на его обработку. затем возвращаясь она могла попадать на эту задержку. И пока выдерживалась эта задержка приходящие данные (кроме первых двух байтов , сохраняющихся во входном буфере) уходили в небытие. Так что в остальном все работает как пишут в Кронхилл.
Добавлено (24.09.2015, 06:54) --------------------------------------------- Ну вот, наконец разобрался. "Дело было не в бобине..." Всему виновата задержка, которая идет в третьей строке после метки Main:. Т.е. по приходу данных от передатчика, срабатывало прерывание и программа уходила на его обработку. затем возвращаясь она могла попадать на эту задержку. И пока выдерживалась эта задержка приходящие данные (кроме первых двух байтов , сохраняющихся во входном буфере) уходили в небытие. Так что в остальном все работает как пишут в Кронхилл.
Сообщение отредактировал
vladh - Чт, 24.09.2015, 06:55
|
|
|
|