| Форум РадиоКот https://radiokot.ru/forum/ |
|
| Связь МК с PC по RS232 https://radiokot.ru/forum/viewtopic.php?f=58&t=112850 |
Страница 1 из 2 |
| Автор: | Hispanus [ Вс фев 01, 2015 22:47:46 ] |
| Заголовок сообщения: | Связь МК с PC по RS232 |
Здравствуйте! Написал простейшую программу (непрерывная передача символа) с помощью библиотечных функций, собрал схему на 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) { } } |
|
| Автор: | Smen [ Пн фев 02, 2015 07:00:38 ] |
| Заголовок сообщения: | Re: Связь МК с PC по RS232 |
Hispanus писал(а): непрерывная передача символа Для начала, так делать нельзя.Между байтами (или пакетами байт) необходимо вставлять защитный интервал длительностью не менее периода передачи одного байта, включая стартовый и стоповый биты. |
|
| Автор: | A. Fig Lee [ Вт фев 03, 2015 05:33:16 ] |
| Заголовок сообщения: | Re: Связь МК с PC по RS232 |
Это что за среда? Вот это: Код: transmit_usart() { TXREG= 'a'; } Это обработчик прерывания? Если да, то он отсюда никогда не выйдет. В прерывании надо сбрасывать флаг вызвавшего прерывания вручную, иначе будет крутится в бесконечном лупе. Код: transmit_usart()
{ TXREG= 'a'; TXIF = 0; } |
|
| Автор: | Hispanus [ Вт фев 03, 2015 14:44:18 ] |
| Заголовок сообщения: | Re: Связь МК с PC по RS232 |
A. Fig Lee, с битом TXIF как раз всё наоборот. Если он "0", то буфер передачи полон и его содержимое выгружается в сдвиговый регистр. После этого бит TXIF будет равен "1", что означает - буфер передачи пуст. К тому же этот бит сбрасывается и устанавливается аппаратно. Среда программирования - PIC C Compile. В протеусе эта программа работает, а значит МК всё таки выходит из прерывания. Smen, а разве МК не делает это сам, ведь USART аппаратный? |
|
| Автор: | Hispanus [ Ср фев 04, 2015 00:41:14 ] |
| Заголовок сообщения: | Re: Связь МК с PC по RS232 |
Сделал вот так - всё равно не заработало Код: #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) { } } |
|
| Автор: | A. Fig Lee [ Ср фев 04, 2015 02:45:42 ] |
| Заголовок сообщения: | Re: Связь МК с PC по RS232 |
Точно. про аппаратный сброс я и запамятовал |
|
| Автор: | Smen [ Пт фев 06, 2015 06:43:26 ] |
| Заголовок сообщения: | Re: Связь МК с PC по RS232 |
Hispanus писал(а): а разве МК не делает это сам, ведь USART аппаратный И что ж, что аппаратный?Откуда ему знать, где у Вас пакеты начинаются/заканчиваются, и какую паузу делать? Его "аппаратность" состоит в том, что он берёт байт из буфера, и помещает его в сдвиговый регистр, который выпихивает это всё в линию, вставляя стартовый и стоповый биты. И, если Вы будете всё время что-то записывать в буфер, передача так и будет, без пауз. P.S.: Что-то смотрю, у Вас все порты на выход настроены, а должны быть на вход. |
|
| Автор: | Hispanus [ Пт фев 06, 2015 19:47:08 ] |
| Заголовок сообщения: | Re: Связь МК с PC по RS232 |
Smen, а какие должны быть настроены на вход? я только как передатчик мк использую (но пробовал и так: PORTC=0b10000000) Я кажется понял где может быть проблема-почему то не запускается обработчик прерываний: Код: #int_tbe (буфер передачи пуст) void transmit() { PORTB=0b00000000; } или #int_default void transmit() { PORTB=0b0000000; } то есть порт В не обнуляется (первоначально он 0b00000001). Может я какой то бит забыл? |
|
| Автор: | Smen [ Сб фев 07, 2015 08:13:07 ] |
| Заголовок сообщения: | Re: Связь МК с PC по RS232 |
Hispanus писал(а): а какие должны быть настроены на вход? Порты передатчика и приёмника УАРТ.
|
|
| Автор: | -=Vovka=- [ Сб фев 07, 2015 11:58:11 ] |
| Заголовок сообщения: | Re: Связь МК с PC по RS232 |
Вообще-то оба на выход. Даташиты когда начнем читать? 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; // выключим передатчик } } |
|
| Автор: | Hispanus [ Сб фев 07, 2015 15:06:21 ] |
| Заголовок сообщения: | Re: Связь МК с PC по RS232 |
-=Vovka=-, а Вы не могли бы также и код инициализации передатчика в асинхроном режиме дернуть? |
|
| Автор: | Smen [ Сб фев 07, 2015 17:11:25 ] |
| Заголовок сообщения: | Re: Связь МК с PC по RS232 |
-=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 в самом верху большими буквами. |
|
| Автор: | Hispanus [ Сб фев 07, 2015 17:58:37 ] |
| Заголовок сообщения: | Re: Связь МК с PC по RS232 |
Smen, я читал ДШ в этом месте, но подумал, что здесь что то не так. Зачем настраивать вывод TX передатчика на вход, если он будет только на выход использоваться? Или я что то не так понял? |
|
| Автор: | -=Vovka=- [ Сб фев 07, 2015 18:51:47 ] |
| Заголовок сообщения: | Re: Связь МК с PC по RS232 |
Smen писал(а): -=Vovka=- писал(а): Вообще-то оба на выход. Даташиты когда начнем читать? Всегда умиляет, когда ламеры, не умеющие читать даташиты, с пафосом бывалого знатока, отсылают их читать. Еще раз глянул, да я неправ, на вход перестраиваются перед началом основного цикла. По поводу ламера: если я ламер, то какой у тебя опыт в программировании? ТС, вот тут посмотри: http://www.microchip.com/wwwAppNotes/AppNotes.aspx?appnote=en012073 |
|
| Автор: | A. Fig Lee [ Сб фев 07, 2015 19:11:09 ] |
| Заголовок сообщения: | Re: Связь МК с PC по RS232 |
Я бы ковырял так: перед входом в main loop посмотрел бы содержание регистров, которые относятся к портам, настройке частоты и RS232. Toже самое сделал бы для нерабочей программы. И сравнил. |
|
| Автор: | Hispanus [ Вс фев 08, 2015 00:20:51 ] |
| Заголовок сообщения: | Re: Связь МК с PC по RS232 |
Всем спасибо за ответы и советы! Всё дело было в порте D(наверное сжег его как-то неправильной полярностью подключения). Когда программа доходила до его инициализации, она останавливалась и дальше не шла. Поэтому-то флаг TXIF и не устанавливался. Убрал инициализацию порта D и все заработало. |
|
| Автор: | Smen [ Вс фев 08, 2015 08:47:24 ] |
| Заголовок сообщения: | Re: Связь МК с PC по RS232 |
Hispanus писал(а): Зачем настраивать вывод TX передатчика на вход Сам не знаю, зачем это так сделано, ведь согласно FIGURE 3-5 (для 877-го, или 4-6, для 877a, кстати, у Вас-то какой) сигналы Peripheral OE и выход защёлки TRIS складываются по "ИЛИ".Наверное, в этом есть какой-то более глубокий смысл. Hispanus писал(а): Когда программа доходила до его инициализации Что-то не вижу я в Вашей программе никакой инициализации порта D. Выдёргиваете куски из контекста? Что там, у Вас, ещё инициализируется? -=Vovka=- писал(а): если я ламер, то какой у тебя опыт в программировании? Только ламеры и чайники пишут для 877-го на Сях. Да что там для 877. Тут встретил, для PIC12-го. Но не в этом суть. Коли так режет слух, выкинь словосочетание про ламеров. Смысл фразы сильно изменился? Речь-то о культуре общения. Надеюсь, ты адекватен, и данный конфуз пойдёт тебе на пользу, и ты больше не будешь уподобляться отдельным личностям, вообразившими себя знатоками электроники, и вообще, "истинной в последней инстанции". P.S.: А пиписьками мериться я ни с кем не намерен. Коли хочешь, можешь меня тоже ламером считать.
|
|
| Автор: | -=Vovka=- [ Вс фев 08, 2015 09:40:18 ] |
| Заголовок сообщения: | Re: Связь МК с PC по RS232 |
Smen писал(а): -=Vovka=- писал(а): если я ламер, то какой у тебя опыт в программировании? Только ламеры и чайники пишут для 877-го на Сях. Да что там для 877. Тут встретил, для PIC12-го. И что? Какая разница на чем будет написано? Главное чтобы конечный результат работал правильно и без сбоев! Помнится в 90-х около недели писал драйвер на асм для 8086-го. А если бы на си то же самое делал, то за пару дней, с перекурами. Лично я редко пользуюсь асмом, т.к. время дорого. А на си и быстрее напишешь и алгоритм легче отлаживать, т.к. нагляднее. Может еще на перфокартах "писать" чтобы слыть крутым программером? Smen писал(а): Но не в этом суть. Коли так режет слух, выкинь словосочетание про ламеров. Смысл фразы сильно изменился? Речь-то о культуре общения. Надеюсь, ты адекватен, и данный конфуз пойдёт тебе на пользу, и ты больше не будешь уподобляться отдельным личностям, вообразившими себя знатоками электроники, и вообще, "истинной в последней инстанции". P.S.: А пиписьками мериться я ни с кем не намерен. Коли хочешь, можешь меня тоже ламером считать. ![]() Я к тому, что и "На старуху бывает...", а сразу рубить "Ламер"- это уже слишком! |
|
| Автор: | dosikus [ Вс фев 08, 2015 10:19:17 ] |
| Заголовок сообщения: | Re: Связь МК с PC по RS232 |
Smen писал(а): Только ламеры и чайники пишут для 877-го на Сях. Да что там для 877. Тут встретил, для PIC12-го. Весьма громкое заявление . Вот это писано в двух вариантах на сях и на асме https://www.youtube.com/watch?v=x4aycNs8J0Q По быстродействию и по размеру кода практически одинаково. Реализация BAM c чарлиплексингом на пЫк10F. Попробуй реализуй ... |
|
| Автор: | Smen [ Вс фев 08, 2015 11:42:01 ] |
| Заголовок сообщения: | Re: Связь МК с PC по RS232 |
-=Vovka=- писал(а): Может еще на перфокартах "писать" чтобы слыть крутым программером? Бывало и такое.С перфокартами, правда, не довелось, а вот ассемблерный код, по бинарнику восстанавливать доводилось. Ну, и не надо путать автоматизацию рутинных процессов с творческими. -=Vovka=- писал(а): сразу рубить "Ламер" Ну, вообще-то фраза была общей.Никто конкретный в ней не указывался. dosikus писал(а): Попробуй реализуй Сказал же, пиписьками не меряюсь.Лучше вот объясни, зачем действительно порты надо на вход настраивать, если из схемы в ДШ получается, что их вообще настраивать необязательно? |
|
| Страница 1 из 2 | Часовой пояс: UTC + 3 часа |
| Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group http://www.phpbb.com/ |
|


