реклама на сайте
подробности

 
 
> 2-ве Mega8 по UART, CV, Proteus и отсутствие осциллографа
B3v
сообщение Aug 5 2008, 23:08
Сообщение #1





Группа: Новичок
Сообщений: 7
Регистрация: 20-01-08
Пользователь №: 34 252



Подскажите начинающему. Столкнулся с такой историей.
Инструментарий у меня: 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 .
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
GDI
сообщение Aug 6 2008, 09:58
Сообщение #2


Профессионал
*****

Группа: Свой
Сообщений: 1 235
Регистрация: 14-05-05
Из: Санкт-Петербург
Пользователь №: 5 008



Цитата(B3v @ Aug 6 2008, 13:40) *
Может это было бы итак. Но а какже то, что на рис-х 6 и 7. Земля у всей схемы одна:
[attachment=23565:attachment]
рис. 8.

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

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

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


--------------------
http://www.embedders.org Блоги разработчиков электроники.
Go to the top of the page
 
+Quote Post
B3v
сообщение Aug 6 2008, 14:45
Сообщение #3





Группа: Новичок
Сообщений: 7
Регистрация: 20-01-08
Пользователь №: 34 252



Цитата(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.
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- B3v   2-ве Mega8 по UART, CV, Proteus и отсутствие осциллографа   Aug 5 2008, 23:08
- - bgc   одна проблема в схеме есть: светодиод без токоогра...   Aug 6 2008, 02:51
|- - B3v   Да, есть грех. Протеус схавал, а в железе там стоя...   Aug 6 2008, 07:57
- - MrYuran   Чё-то я не понял в чём проблема. Ну, инвертирует в...   Aug 6 2008, 08:14
|- - B3v   Цитата(MrYuran @ Aug 6 2008, 13:14) Чё-то...   Aug 6 2008, 09:40
|- - MrYuran   Ещё раз: UART (TTL): Start->"0" (0B...   Aug 6 2008, 09:53
|- - B3v   Цитата(MrYuran @ Aug 6 2008, 14:53) Ещё...   Aug 6 2008, 10:19
- - GDI   Исправленная картинка вам поможет лишь в том случа...   Aug 6 2008, 11:30
- - MrYuran   Вообще не раз уже слышал об этой проблеме (инверси...   Aug 6 2008, 11:34
- - defunct   А не в том ли проблема, что автор пытается UART по...   Aug 6 2008, 11:49
- - GDI   ЦитатаА не в том ли проблема, что автор пытается U...   Aug 6 2008, 12:11
- - GDI   1. Все нормально на ваших рисунках, на выходе RS23...   Aug 6 2008, 14:57
- - bgc   Интересно, но никто не обратил внимания, что автор...   Aug 6 2008, 15:22
- - B3v   На сколько я понял благодаря GDI и bgc и другие ко...   Aug 6 2008, 16:19
- - bgc   На картинке все правильно. По уровням так и должно...   Aug 6 2008, 17:49
- - B3v   ЦитатаНа картинке все правильно. По уровням так и ...   Aug 6 2008, 18:37


Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 22nd July 2025 - 11:41
Рейтинг@Mail.ru


Страница сгенерированна за 0.01431 секунд с 7
ELECTRONIX ©2004-2016