Страница 1 из 2
Связь МК с PC по RS232
Добавлено: Вс фев 01, 2015 22:47:46
Hispanus
Здравствуйте!
Написал простейшую программу (непрерывная передача символа) с помощью библиотечных функций, собрал схему на max232, соединил с PC - всё работает: в гипертерминале отображаются полученные символы. Теперь написал ту же самую программу, но не использовал библиотечные функции, а настраивал модуль USART по даташиту. Соединил с РС по той же схеме и ничего, в гипертерминале ничего нет, хотя программа rs232 регистрирует активность порта. В чем может быть дело? Спасибо.
PS: в протеусе работают обе программы.
Программа без библиотечных функций:
Код: Выделить всё
#include <16f877.h>
#use delay(clock=4000000)
#fuses HS,NOWDT
void init_ports()
//Настройка портов
{
TRISA=0b00000000;
PORTA=0b00000000;
PORTB=0b00000001;
TRISB=0b00000000;
TRISC=0b00000000;
PORTC=0b00000000;
PORTD=0b00000000;
TRISD=0b00000000;
}
void int_on()
//Настройка прерываний
{
GIE=1;
//Глобальное разрешение прерываний
PEIE=1;
//Разрешение прерываний от периферийных устройств
}
void init_USART()
{
BRGH=0;
//Низкоскоростной режим уарт
SPBRG=51;
//Скорость передачи 1200 бод
SYNC=0;
//Асинхронный режим передачи
SPEN=1;
//Включить усарт
TXIE=1;
//Прерывание разрешено от уарт
TX9=0;
//8 разрядная передача
TXEN=1;
//Разрешить передачу данных по уарт, регистр пуст
}
#int_tbe
//буфер передачи пуст
void transmit_usart()
{
TXREG='a';
}
void main (void)
{
init_ports();
//Настройка портов
int_on();
//Настройка прерываний
init_USART();
//Настройка уарт
//При этом TXIF=1 - буфер передатчика пуст
while (1)
{
}
}
Re: Связь МК с PC по RS232
Добавлено: Пн фев 02, 2015 07:00:38
Smen
Hispanus писал(а):непрерывная передача символа
Для начала, так делать нельзя.
Между байтами (или пакетами байт) необходимо вставлять защитный интервал длительностью не менее периода передачи одного байта, включая стартовый и стоповый биты.
Re: Связь МК с PC по RS232
Добавлено: Вт фев 03, 2015 05:33:16
A. Fig Lee
Это что за среда?
Вот это:
Это обработчик прерывания?
Если да, то он отсюда никогда не выйдет.
В прерывании надо сбрасывать флаг вызвавшего прерывания вручную,
иначе будет крутится в бесконечном лупе.
Re: Связь МК с PC по RS232
Добавлено: Вт фев 03, 2015 14:44:18
Hispanus
A. Fig Lee, с битом TXIF как раз всё наоборот. Если он "0", то буфер передачи полон и его содержимое выгружается в сдвиговый регистр. После этого бит TXIF будет равен "1", что означает - буфер передачи пуст. К тому же этот бит сбрасывается и устанавливается аппаратно. Среда программирования - PIC C Compile. В протеусе эта программа работает, а значит МК всё таки выходит из прерывания. Smen, а разве МК не делает это сам, ведь USART аппаратный?
Re: Связь МК с PC по RS232
Добавлено: Ср фев 04, 2015 00:41:14
Hispanus
Сделал вот так - всё равно не заработало

(отключил прерывания)
Код: Выделить всё
#include <16f877.h>
#use delay(clock=4000000)
#fuses HS,NOWDT
void init_ports()
//Настройка портов
{
TRISA=0b00000000;
PORTA=0b00000000;
PORTB=0b00000001;
TRISB=0b00000000;
TRISC=0b00000000;
PORTC=0b00000000;
PORTD=0b00000000;
TRISD=0b00000000;
}
void init_USART()
{
BRGH=0;
//Низкоскоростной режим уарт
SPBRG=51;
//Скорость передачи 1200 бод
SYNC=0;
//Асинхронный режим передачи
SPEN=1;
//Включить усарт
TXIE=0;
//Прерывание запрещено от уарт
TX9=0;
//8 разрядная передача
TXEN=1;
//Разрешить передачу данных по уарт, регистр пуст
TXREG='f';
while(TRMT==0)
{
}
}
void main (void)
{
delay_ms(10);
init_ports();
//Настройка портов
init_USART();
//Настройка уарт
while (1)
{
}
}
Re: Связь МК с PC по RS232
Добавлено: Ср фев 04, 2015 02:45:42
A. Fig Lee
Точно. про аппаратный сброс я и запамятовал
Re: Связь МК с PC по RS232
Добавлено: Пт фев 06, 2015 06:43:26
Smen
Hispanus писал(а):а разве МК не делает это сам, ведь USART аппаратный
И что ж, что аппаратный?
Откуда ему знать, где у Вас пакеты начинаются/заканчиваются, и какую паузу делать?
Его "аппаратность" состоит в том, что он берёт байт из буфера, и помещает его в сдвиговый регистр, который выпихивает это всё в линию, вставляя стартовый и стоповый биты.
И, если Вы будете всё время что-то записывать в буфер, передача так и будет, без пауз.
P.S.: Что-то смотрю, у Вас все порты на выход настроены, а должны быть на вход.
Re: Связь МК с PC по RS232
Добавлено: Пт фев 06, 2015 19:47:08
Hispanus
Smen, а какие должны быть настроены на вход? я только как передатчик мк использую (но пробовал и так: PORTC=0b10000000) Я кажется понял где может быть проблема-почему то не запускается обработчик прерываний:
Код: Выделить всё
#int_tbe (буфер передачи пуст)
void transmit()
{
PORTB=0b00000000;
}
или
#int_default
void transmit()
{
PORTB=0b0000000;
}
то есть порт В не обнуляется (первоначально он 0b00000001). Может я какой то бит забыл?
Re: Связь МК с PC по RS232
Добавлено: Сб фев 07, 2015 08:13:07
Smen
Hispanus писал(а):а какие должны быть настроены на вход?
Порты передатчика и приёмника УАРТ.
Re: Связь МК с PC по RS232
Добавлено: Сб фев 07, 2015 11:58:11
-=Vovka=-
Вообще-то оба на выход. Даташиты когда начнем читать?
Setting the SPEN bit of the RCSTA register enables the EUSART and automatically configures the TX/CK I/O pin as an output. If the TX/CK pin is shared with an analog peripheral the analog I/O function must be disabled by clearing the corresponding ANSEL bit.
Вот дернул из рабочего проекта:
Код: Выделить всё
// передача
if( TXEN && TXIF ) { // Если разрешена передача и буфер передатчика пуст
if( bufCount<=RS485_BUF_SIZE ) { TXREG = bufRS485[bufCount]; bufCount++; }
else{
TXEN = 0; // выключим передатчик
}
}
Re: Связь МК с PC по RS232
Добавлено: Сб фев 07, 2015 15:06:21
Hispanus
-=Vovka=-, а Вы не могли бы также и код инициализации передатчика в асинхроном режиме дернуть?

Я подозреваю, что у меня там где то ошибка. Спасибо.
Re: Связь МК с PC по RS232
Добавлено: Сб фев 07, 2015 17:11:25
Smen
-=Vovka=- писал(а):Вообще-то оба на выход. Даташиты когда начнем читать?
Всегда умиляет, когда ламеры, не умеющие читать даташиты, с пафосом бывалого знатока, отсылают их читать.

Bit SPEN (RCSTA<7>) and bits TRISC<7:6> have to be set in order to to configure pins RC6/TX/CK and RC7/RX/DT as the Universal Synchronous Asynchronous Receiver Transmitter.
п 10.0
стр. 95 для 877
стр. 111 для 877a
в самом верху большими буквами.
Re: Связь МК с PC по RS232
Добавлено: Сб фев 07, 2015 17:58:37
Hispanus
Smen, я читал ДШ в этом месте, но подумал, что здесь что то не так. Зачем настраивать вывод TX передатчика на вход, если он будет только на выход использоваться? Или я что то не так понял?
Re: Связь МК с PC по RS232
Добавлено: Сб фев 07, 2015 18:51:47
-=Vovka=-
Smen писал(а):-=Vovka=- писал(а):Вообще-то оба на выход. Даташиты когда начнем читать?
Всегда умиляет, когда ламеры, не умеющие читать даташиты, с пафосом бывалого знатока, отсылают их читать.

Еще раз глянул, да я неправ, на вход перестраиваются перед началом основного цикла.
По поводу ламера: если я ламер, то какой у тебя опыт в программировании?
ТС, вот тут посмотри:
http://www.microchip.com/wwwAppNotes/AppNotes.aspx?appnote=en012073
Re: Связь МК с PC по RS232
Добавлено: Сб фев 07, 2015 19:11:09
A. Fig Lee
Я бы ковырял так:
перед входом в main loop
посмотрел бы содержание регистров, которые относятся к портам, настройке частоты и RS232.
Toже самое сделал бы для нерабочей программы. И сравнил.
Re: Связь МК с PC по RS232
Добавлено: Вс фев 08, 2015 00:20:51
Hispanus
Всем спасибо за ответы и советы! Всё дело было в порте D(наверное сжег его как-то неправильной полярностью подключения). Когда программа доходила до его инициализации, она останавливалась и дальше не шла. Поэтому-то флаг TXIF и не устанавливался. Убрал инициализацию порта D и все заработало.

Re: Связь МК с PC по RS232
Добавлено: Вс фев 08, 2015 08:47:24
Smen
Hispanus писал(а):Зачем настраивать вывод TX передатчика на вход
Сам не знаю, зачем это так сделано, ведь согласно FIGURE 3-5 (для 877-го, или 4-6, для 877a, кстати, у Вас-то какой) сигналы Peripheral OE и выход защёлки TRIS складываются по "ИЛИ".
Наверное, в этом есть какой-то более глубокий смысл.
Hispanus писал(а):Когда программа доходила до его инициализации
Что-то не вижу я в Вашей программе никакой инициализации порта D.

Выдёргиваете куски из контекста? Что там, у Вас, ещё инициализируется?

-=Vovka=- писал(а):если я ламер, то какой у тебя опыт в программировании?
Только ламеры и чайники пишут для 877-го на Сях.

Да что там для 877. Тут встретил, для PIC12-го.
Но не в этом суть. Коли так режет слух, выкинь словосочетание про ламеров. Смысл фразы сильно изменился?

Речь-то о культуре общения.
Надеюсь, ты адекватен, и данный конфуз пойдёт тебе на пользу, и ты больше не будешь уподобляться отдельным личностям, вообразившими себя знатоками электроники, и вообще, "истинной в последней инстанции".
P.S.: А пиписьками мериться я ни с кем не намерен. Коли хочешь, можешь меня тоже ламером считать.

Re: Связь МК с PC по RS232
Добавлено: Вс фев 08, 2015 09:40:18
-=Vovka=-
Smen писал(а):-=Vovka=- писал(а):если я ламер, то какой у тебя опыт в программировании?
Только ламеры и чайники пишут для 877-го на Сях.

Да что там для 877. Тут встретил, для PIC12-го.
И что? Какая разница на чем будет написано? Главное чтобы конечный результат работал правильно и без сбоев!
Помнится в 90-х около недели писал драйвер на асм для 8086-го. А если бы на си то же самое делал, то за пару дней, с перекурами.
Лично я редко пользуюсь асмом, т.к. время дорого. А на си и быстрее напишешь и алгоритм легче отлаживать, т.к. нагляднее.
Может еще на перфокартах "писать" чтобы слыть крутым программером?
Smen писал(а):Но не в этом суть. Коли так режет слух, выкинь словосочетание про ламеров. Смысл фразы сильно изменился?

Речь-то о культуре общения.
Надеюсь, ты адекватен, и данный конфуз пойдёт тебе на пользу, и ты больше не будешь уподобляться отдельным личностям, вообразившими себя знатоками электроники, и вообще, "истинной в последней инстанции".
P.S.: А пиписьками мериться я ни с кем не намерен. Коли хочешь, можешь меня тоже ламером считать.

Я к тому, что и "На старуху бывает...", а сразу рубить "Ламер"- это уже слишком!
Re: Связь МК с PC по RS232
Добавлено: Вс фев 08, 2015 10:19:17
dosikus
Smen писал(а):Только ламеры и чайники пишут для 877-го на Сях.

Да что там для 877. Тут встретил, для PIC12-го.
Весьма громкое заявление .
Вот это писано в двух вариантах на сях и на асме
https://www.youtube.com/watch?v=x4aycNs8J0Q По быстродействию и по размеру кода практически одинаково.
Реализация BAM c чарлиплексингом на
пЫк10F.
Попробуй реализуй ...
Re: Связь МК с PC по RS232
Добавлено: Вс фев 08, 2015 11:42:01
Smen
-=Vovka=- писал(а):Может еще на перфокартах "писать" чтобы слыть крутым программером?
Бывало и такое.
С перфокартами, правда, не довелось, а вот ассемблерный код, по бинарнику восстанавливать доводилось.
Ну, и не надо путать автоматизацию рутинных процессов с творческими.
-=Vovka=- писал(а):сразу рубить "Ламер"
Ну, вообще-то фраза была общей.
Никто конкретный в ней не указывался.
dosikus писал(а):Попробуй реализуй
Сказал же, пиписьками не меряюсь.
Лучше вот объясни, зачем действительно порты надо на вход настраивать, если из схемы в ДШ получается, что их вообще настраивать необязательно?