Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: 2-ве Mega8 по UART, CV, Proteus и отсутствие осциллографа
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему
B3v
Подскажите начинающему. Столкнулся с такой историей.
Инструментарий у меня: CodeVision, Proteus, программатор UNIPROF.
Осциллографа пока к сожалению нету, поэтому пользуюсь программным через звуковую.

В итоге мне нужно связать PC с Mega8 по RS485.
С налету ес-но не получилось.

Начал с того, что связал два MK по UART как на рис 1.

Нажмите для просмотра прикрепленного файла
рис.1 Паралельно с железом моделировал в Протеусе.

Для МК-1:
...............
...............
//char simvol;

while (1)
{
//Отправляем два символа в МК2
putchar('a');

delay_ms(10);

putchar('b');

//Ожидаем пока не придет 'c' от МК2
while (1)
{ //туповато, но думаю для экс-та пойдет
simvol=getchar();

if(simvol=='c')break;
}

// Для индикации прохода циклов просто поджигаем диод.
PORTC.5=1;

delay_ms(150);

//И тушим его
PORTC.5=0;

};
...............
...............

Для МК-2:
...............
...............
while (1)
{
//Ждем от МК1 'а'
while (1)
{
simvol=getchar();
if(simvol=='a')break;
}

//Ждем от МК1 'b'
while (1)
{
simvol=getchar();
if(simvol=='b')break;
}

//Поджигаем диод
PORTC.5=1;

delay_ms(15);

//Тушим
PORTC.5=0;

//Отправляем 'c' в МК1
putchar('c');

};
...............
...............

После включения все нормально: диоды перемигивают как и положено.

А на осцилограммах наблюдаю следующее:

Нажмите для просмотра прикрепленного файла
рис. 2. TxD МК1.

Нажмите для просмотра прикрепленного файла
рис. 3. TxD МК2

Т.е. через звуковую я вижу формы сигналов TTL.

А как же эпюры из Datasheet:
Нажмите для просмотра прикрепленного файла
рис. 4 Явно форма типа RS-232

Или в Протеусе. Форма тоже типа RS-232:
Нажмите для просмотра прикрепленного файла
рис. 5. hex-ы из текстов куски которых я показал выше.

Проясните пожалуйста, где правда. И почему через звуковую я вижу то что на рисунках 2 и 3.
Чудес ведь не бывает. Или я уже 01.gif .
bgc
одна проблема в схеме есть: светодиод без токоограничиваюшего резистора. Как сделано питание процессоров не знаю, но этого может быть достаточно, чтобы сбивать процессор (на первой осциллограмме амплитуда ниже...)
А вот с чем связана инверсия сигнала - из опубликованного мне не ясно.
B3v
Да, есть грех. Протеус схавал, а в железе там стоят по 510 Ом. На рис-х 2 и 3 амплитуды на самом деле одинаковые. Умоляю, не заставляйте признаться, что врет прога Soundcard Oszilloscope. Смотрел я ею и так и сяк, и двумя каналами, надо только сжимать развертку. Поверте на слово амплитуды одинаковые. Диоды перемигивали всю ночь без сбоя. Формы сигналов меня смущают.
Да и Sound Forg-ем захватывал:

Нажмите для просмотра прикрепленного файла
рис. 6. Это так сигналы от TxD процессоров выглядит в окне SoundForg. Т.е. тот же TTL.

Нажмите для просмотра прикрепленного файла
рис. 7. А так выглядит сигнал на Tx COM порта в том же SoundForg. Т.е. как по теории: "1"- низкий уровень, а "0" - высокий.

Может у кого есть возможность посмотреть осциллографом, или есть такой опыт. Буду очень произнателен.
С уважением Сергей.
MrYuran
Чё-то я не понял в чём проблема. Ну, инвертирует ваш "осцил" сигналы, чё ж с того?
Поменяйте проводки местами (из правой руки в левую, из левой в правую). В смысле "землю" и "сигнал".
Всё встанет на свои места.

Цитата(B3v @ Aug 6 2008, 11:57) *
рис. 7. А так выглядит сигнал на Tx COM порта в том же SoundForg. Т.е. как по теории: "1"- низкий уровень, а "0" - высокий.

На самом деле "высокий" в СОМ-порте это -12, "низкий" - +12В
B3v
Цитата(MrYuran @ Aug 6 2008, 13:14) *
Чё-то я не понял в чём проблема. Ну, инвертирует ваш "осцил" сигналы, чё ж с того?
Поменяйте проводки местами (из правой руки в левую, из левой в правую). В смысле "землю" и "сигнал".
Всё встанет на свои места.
На самом деле "высокий" в СОМ-порте это -12, "низкий" - +12В

Может это было бы итак. Но а какже то, что на рис-х 6 и 7. Земля у всей схемы одна:
Нажмите для просмотра прикрепленного файла
рис. 8.

По поводу уровней меня в школе учили так:
Нажмите для просмотра прикрепленного файла
рис. 9.

Или я ошибаюсь?
С уважением.
MrYuran
Нажмите для просмотра прикрепленного файла
Ещё раз:
UART (TTL): Start->"0" (0B), STOP->"1" (+5B)
COM (RS-232): Start->"0" (+12B), STOP->"1" (-12B)

На осциле картинки UART и RS-232 выглядят инверсно. Что вы и наблюдаете. Но у вас ещё имеется общая инверсия обоих сигналов.
GDI
Цитата(B3v @ Aug 6 2008, 13:40) *
Может это было бы итак. Но а какже то, что на рис-х 6 и 7. Земля у всей схемы одна:
Нажмите для просмотра прикрепленного файла
рис. 8.

А в чем проблема, в том что у вас осцилограммы в обратной полярности? Так вам сказали возможную причину, что ваша звуковая карта инвертирует сигнал, т.е. когда передачи нет, то на ТТЛ линиях должен быть высокий уровень. Менять полярность подключения я бы не стал, а просто имел бы ввиду что есть инверсия, у нормальных осцилографов есть специальная кнопка, для инверсного отображения сигнала, может вам поискать такую же в настройках вашей программы?
Цитата(B3v @ Aug 6 2008, 13:40) *
По поводу уровней меня в школе учили так:
Нажмите для просмотра прикрепленного файла
рис. 9.

Или я ошибаюсь?
С уважением.
Все правильно и выше вам именно это и сказали - низкий уровень это +12 на rs232.

Проблема то, я понял, у вас в том что не работает связь с ПК? 2 МК между собою общаются нормально?
Похоже проблема у вас в настройках скорости УАРТов, приведите ваш код инициализации УАРТ и на какой частоте работают ваши МК, частоту тактирования МК я имею ввиду(Внутренний RC, кварц, какой частоты)?
B3v
Цитата(MrYuran @ Aug 6 2008, 14:53) *
Нажмите для просмотра прикрепленного файла
Ещё раз:
UART (TTL): Start->"0" (0B), STOP->"1" (+5B)
COM (RS-232): Start->"0" (+12B), STOP->"1" (-12B)

На осциле картинки UART и RS-232 выглядят инверсно. Что вы и наблюдаете. Но у вас ещё имеется общая инверсия обоих сигналов.


Ага, так значит у МК UART все таки TTL. Спасибочки большое.

По исправлениям на рисунке. Я так понял Вы мне предлагаете посадить землю PC2 на Tx PC1, и собственно вход звуковой PC2 на землю PC1. Оно конечно, все в мире относительно, но пока не пойму в этом смысла, кроме одного wink.gif .

Я прошу прощения, надо отлучиться. Прибегу, заскочу сразу на тему.

С уважением Сергей.
GDI
Исправленная картинка вам поможет лишь в том случае если нет соединений земли ПК и МК, а если вы задумаете подключить схему к ПК через RS232 то землю схемы придется соединить с землей ПК и тогда вход звуковой карты будет замкнут. В общем лучше оставьте как было и либо инвертируйте в голове, либо найдите как программно проинвертировать сигнал который выводится на экран. И вообще это несущественная проблема.
MrYuran
Вообще не раз уже слышал об этой проблеме (инверсия сигналов софтовыми осциллами), другая проблема - закрытый вход (обрезание частот <50-100Гц)
defunct
А не в том ли проблема, что автор пытается UART подключить к COM порту напрямую.
Оттого ничего и не работает.

Да какая разница кто чего куда инвертирует, главное правильно согласовать интерфейсы.
Подключите UART MK через RS232 драйвер к RS232 COM порта и все у вас заработает.

RS485 - тоже нельзя подключить к RS232 без преобразователя, хотя бы потому что там 2 сигнальных линии и интерфейс симметричный (дифф. пара), а RS232 - 3 линии и это НЕ симметричный интерфейс (есть земляной провод).
GDI
Цитата
А не в том ли проблема, что автор пытается UART подключить к COM порту напрямую.
Оттого ничего и не работает.
Судя по восклицанию автора про ТТЛ, вполне может быть smile.gif
B3v
Цитата(GDI @ Aug 6 2008, 14:58) *
А в чем проблема, в том что у вас осцилограммы в обратной полярности? Так вам сказали возможную причину, что ваша звуковая карта инвертирует сигнал, т.е. когда передачи нет, то на ТТЛ линиях должен быть высокий уровень. Менять полярность подключения я бы не стал, а просто имел бы ввиду что есть инверсия, у нормальных осцилографов есть специальная кнопка, для инверсного отображения сигнала, может вам поискать такую же в настройках вашей программы?
Все правильно и выше вам именно это и сказали - низкий уровень это +12 на rs232.

Проблема то, я понял, у вас в том что не работает связь с ПК? 2 МК между собою общаются нормально?
Похоже проблема у вас в настройках скорости УАРТов, приведите ваш код инициализации УАРТ и на какой частоте работают ваши МК, частоту тактирования МК я имею ввиду(Внутренний RC, кварц, какой частоты)?


Прошу прощения, надо было скоропостижно отлучиться.
Если позволите, по порядку:
1. "А в чем проблема, в том что у вас осцилограммы в обратной полярности? Так вам сказали возможную причину, что ваша звуковая карта инвертирует сигнал, т.е. когда передачи нет, то на ТТЛ линиях должен быть высокий уровень."
Я делал со звуковой следующий экс-т:
От PC1 передаю в цикле символы, скорость 2400, и захватываю посылки SoundForg-ем. Если кто не сталкивался - это звуковой редактор.
Схема измерения.
Нажмите для просмотра прикрепленного файла
рис. 10
При этом от SoundForg имею следующую картинку.
Нажмите для просмотра прикрепленного файла
рис. 11

С той же скоростью 2400 и примерно с той же скважностью посылаю символы по UART контроллера.
Не отсоединяя земляного контакта щупа я переношу его на TxD контроллера.
Схема измерения.
Нажмите для просмотра прикрепленного файла
рис. 12
При этом от SoundForg имею следующую картинку.
Нажмите для просмотра прикрепленного файла
рис. 13
Получается, "Так вам сказали возможную причину, что ваша звуковая карта инвертирует сигнал...", что при измерении на RS-232( рис. 11) звуковая не инвертирует. И тут же, при измерении на TxD(рис. 12) контроллера пошла инверсия на звуковой карте. Не менял ни каких настроек, просто перенес щуп и сделал захват. Хотя нет, дернул немного общую громкость звуковой. Поэтому амплитуды разные. Но думаю это не столь важно.
Пока, меня интересует вот что: на TxD контроллера форма должна быть как на рис. 13, или как на рис. 12, или еще как? С амплитудами понятно RS-232 (+12...-12), МК(+5...0).

2. "Проблема то, я понял, у вас в том что не работает связь с ПК?" 2 МК между собою общаются нормально?"
Да, Вы правы, есть такая проблема. Но если можно, об этом чуть позже. Я приведу и принципиалку и программы дам. Не хочу сразу зарыться и запутаться.

"2 МК между собою общаются нормально?" Нормально, уже наигрался с диодами.

"Похоже проблема у вас в настройках скорости УАРТов, приведите ваш код инициализации УАРТ и на какой частоте работают ваши МК, частоту тактирования МК я имею ввиду(Внутренний RC, кварц, какой частоты)?"
Скорости у РС и у МК практически одинаковые - 2400. Не 9600 или выше, потому как пользуюсь звуковой. Смотрел и двумя одновременно каналами, и делал захват SForgem на оба канала одновременно.

CKSEL -> 0100, т.е. 8Мгц от внутреннего RC.

Извольте код для экспиремента (все практически сгенерировано визардом CV):

/*****************************************************
This program was produced by the
CodeWizardAVR V1.25.2 Beta1 Standard
Automatic Program Generator
© Copyright 1998-2006 Pavel Haiduc, HP InfoTech s.r.l.
http://www.hpinfotech.com


Chip type : ATmega8
Program type : Application
Clock frequency : 8,000000 MHz
Memory model : Small
External SRAM size : 0
Data Stack size : 256
*****************************************************/

#include <mega8.h>
#include <delay.h>


#define RXB8 1
#define TXB8 0
#define UPE 2
#define OVR 3
#define FE 4
#define UDRE 5
#define RXC 7

#define FRAMING_ERROR (1<<FE)
#define PARITY_ERROR (1<<UPE)
#define DATA_OVERRUN (1<<OVR)
#define DATA_REGISTER_EMPTY (1<<UDRE)
#define RX_COMPLETE (1<<RXC)

// USART Receiver buffer
#define RX_BUFFER_SIZE 8
char rx_buffer[RX_BUFFER_SIZE];

#if RX_BUFFER_SIZE<256
unsigned char rx_wr_index,rx_rd_index,rx_counter;
#else
unsigned int rx_wr_index,rx_rd_index,rx_counter;
#endif

// This flag is set on USART Receiver buffer overflow
bit rx_buffer_overflow;

// USART Receiver interrupt service routine
interrupt [USART_RXC] void usart_rx_isr(void)
{
char status,data;
status=UCSRA;
data=UDR;
if ((status & (FRAMING_ERROR | PARITY_ERROR | DATA_OVERRUN))==0)
{
rx_buffer[rx_wr_index]=data;
if (++rx_wr_index == RX_BUFFER_SIZE) rx_wr_index=0;
if (++rx_counter == RX_BUFFER_SIZE)
{
rx_counter=0;
rx_buffer_overflow=1;
};
};
}

#ifndef _DEBUG_TERMINAL_IO_
// Get a character from the USART Receiver buffer
#define _ALTERNATE_GETCHAR_
#pragma used+
char getchar(void)
{
char data;
while (rx_counter==0);
data=rx_buffer[rx_rd_index];
if (++rx_rd_index == RX_BUFFER_SIZE) rx_rd_index=0;
#asm("cli")
--rx_counter;
#asm("sei")
return data;
}
#pragma used-
#endif

// Standard Input/Output functions
#include <stdio.h>

// Declare your global variables here

void main(void)
{
// Declare your local variables here

char simvol;

// Input/Output Ports initialization
// Port B initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTB=0x00;
DDRB=0x00;

// Port C initialization
// Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTC=0x00;
DDRC=0x00;

// Port D initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTD=0x00;
DDRD=0x00;

// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: Timer 0 Stopped
TCCR0=0x00;
TCNT0=0x00;

// Timer/Counter 1 initialization
// Clock source: System Clock
// Clock value: Timer 1 Stopped
// Mode: Normal top=FFFFh
// OC1A output: Discon.
// OC1B output: Discon.
// Noise Canceler: Off
// Input Capture on Falling Edge
// Timer 1 Overflow Interrupt: Off
// Input Capture Interrupt: Off
// Compare A Match Interrupt: Off
// Compare B Match Interrupt: Off
TCCR1A=0x00;
TCCR1B=0x00;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;

// Timer/Counter 2 initialization
// Clock source: System Clock
// Clock value: Timer 2 Stopped
// Mode: Normal top=FFh
// OC2 output: Disconnected
ASSR=0x00;
TCCR2=0x00;
TCNT2=0x00;
OCR2=0x00;

// External Interrupt(s) initialization
// INT0: Off
// INT1: Off
MCUCR=0x00;

// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=0x00;


// USART initialization
// Communication Parameters: 8 Data, 1 Stop, No Parity
// USART Receiver: On
// USART Transmitter: On
// USART Mode: Asynchronous
// USART Baud rate: 2400
UCSRA=0x00;
UCSRB=0x98;
UCSRC=0x86;
UBRRH=0x00;
UBRRL=0xBF;


// Analog Comparator initialization
// Analog Comparator: Off
// Analog Comparator Input Capture by Timer/Counter 1: Off
ACSR=0x80;
SFIOR=0x00;

// Global enable interrupts
#asm("sei")

//Светодиод - индикатор
DDRC.5=1;PORTC.5=0;


delay_ms(150);


while (1)
{
putchar('a');

delay_ms(10);

putchar('a');

while (1)
{
simvol=getchar();
if(simvol=='c')break;
}

PORTC.5=1;

delay_ms(15);

PORTC.5=0;

};
}


У второго контроллера все тоже, кроме :
..............................
.............................
while (1)
{
while (1)
{
simvol=getchar();
if(simvol=='a')break;
}

while (1)
{
simvol=getchar();
if(simvol=='b')break;
}


PORTC.5=1;

delay_ms(15);

PORTC.5=0;


putchar('c');

};
.....................................
.....................................

3. "А не в том ли проблема, что автор пытается UART подключить к COM порту напрямую.
Оттого ничего и не работает.

Да какая разница кто чего куда инвертирует, главное правильно согласовать интерфейсы.
Подключите UART MK через RS232 драйвер к RS232 COM порта и все у вас заработает.

RS485 - тоже нельзя подключить к RS232 без преобразователя, хотя бы потому что там 2 сигнальных линии и интерфейс симметричный (дифф. пара), а RS232 - 3 линии и это НЕ симметричный интерфейс (есть земляной провод)."


Я приведу пока функционалку. Схема известная (для меня пока на бумаге).
Нажмите для просмотра прикрепленного файла
рис. 14.
GDI
1. Все нормально на ваших рисунках, на выходе RS232 вы видите +12в между символами, что соответствует низкому уровню на линиях ТТЛ, т.е. у вас инверсия сигнала в обоих случаях.

2. код надо заключать в тэги [ code][ /code] только без пробелов после первых скобочек.

3. Это слишком общая схема и она ни о чем не говорит, покажите как вы конкретно подключали RS485на обоих концах, кстати, для начала я бы порекомендовал добиться работы МК с ПК по RS232 а потом вводить звено 485. Для пробы в 485 можно и не ставить оптронную развязку.

Кстати, знаете ли вы что 485й это плудуплекстный интерфейс и его направлением передачи надо дополнительно управлять в отличие от 232?
bgc
Интересно, но никто не обратил внимания, что автор передает подряд два разных байта, на осциллограмме в модели так и есть, а на осциллограмме через звуковую карту - байты не только инвертированы, они ОДИНАКОВЫЕ.

С инверсией все очевидно, софтовый осциллограф инвертирует сигналы:
на рис инвертированный сигнал RS232 - На самом деле в паузах -12. Стартовый бит +12.

"Ох дурят, нашего брата, ох дурят..." ошибка крайне простая, только мы рассматриваем все через мозг B3v и не можем увидать простого...

з.ы. пока писал пост, рисунок потерялся. Но смысл остался...
B3v
На сколько я понял благодаря GDI и bgc и другие коллеги тоже наталкивали на эту мысль -, если бы я смотрел на экран осциллографа с открытым входом, то на Tx RS-232 было бы так:
Нажмите для просмотра прикрепленного файла

, а на TxD контроллера так:
Нажмите для просмотра прикрепленного файла
????????


По поводу тегов: виноват, исправлюсь.
Схемы приведу и проекты Протеуса тоже. Мне бы вот с этой ерундой разобраться. В симуляторе полудуплексом управляю.

Да, поймал меня bgc . В проекте Протеуса я передаю разные байты. Да чего только я не передавал.
"только мы рассматриваем все через мозг B3v и не можем увидать простого..." Искренне благодарю за поддержку, а то я уже было подумал что сей орган у меня отсох.
С уважением. Жду ответа.
bgc
На картинке все правильно. По уровням так и должно быть на нормальном UART-е и и на RS-232/

Теперь я ничего не понимаю. В приведенном коде программы тоже разные байты. Сначала 'a', потом 'b', а в ответ 'c'.
Или я что-то просмотрел.
Если этот код загрузить в процессор, то почему на осциллографе идут одинаковые байты?
Либо код другой, либо смотрим непонятно что.

Психологически такая проблема решается следующим образом:
1. Сделать перерыв! (чай, душ, прогуляться...)
2. Перезагрузить проект. Перетранслировать код (пересобрать все). Проверить что именно за код в проекте на данный момент.
3. Если есть сомнения в осциллографе - откалибровать: заземлить, подключить на +5 и убедиться что все Ок.
4. Загрузить код в отладчик, проверить.
5. Загрузить код в проц. Проверить.
6. Обдумать спокойно то, что будет видно.
Если это не помогло, изложить еще раз проблему для благодарного слушателя. Лучше голосом живом человеку, чтобы он понял, и задал вопросы "свежево дурака"
Первый пункт - важен.
Обычно, все проблемы отступают.
B3v
Цитата
На картинке все правильно. По уровням так и должно быть на нормальном UART-е и и на RS-232/.
Вот - это то, от чего я теперь могу оттолкнуться на данном этапе. Огромное спасибо. Казалось бы мелочь, и даже глупость. А все мои ошибки в моделировании и в реальной схеме, на этом скорее всего и базировались.
Цитата
Теперь я ничего не понимаю. В приведенном коде программы тоже разные байты. Сначала 'a', потом 'b', а в ответ 'c'.
Или я что-то просмотрел.
Если этот код загрузить в процессор, то почему на осциллографе идут одинаковые байты?
Либо код другой, либо смотрим непонятно что.
Тут Вы уж меня простите, было несколько, не существенно отличающихся вариантов тестирования мне доступной, так сказать, технологии измерений.
Вот и получилось, что в моих вопросах символы в коде не соответствуют показанному на рисунках. Было 2-ва варианта:
- посылаем два символа 'a', ждем ответ символ 'c', если получаем его, то уходим в начало цикла...
- посылаем символ 'a' затем 'b', ждем ответ символ 'c', если получаем его, то уходим в начало цикла...
Не принимайте близко к сердцу. Это я нахомутал с изложением в вопросах. Спешил набирать материал, а опыта маловато, вот оно так и получилось.
Цитата
Психологически такая проблема решается следующим образом:
1. Сделать перерыв! (чай, душ, прогуляться...)
2. Перезагрузить проект. Перетранслировать код (пересобрать все). Проверить что именно за код в проекте на данный момент.
3. Если есть сомнения в осциллографе - откалибровать: заземлить, подключить на +5 и убедиться что все Ок.
4. Загрузить код в отладчик, проверить.
5. Загрузить код в проц. Проверить.
6. Обдумать спокойно то, что будет видно.
Если это не помогло, изложить еще раз проблему для благодарного слушателя. Лучше голосом живом человеку, чтобы он понял, и задал вопросы "свежево дурака"
Первый пункт - важен.
Обычно, все проблемы отступают.

Очень даже дельные советы. Так и сделаю. Стряхну нежелательные эгрегоры, пересмотрю проект...
И если Вы не против продолжим беседу. Вопросы уже есть, но надо погодить.
Еще раз большое Спасибо. С уважением. Сергей.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.