Регистрация | Вход

[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 3 из 3
  • «
  • 1
  • 2
  • 3
Модератор форума: demanik, ivan_fd  
Форум Picbasic.ru » Программирование МК » Proton PicBasic » почему не работает RS485
почему не работает RS485
ivan_fd Дата: Вт, 15.09.2015, 13:26  |                                                                                                                Сообщение # 31
Группа: Модераторы
Ранг:  Специалист
Сообщений: 894
Репутация: 124   ±
Замечания:   ±
На сайте с 12.01.2009

Статус: Offline

Цитата vladh ()
Это сделал компилятор. А при выходе из этой подпрограммы компилятор его восстанавливает.


Это делает не компилятор. Вы, что не читаете даташиты?

Цитата
При переходе на подпрограмму обработки прерываний бит GIE аппаратно сбрасывается в ‘0’ запрещая прерывания, адрес возврата из подпрограммы обработки прерываний помещается в стек, а в счетчик команд PC загружается вектор прерывания 0004h. Источник прерываний может быть определен проверкой флагов прерываний, которые должны быть сброшены программно перед разрешением прерываний, чтобы избежать повторного вызова.


Цитата
При возвращении из подпрограммы обработки прерывания, по команде RETFIE, бит GIE аппаратно
устанавливается в ‘1 ’ разрешая все немаскированные прерывания.
ЯНДЕКС Дата: 15.09.2015
vladh Дата: Вт, 15.09.2015, 15:28  |                                                                                                                Сообщение # 32
Группа: Проверенные
Ранг:  Помогаю всем
Сообщений: 258
Репутация: 11   ±
Замечания:   ±
На сайте с 15.10.2007

Статус: Offline

Цитата ivan_fd ()
Это делает не компилятор. Вы, что не читаете даташиты?
Ну конечно же читаю. Но не всё. и не каждый раз, как в общем то делает большинство, и я подозреваю и Иван. Во первых откуда эта цитата? А теперь из процитированного объясните, каким образом МК узнал, где у нас подпрограмма обработки прерываний? Как он туда попадает?
ADMIN Дата: Вт, 15.09.2015, 16:02  |                                                                                                                Сообщение # 33
Администратор
Группа: Администраторы
Ранг:  Специалист
Сообщений: 1087
Репутация: 32   ±
Замечания:   ±
На сайте с 20.08.2007

Статус: Offline

У микроконтроллеров PIC вектор прерывания жестко определен по адресу 0х0004. Это следует из даташитов на микроконтроллеры. Если открыть любую ассемблерную листовку, можно увидеть директиву ORG 0 - это начало выполнения программы. Директива ORG 4 указывает на адрес нахождения обработчика прерывания. Попадает программа туда автоматически по совокупности битов разрешения различных прерываний.
ivan_fd Дата: Вт, 15.09.2015, 16:06  |                                                                                                                Сообщение # 34
Группа: Модераторы
Ранг:  Специалист
Сообщений: 894
Репутация: 124   ±
Замечания:   ±
На сайте с 12.01.2009

Статус: Offline

Это цитата из даташита. И как админ уже написал, МК знает, он это делает
на железном уровне.
vladh Дата: Вт, 15.09.2015, 16:32  |                                                                                                                Сообщение # 35
Группа: Проверенные
Ранг:  Помогаю всем
Сообщений: 258
Репутация: 11   ±
Замечания:   ±
На сайте с 15.10.2007

Статус: Offline

Цитата ivan_fd ()
Это цитата из даташита. И как админ уже написал, МК знает, он это делаетна железном уровне.
Вообще когда приводите цитаты необходимо указывать на источник. Даташитов разных много. Ну в данном случае уже не важно. Да, ADMIN убедил меня в том что в МК серии ПИК в памяти отведена область начиная с адреса 04, в которую записывается подпрограмма обработки прерываний. Следовательно при возникновении разрешенного прерывания МК переходит автоматом на подпрограмму по этому адресу, отключая при этом бит GIE. В этом Иван Вы правы. Хотя если честно мне все равно куда записывается моя подпрограмма и кто отключает этот бит, МК или компилятор, главное, что отключают.

Сообщение отредактировал vladh - Вт, 15.09.2015, 16:40
vladh Дата: Вт, 22.09.2015, 10:15  |                                                                                                                Сообщение # 36
Группа: Проверенные
Ранг:  Помогаю всем
Сообщений: 258
Репутация: 11   ±
Замечания:   ±
На сайте с 15.10.2007

Статус: Offline

Кстати, забыл здесь отчитаться в том, что удалось таки заставить работать 485 канал связи. Правда это было сделано с Помощью Kazus'а. В том числе и Анатолия. Я прикладываю здесь решение. Но вот вчера нашел вариант без использования высокоуровневых команд. Есл кому то это интересно я потом могу выложить их здесь.
Прикрепления: Uresano.rar (131.5 Kb)
vladh Дата: Ср, 23.09.2015, 06:55  |                                                                                                                Сообщение # 37
Группа: Проверенные
Ранг:  Помогаю всем
Сообщений: 258
Репутация: 11   ±
Замечания:   ±
На сайте с 15.10.2007

Статус: Offline

Вчера выявилась еще одна беда. Причины её и способ решения никак не могу найти. В приложенном примере все работает хорошо. Пока принимаются по два байта. Но мне вообще то надо пересылать по 6 байт. Я переделал код(файлы с расширением в названии есть слово new) и стал пробовать передавать-принимать. Передача вроде идет без проблем (для версии S232), а вот прием - плохо. Не принимаются все байты. Проходят только два байта, а все последующие пропадают и МК непонятно чем начинает заниматься. Может у кого есть какие соображения на этот счет? Я снова прикладываю пример. Файлы кодов в названиях которых присутствует new, это файлы с большим числом пересылаемых параметров.
Прикрепления: Rabochij.rar (218.9 Kb)

Сообщение отредактировал vladh - Ср, 23.09.2015, 08:36
ivan_fd Дата: Ср, 23.09.2015, 10:43  |                                                                                                                Сообщение # 38
Группа: Модераторы
Ранг:  Специалист
Сообщений: 894
Репутация: 124   ±
Замечания:   ±
На сайте с 12.01.2009

Статус: Offline

А где Вы принимаете 6 байт? Вижу только 2.

Я бы сделал прием прямо в прерывании, но не через HSerIn,
а командами ассемблера, так надежнее.
vladh Дата: Ср, 23.09.2015, 11:04  |                                                                                                                Сообщение # 39
Группа: Проверенные
Ранг:  Помогаю всем
Сообщений: 258
Репутация: 11   ±
Замечания:   ±
На сайте с 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
Репутация: 124   ±
Замечания:   ±
На сайте с 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
Репутация: 11   ±
Замечания:   ±
На сайте с 15.10.2007

Статус: Offline

Цитата ivan_fd ()
Как раз они и подключены. В файле
Вы немного не туда смотрите. Это кусок кода, принимаемый пультом. Вы посмотрите ниже там где пульт передает. А второй контроллер этот код принимает.
ЯНДЕКС Дата: 23.09.2015
ivan_fd Дата: Ср, 23.09.2015, 13:08  |                                                                                                                Сообщение # 42
Группа: Модераторы
Ранг:  Специалист
Сообщений: 894
Репутация: 124   ±
Замечания:   ±
На сайте с 12.01.2009

Статус: Offline

Теперь посмотрел туда. У Вас переполняется буфер, следовательно устанавливается бит ошибки и
логика приемника отключается.

Делайте как я Вам говорил.

В прерывании читайте по одному байту данные. Не забывайте сбрасывать
бит ошибки.
И, может еще, передавайте данные не все сразу, а делайте паузу
между каждым байтом. А то Вы сразу лупите 6 байт а в приемнике еще и паузу в 1мс поставили.

Сообщение отредактировал ivan_fd - Ср, 23.09.2015, 13:09
vladh Дата: Чт, 24.09.2015, 06:54  |                                                                                                                Сообщение # 43
Группа: Проверенные
Ранг:  Помогаю всем
Сообщений: 258
Репутация: 11   ±
Замечания:   ±
На сайте с 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)
---------------------------------------------
Странно, вчера пробовал последний вариант с отключением и включением приемника - не шло. Сегодня с утра вдруг пошло happy

Добавлено (24.09.2015, 06:53)
---------------------------------------------
Ну вот, наконец разобрался. "Дело было не в бобине..." Всему виновата задержка, которая идет во второй строке после метки Main:. Т.е. по приходу данных от передатчика, срабатывало прерывание и программа уходила на его обработку. затем возвращаясь она могла попадать на эту задержку. И пока выдерживалась эта задержка приходящие данные (кроме первых двух байтов , сохраняющихся во входном буфере) уходили в небытие. Так что в остальном все работает как пишут в Кронхилл.

Добавлено (24.09.2015, 06:54)
---------------------------------------------
Ну вот, наконец разобрался. "Дело было не в бобине..." Всему виновата задержка, которая идет в третьей строке после метки Main:. Т.е. по приходу данных от передатчика, срабатывало прерывание и программа уходила на его обработку. затем возвращаясь она могла попадать на эту задержку. И пока выдерживалась эта задержка приходящие данные (кроме первых двух байтов , сохраняющихся во входном буфере) уходили в небытие. Так что в остальном все работает как пишут в Кронхилл.
Прикрепления: Hserin.rar (74.5 Kb)

Сообщение отредактировал vladh - Чт, 24.09.2015, 06:55
Форум Picbasic.ru » Программирование МК » Proton PicBasic » почему не работает RS485
  • Страница 3 из 3
  • «
  • 1
  • 2
  • 3
Поиск: