ILYCHOFF
Feb 3 2006, 13:32
Пытаюсь передать на комп информацию, а передаются какие-то непонятные символы. С железом вроде все нормально. Спаяно правильно. Прием передача рааботает. На компе использую прогу RS 232 Pro, но пробовал и другие тоже самое. Помогите пожалуйста разобраться в чем причина. Проц мега16, кварц 4 МГц.
Вот прога:
#include <mega16.h>
// Standard Input/Output functions
#include <stdio.h>
#include <delay.h>
// Declare your global variables here
void main(void)
{
PORTA=0xFF;
DDRA=0x00;
PORTB=0xFF;
DDRB=0x00;
PORTC=0x00;
DDRC=0xFF;
// USART initialization
// Communication Parameters: 8 Data, 1 Stop, No Parity
// USART Receiver: Off
// USART Transmitter: On
// USART Mode: Asynchronous
// USART Baud rate: 9600
UCSRA=0x00;
UCSRB=0x08;
UCSRC=0x86;
UBRRH=0x00;
UBRRL=0x19;
for (;;)
{
putsf("RT000");
delay_ms(500);
};
}
могу и ошибаться, но настроен ли дефолтный выход на usart?
ILYCHOFF
Feb 3 2006, 14:35
какой выход дефолтный???
ilya514
Feb 3 2006, 14:40
У меня та же самая проблема, только с Atmega8
ILYCHOFF
Feb 3 2006, 14:44
И как ее устранить я уже чего только не пробовал...
Harvester
Feb 3 2006, 15:01
Возможные причины:
1. в терминалке на ПК установлены другие параметры
2. Неправильно прошиты FUSES, из-за чего AVR работает не на 4 МГц => скорость не 9600
defunct
Feb 3 2006, 18:15
по программной части вроде бы все верно.
тут только сомнения относительно putsf().
попробуйте, для начала отправлять просто константу.
Код
void main(void)
{
...
for (;;)
{
UDR = 'R';
delay_ms( .. );
}
}
ILYCHOFF
Feb 6 2006, 06:28
Пробовал отправлять константу, тот же самый результат. У меня с ком портом связь через MAX 232, может быть это из-за того что микросхема инвертит выход, и как тогда с этим побороться, еще раз пропустить через нее сигнал??? или как то программно????
макс232 инвертит инвертированную логику, чтобы её мог комп понимать.
т.е. на микроконтроллере:
"1"=0 В
"0"=3.3 В
на компе:
"1"=9 (12) В
"0"=0 В
ILYCHOFF
Feb 6 2006, 06:53
А что нужно делать в данном случае. я проверяю в протеусе после контроллера все нормально, читаемые символы, после MAX 232 чушь какая-то.
Цитата(ILYCHOFF @ Feb 6 2006, 09:53)

А что нужно делать в данном случае. я проверяю в протеусе после контроллера все нормально, читаемые символы, после MAX 232 чушь какая-то.
Почитайте стандарт на RS232, какие логические уровни приняты для передачи на линии...
ILYCHOFF
Feb 6 2006, 09:17
Я не могу понять что я делаю не так, объясните неграмотному... уже все перепробовал наверняка кто-то уже это делал поделитесь рабочей схемой...плиз...
Sergio66
Feb 6 2006, 09:35
А что именно Вы видите на приемном конце? Есть ли какая нибудь закономерность между тем, что посылаете, и тем, что ловите?
ILYCHOFF
Feb 6 2006, 09:54
Вот прога
#include <mega16.h>
// Standard Input/Output functions
#include <stdio.h>
#include <delay.h>
// Declare your global variables here
void main(void)
{
PORTA=0xFF;
DDRA=0x00;
PORTB=0xFF;
DDRB=0x00;
PORTC=0x00;
DDRC=0xFF;
// USART initialization
// Communication Parameters: 8 Data, 1 Stop, No Parity
// USART Receiver: Off
// USART Transmitter: On
// USART Mode: Asynchronous
// USART Baud rate: 9600
UCSRA=0x00;
UCSRB=0x08;
UCSRC=0x86;
UBRRH=0x00;
UBRRL=0x19;
for (;;)
{
while (!(UCSRA.5));
UDR = ('1');
delay_ms(5);
};
}
Терминал RS232Pro
Это в ASCII
12:46:38> xяЂ
12:46:38> xяЂ
12:46:38> xяЂ
12:46:38> xяЂ
12:46:38> xяЂ
12:46:39> xяЂ
12:46:39> xяЂ
Это в HEX
12:47:52> 78 00 FF 80
12:47:52> 00
12:47:52> 78 00 FF 80
12:47:52> 00
12:47:52> 78 00 FF 80
12:47:52> 00
12:47:52> 78 00 FF 80
12:47:52> 00
Преобразователи типа: max232 ничего к передаваемой последовательности не добавляют/урезают. В этом случае единственное, что Вы не понимаете внешней вид посылки на линии RS232 (логические уровни, kay сегодня Вам их уже разъяснял). Так же у Вас может быть в схеме одно излишнее инвертирование (или 'не доинвертирование') , которое даст эффект изменения кода (к стати приемники и передатчики max232 с инвертированием)...
Так же при возникновении таких ошибок приемник и передатчик могут иметь разные настройки (скорость передачи, длина посылки, паритеты, стоп-биты...)
Sergio66
Feb 6 2006, 10:35
Так вроде бы никаких ошибок в настройках нет. А как настроена приемная часть? И, если я правильно понял, то на 1 переданный байт приходится аж 5 принятых. А что будет, если изменить передачу. Например, передавать такие коды: 0х01, 0х02, 0х04, и т.д. Что будет на приеме? Попробуйте передать 7 байт вот таким образом и посмотрите, что на приемнем конце. И еще - проверьте структуру и в частности битовое поле USCRA.5!
ivan2006
Feb 6 2006, 13:15
2 ILYCHOFF
Цитата(ILYCHOFF @ Feb 6 2006, 12:54)

12:46:39> xяЂ
...
12:47:52> 78 00 FF 80
12:47:52> 00
Вообще эти символы (FF и 80) при неправильной работе с УАПП появляются очень часто.
FF вместо данных получается, например, если baudrate приемника в ~10 раз больше baudrate передатчика. т.е. пока передатчик отправил только один бит=1, приемник получил все 10.
Для предотвращения подобных ситуаций как раз и используют stop-биты.
Вторая ошибка может заключатся в лишнем инвертировании сигнала по пути от передатчика к приемнику, например нечто подобное получал, когда делал гальваническую развязку на оптронах и
перепутал местами два диода.
попробуйте поизменять baudrate на компе и посмотрите на полученные данные, с большой вероятностью проблема решится.
ILYCHOFF
Feb 6 2006, 13:41
у меня стоит кварц 4 МГц скорость 9600 ошибка составляет 0,2 % как CV пишет, может из-за этого такое происходить?
смотрю осциллографом при передачи 0x01 с контроллера выходит стартовый бит лог. 0 затем первый бит данных - лог. 1 и до следующей посылки а после MAX232 сигнал полностью инвертирован, т. е. стартовый бит лог. 1, а не 0, так и должно быть ? для компа стартовый бит должен быть лог. 1 ???
Цитата(ILYCHOFF @ Feb 6 2006, 16:41)

у меня стоит кварц 4 МГц скорость 9600 ошибка составляет 0,2 % как CV пишет, может из-за этого такое происходить?
смотрю осциллографом при передачи 0x01 с контроллера выходит стартовый бит лог. 0 затем первый бит данных - лог. 1 и до следующей посылки а после MAX232 сигнал полностью инвертирован, т. е. стартовый бит лог. 1, а не 0, так и должно быть ? для компа стартовый бит должен быть лог. 1 ???
Вам же уже написали, что MAX232 - инвертирует!!! У ПК приемник с линии RS232 тоже должет инвертировать... значит данные должны приходить в нормальном виде (двойная инверсия - означает, что принятые данные не инвертированы). Анализировать их необходимо после приемника... И вникнуть ,что у Вас приемник считал на ПК. Пользуйтесь программными анализаторами протокола (для COM порта). На форуме по ним ссылок было достаточно.
попробуй открыть ком порт на разных скоростях, у тебя похоже скорости приёмника/передатчика несовпадают.
а если не поможет, то собери кабель вот по
этой схеме. я такой для сотового телефона делал, работает замечательно, главное включить сигналы DTR или RTS, а то питания не будет. А можно питание отдельно прикрутить, как описано
тут.
Цитата(kay @ Feb 6 2006, 17:32)

попробуй открыть ком порт на разных скоростях, у тебя похоже скорости приёмника/передатчика несовпадают.
а если не поможет, то собери кабель вот по
этой схеме. я такой для сотового телефона делал, работает замечательно, главное включить сигналы DTR или RTS, а то питания не будет. А можно питание отдельно прикрутить, как описано
тут.
Да проблема уже понятна давным-давно! Но советы и рекомендации инициатор темы не воспринимает...
Уважаемый, ILYCHOFF.
Это выглядит так: (МК[передатчик/приемник] - RS232 - [передатчик/приемник]ПК): скорость приема (Baud Rate), количество бит данных (Data), бит паритета (Parity), стоповые биты (SBit) -
должны быть одинаковыми!!!
В первую очередь заняться надо проверкой именно этого.
Выкладывайте код инициализации UART для МК и ПК, будем смотреть!
P.S. А кабель пока надо попробовать по нуль-модемному варианту.
Где можно скачать программу RS 232 Pro? Существует ли подобная программа для RS 485?
defunct
Feb 6 2006, 22:56
Цитата(ILYCHOFF @ Feb 6 2006, 11:54)

UDR = ('1');
...
Это в ASCII
12:46:38> xяЂ
Это в HEX
12:47:52> 78 00 FF 80
'1' = $31 (00110001) у Вас растягивается в 0000000111111111000000001111, следовательно два варианта, либо частота чипа меньше в 4 раза, либо делитель уарта больше в 4 раза. Последнее исключается, т.к. в программе четко видно как Вы задаете делитель УАРТа. Остается только вариант с пониженной частотой тактирования чипа в 4 раза. 4Mhz/4 = 1Mhz. 1Mhz - это частота внутреннего RC генератора, и именно на работу от внутреннего генератора Mega16 настраивается заводом-изготовителем.
Запрограммируйте Low Fuse Byte, биты CKSEL=1111 для тактирования чипа от кварца.
ILYCHOFF
Feb 7 2006, 07:50
Разобрался. Всем большое спасибо, особенно defunct , причина была именно в этом проц считал с частотой 1 МГц. Тему можно закрывать. еще раз всем большое спасибо.....
Посоветуйте, пожалуйста, недорогую микросхему в DIP корпусе для того чтобы подключить контроллер с uart к com порту ПК на расстоянии одного метра и скоростью 57600 бит/с. Насколько я понимаю, на выходе TXD контроллера низкий логический уровень ~0 В, а высокий около напряжения питания (например 5 В). С другой стороны com порт воспринимает +11 В как единицу и -11 В как ноль. Выполняют ли такое преобразование микросхемы типа max232 (помимо инверсии)?
defunct
Mar 15 2006, 02:53
Цитата(AVR @ Mar 15 2006, 01:43)

С другой стороны com порт воспринимает +11 В как единицу и -11 В как ноль. Выполняют ли такое преобразование микросхемы типа max232 (помимо инверсии)?
Да. max232 - это преобразователь уровней RS <-> TTL.
Цитата(AVR @ Mar 15 2006, 01:43)

Насколько я понимаю, на выходе TXD контроллера низкий логический уровень ~0 В, а высокий около напряжения питания (например 5 В). С другой стороны com порт воспринимает +11 В как единицу и -11 В как ноль.
Думаю, если Вы не делаете промышленное устройство, то простого инвертора на одном транзисторе (по каждому каналу) будет достаточно. Из собственных экпериментов точно знаю, что COM порт компьютера нормально воспринимает уровни TTL так:
меньше 3V- лог. 1
больше 3V -лог. 0
Цитата(defunct @ Mar 15 2006, 05:53)

Думаю, если Вы не делаете промышленное устройство, то простого инвертора на одном транзисторе (по каждому каналу) будет достаточно. Из собственных экпериментов точно знаю, что COM порт компьютера нормально воспринимает уровни TTL так:
меньше 3V- лог. 1
больше 3V -лог. 0
Большое спасибо за совет, такой вариант действительно работает
Правда при приёме (при передаче такого не наблюдается) на компьютере периодически (раз в пол минуты и длится секунд десять) в rs232pro видно как набегают помехи, что видимо связано с малым запасом помехоустойчивости (у меня "1" - ~0 В, "0" - +5 В). Можно ли это как-то побороть?
defunct
Mar 17 2006, 04:23
Цитата(AVR @ Mar 16 2006, 23:02)

в rs232pro видно как набегают помехи, что видимо связано с малым запасом помехоустойчивости (у меня "1" - ~0 В, "0" - +5 В). Можно ли это как-то побороть?
Pull-up на коллектор транзистора "сбоящего" канала поменьше поставьте ~500om-1kom..
alekseykoj
Mar 17 2006, 08:46
У тебя не согласована скорость между компьютером и микроконтроллером. Еще внимательнее проверь настройки USART
Цитата(defunct @ Mar 17 2006, 07:23)

Pull-up на коллектор транзистора "сбоящего" канала поменьше поставьте ~500om-1kom..
У меня вместо транзистора схема 3ИЛИ-НЕ (другой под рукой не оказалось =( ) с объединенными тремя входами в один.
Цитата(alekseykoj @ Mar 17 2006, 11:46)

У тебя не согласована скорость между компьютером и микроконтроллером. Еще внимательнее проверь настройки USART
Скорость нормально согласована, т.к. когда я непрерывно в течении нескольких минут что-то передаю в компьютер, вся посылка доходит без каких-либо искажений, когда же ничего не передаю, временами принимается "каша"...
defunct
Mar 17 2006, 10:42
Цитата(AVR @ Mar 17 2006, 11:49)

У меня вместо транзистора схема 3ИЛИ-НЕ (другой под рукой не оказалось =( ) с объединенными тремя входами в один.
хм.. элемент 3ИЛИ-НЕ взависимости от серии может творить чудеса с уровнями.. т.е. чистых 5V он вам не дает. Прикрепил простенькие рабочие схемки.
2 AVR
Если нет под рукой преобразователя уровней RS232, то советую применить схему "токовая петля" (см. в прикрепленном файле), она во-первых, обеспечивает корректное преобразование уровней, во-вторых, обеспечивает гальваническю развязку между AVR и РС, в-третьих, простая. Для того, чтобы заработало в RS232pro выставьте уровни сигналов DTR и RTS как показано на схеме.
Если все-таки остановитесь на схеме предложенной defunct, то советую параллельно переходу база-эмиттер транзистора, подключенного базой к Тх ком-порта, подключить диод катодом к базе, дабы защитить переход база-эмиттер от отрицательного напряжения (которое может на некоторых портах достигать -12В, а на базе транзистора в схеме -6В, что уже многовато будет...)
defunct
Mar 17 2006, 21:28
Цитата(Old1 @ Mar 17 2006, 23:13)

то советую параллельно переходу база-эмиттер транзистора, подключенного базой к Тх ком-порта, подключить диод катодом к базе, дабы защитить переход база-эмиттер от отрицательного напряжения
imho если ставить диод, то лучше последовательно перед резистром R2 анодом к Tx COM порта..
Цитата(defunct @ Mar 18 2006, 01:28)

Цитата(Old1 @ Mar 17 2006, 23:13)

то советую параллельно переходу база-эмиттер транзистора, подключенного базой к Тх ком-порта, подключить диод катодом к базе, дабы защитить переход база-эмиттер от отрицательного напряжения
imho если ставить диод, то лучше последовательно перед резистром R2 анодом к Tx COM порта..
Можно и так, но "на лету" добавить диод проще моим способом, хотя при макетировании это не актуально...
Глупый вопрос не по теме (прошу не судить строго новичка):
Существует ли в интернете электронный каталог, в котором бы все электронные компоненты были отсортированы по их функционального назначению? Например, если в магазине нет какой-то микросхемы, чтобы можно было бы найти её аналог.
ILYCHOFF
May 12 2006, 10:01
В каталоге фирмы Промэлектроника
www.promelec.ru
Alex3742
Jun 30 2006, 05:48
Я тоже пытался связаться по 232, правда МК у меня AT90S2313, микросхема МАХ 232. Использовал
Advanced Serial Port Monitor и RS232pro, и еще что-то(не помню). Если я правильно помню, то в ДШ
на конкретный МК есть таблицы ошибок скоростей передачи при стандартных частотах кварца.
Кварц у меня 3.579545Mhz, по ДШ и Applicatiom Builder-у это ошибка в 1.3%, однако у меня данные передавались и принимались без ошибок. Затем я поставил кварц (в ту же схему) на 4Mhz, и уменя
пошли всякие кракозябры... ХОТЯ по ДШ и Апп Билдеру ошибка составляет 0.2%...странно
Я сам новичок, но мне кажется что дело может быть в кварце. Я думаю что огромное значение
имеет производитель. (кварц с которым все работало стоил 15р, а скоторым нет-2р

)
Может быть поможет замена кварца? Удачи!
Shurmas
Jun 30 2006, 07:12
Цитата(ILYCHOFF @ Feb 3 2006, 17:32)

Проц мега16, кварц 4 МГц.
Проверьте правильность установки бадрейта, убедитесь что мега работает на нужно частоте.
У меня с преобразователем adm203 заработало только после подключения резистора на 4,7 кОм между Rx и Tx МК....
Shurmas
Jun 30 2006, 07:36
Цитата(AVR @ Mar 19 2006, 20:12)

Глупый вопрос не по теме (прошу не судить строго новичка):
Существует ли в интернете электронный каталог, в котором бы все электронные компоненты были отсортированы по их функционального назначению? Например, если в магазине нет какой-то микросхемы, чтобы можно было бы найти её аналог.
я видел обзор таких каталогов на [banned]/01.htm
Цитата(Alex3742 @ Jun 30 2006, 08:48)

Я тоже пытался связаться по 232, правда МК у меня AT90S2313, микросхема МАХ 232. Использовал
Advanced Serial Port Monitor и RS232pro, и еще что-то(не помню). Если я правильно помню, то в ДШ
на конкретный МК есть таблицы ошибок скоростей передачи при стандартных частотах кварца.
Кварц у меня 3.579545Mhz, по ДШ и Applicatiom Builder-у это ошибка в 1.3%, однако у меня данные передавались и принимались без ошибок. Затем я поставил кварц (в ту же схему) на 4Mhz, и уменя
пошли всякие кракозябры... ХОТЯ по ДШ и Апп Билдеру ошибка составляет 0.2%...странно
Я сам новичок, но мне кажется что дело может быть в кварце. Я думаю что огромное значение
имеет производитель. (кварц с которым все работало стоил 15р, а скоторым нет-2р

)
Может быть поможет замена кварца? Удачи!
Может меня специалисты поправят, но RS протокол работает сносно и при 3% ошибки (где-то когда-то прочитал)! А от кварца требуется стабильность выдаваемой частоты. А для отладки обмена предлагаю следующий метод (сам периодически пользуюсь):
Приемник и передатчик постоянно передает по своей линии байт 0х55 (или 0хАА) и двухлучевым осциллографом сравниваются длительности и количество стартовых и стоповых бит. Все наглядно!
Alex3742
Jun 30 2006, 10:48
Цитата(IEC @ Jun 30 2006, 15:05)

Цитата(Alex3742 @ Jun 30 2006, 08:48)

Я тоже пытался связаться по 232, правда МК у меня AT90S2313, микросхема МАХ 232. Использовал
Advanced Serial Port Monitor и RS232pro, и еще что-то(не помню). Если я правильно помню, то в ДШ
на конкретный МК есть таблицы ошибок скоростей передачи при стандартных частотах кварца.
Кварц у меня 3.579545Mhz, по ДШ и Applicatiom Builder-у это ошибка в 1.3%, однако у меня данные передавались и принимались без ошибок. Затем я поставил кварц (в ту же схему) на 4Mhz, и уменя
пошли всякие кракозябры... ХОТЯ по ДШ и Апп Билдеру ошибка составляет 0.2%...странно
Я сам новичок, но мне кажется что дело может быть в кварце. Я думаю что огромное значение
имеет производитель. (кварц с которым все работало стоил 15р, а скоторым нет-2р

)
Может быть поможет замена кварца? Удачи!
Может меня специалисты поправят, но RS протокол работает сносно и при 3% ошибки (где-то когда-то прочитал)! А от кварца требуется стабильность выдаваемой частоты. А для отладки обмена предлагаю следующий метод (сам периодически пользуюсь):
Приемник и передатчик постоянно передает по своей линии байт 0х55 (или 0хАА) и двухлучевым осциллографом сравниваются длительности и количество стартовых и стоповых бит. Все наглядно!
То есть все-таки стабильность частоты?
_Ie0nid
Sep 30 2008, 02:35
Добрый день. Кто может помочь?
Пользуюсь терминалом версии 1.9 Б. Пытаюсь организовать кольцо, чтобы сигнал с компьютера дошел до меги16, и обратно в терминал. Столкнулся с рядом трудностей. Первое когда пишешь программу типа
с = UDR
PORTA = 55
ОНа работает, светодиоды горят как надо.
КОгда пишешь что-то типа
С = UDR
UDR = C
ТЕрминал коннектиться и постоянно получает <0>, не остановить, ни чего сделать не реально.
И наконец когда приводишь что ни будь типа этого:
#include <avr/io.h>
#include <avr/delay.h>
#include <avr/interrupt.h> // для доступа к функции сей
#include <avr/signal.h> // для доступа к макросу интерупт
#include <stdio.h>
#include <string.h>
int c;
INTERRUPT(SIG_UART0_RECV)
{
c = UDR;
PORTB = c;
}
int main (void) //начало программы
{
DDRB = 0xFF; // все выводы порта B - выходы
UBRRH = 0;
UBRRL = 71;
UCSRA = 0x00;
UCSRB |= (1<<RXCIE)|(1<<TXCIE)|(1<<RXEN)|(1<<TXEN);// прерывание на прием, прием
UCSRC |= (1<<URSEL); // асинхронный,
UCSRC |= (1<<UCSZ1)|(1<<UCSZ0);
sei();
c = 0;
while (1);
}
Терминал так же конектиться, и получает тот же символ <0>, но в момент отправки символа останавливается. Однако светодиоды, подключенные к порту, свое состояние не меняют.
И потом, АВРстудия, вообще отказывается толково реагировать на флаг "Прием завершен", перескакивает в самое начало программы и начинает заново - это ненормально потому как нарушается вообще принцип прерывания.
И что насчет инверсии, МАХ правда инвертирует сигнал, или нет?
Заранее спасибо.
Цитата(_Ie0nid @ Sep 30 2008, 06:35)

Добрый день. Кто может помочь?
...
Может быть проблема в том, что у вас не описан обработчик прерывания по завершению передачи байта? Судя по настройкам у вас включены и приемник и передатчик, и разрешены прерывания от них. Насколько я помню у М16 отдельный адрес для прерывания по событию прием байта завершен и отдельный адрес для прерывания по событию передача байта завершена в векторе прерывания. Также есть адрес по событию пуст регистр УДР.
Если АВР студия некорректно симулирует прерывания, то скорее всего это ваша недоработка, вроде переход по вектору должен осуществляться правильно.
Цитата(smac @ Sep 30 2008, 10:33)

Может быть проблема в том, что у вас не описан обработчик прерывания по завершению передачи байта?
Именно - поэтому! Некоторые трансляторы заполняют неиспользуемые программой вектора командами перехода на адрес 0 - "мягий" рестарт. Другие - этого не делают, и программа попадает на "чужой" обработчик прерывания, или на какой-то "левый" участок кода...
Необходимо следить, чтобы всем разрешенным прерываниям был бы свой обработчик. В данном случае: разрешение прерывания по окончанию передачи небходимо убрать!
Для просмотра полной версии этой страницы, пожалуйста,
пройдите по ссылке.