Искажения данных при интеграции ATMEGA и MAX232

Вопросы настройки, программирования, прошивки микроконтроллеров и микросхем программируемой логики
Закрыто
Родился
Сообщения: 16
Зарегистрирован: Вт сен 13, 2011 15:26:12

Сообщение SLst »

Добрый день!
Проблема, похоже в схеме, а не с ПО и не с протоколом, так что тему создал в этом разделе, а не в разделе "Интеграция с ПК".

Надо передавать данные на МК atmega16 через COM порт компьютера(!!!USB НЕ ПРЕДЛАГАТЬ, надо именно через COM)
Вот схема и код WinAVR:

Изображение

Код: Выделить всё

#define FOSC  4000000UL  // 
#define F_CPU FOSC

#define BAUD 9600L //Скорость порта
#define UBRRVAL FOSC/16/BAUD-1

#include <avr/io.h>
#include <avr/iom16.h>
#include <util/delay.h>
#include <stdio.h>
#include <avr/interrupt.h>  

int counter = 0; //счётчик для изменения режима
void USART_Transmit( unsigned char data )
{
	while (!(UCSRA&(1<<UDRE))){}; //wait for empty transmit buffer
	UDR=data ; //send number to USART
}

void writeBr()
{
	USART_Transmit(0x0d);//переход в начало строки
	USART_Transmit(0x0a);//переход на новую строку
}

void writeInputPrompt()
{
	writeBr();
	USART_Transmit('m');
	USART_Transmit('2');
	USART_Transmit(0x20);
	USART_Transmit(0x23);
	USART_Transmit(0x3a);
	USART_Transmit(0x20);
}

ISR(USART_RXC_vect)
{
	cli();
	int b;
	b = UDR;

	USART_Transmit(0x20);
	USART_Transmit('-');
	USART_Transmit(0x20);
	USART_Transmit(b+1); //следующий символ
	if (--counter > 0)
		writeInputPrompt();
	else
		writeBr();
	sei();
}

int main(void)
{
	//Set baud rate
	UBRRL=UBRRVAL;		//low byte
	UBRRH = (unsigned char)(UBRRVAL>>8); //hi byte
	//Set data frame format: asynchronous mode,no parity, 1 stop bit, 8 bit size
	UCSRC=(1<<URSEL)|(0<<UMSEL)|(0<<UPM1)|(0<<UPM0)|
	(0<<USBS)|(0<<UCSZ2)|(1<<UCSZ1)|(1<<UCSZ0);	
	//Enable Transmitter and Receiver
	UCSRB=(1<<RXEN)|(1<<TXEN);
	UCSRB |= (1<<RXCIE); //разрешениепрерывания по завершению приема
	
	while(1)
		{
			while (counter < 3)
			{
				USART_Transmit('m');
				USART_Transmit('1');
				USART_Transmit(0x20);
				_delay_ms(1500);	//long delay
				counter++;
			}

			writeInputPrompt();
			sei();
			
			while (counter > 0)
			{
				
			}
			cli();
		}
	return 0;
}	
Проект во вложении.

Проблема: при моделировании в Proteus на COM порт выдаются и принимаются искажённые данные.

До max232 на терминале VT1 всё выглядит отлично. На VT2 и в программу, подключённую к COM порту, выдаются искажённые данные(одинаковые и на VT2 и в программе). В даташите max232 про конденсаторы написано, что должны быть 1,0μF, как понимаю это 1x10[sup]-6[/sup]F или 1000х10[sup]-9[/sup]F. Хотя не заметил, чтобы протеус менял результаты при изменении емкости конденсаторов.

Подскажите в чём ошибка.

P.S. К COM порту подключаю программу Terminal v1.6b(ссылка)
P.P.S. Порты к которым подключены протеус и терминал должны быть соединены нуль-модемным кабелем. Использую виртуальные, созданные com0com v2.2.2.0(ссылка).
Вложения
AVR16.zip
(59.04 КБ) 171 скачивание
Реклама
Мудрый кот
Аватара пользователя
Сообщения: 1733
Зарегистрирован: Чт авг 21, 2008 22:03:30
Откуда: Одесса(Украина)

Сообщение РадиоЛоматель »

Добрый день!
Причина вашей проблемы крайне проста: микросхема max232 инвертирует сигнал. Тоесть уровню +5 волт (логической единице) на входе соответствует напряжение -12 вольт на выходе. Терминал шпротеуса, ровно как и его "внешний порт" воспринимают -12 вольт как логический ноль, хотя это есть неверно, как вы поняли.
Решение также просто: Необходимо подключить "внешний порт" до 232-й.. Или покопаться в настройках этого порта и терминала: там должно быть что-то вроде "invert levels"
Не беспокойтесь: в нормальном СОМ порте уровню -12 вольт соответствует логическая единица. В железе ваша схема работать будет.
(*tmp) &= ~( ( (param1 & (1<<PARAM1_BIT6)) || ((param2==PARAM2_TRUE)&&(--param3)) ) ? (param1 & (~param2)) : (Func1() | FUNC1_FLAGS) );
Люблю Си...
Контактная информация:
Реклама
Родился
Сообщения: 16
Зарегистрирован: Вт сен 13, 2011 15:26:12

Сообщение SLst »

РадиоЛоматель писал(а):Добрый день!
Причина вашей проблемы крайне проста: микросхема max232 инвертирует сигнал. Тоесть уровню +5 волт (логической единице) на входе соответствует напряжение -12 вольт на выходе. Терминал шпротеуса, ровно как и его "внешний порт" воспринимают -12 вольт как логический ноль, хотя это есть неверно, как вы поняли.
Решение также просто: Необходимо подключить "внешний порт" до 232-й.. Или покопаться в настройках этого порта и терминала: там должно быть что-то вроде "invert levels"
Не беспокойтесь: в нормальном СОМ порте уровню -12 вольт соответствует логическая единица. В железе ваша схема работать будет.
Благодарю. Подключил "внешний порт" до max232, данные стали передаваться нормально. Теперь долго не вернусь к микроконтроллеру - ближайшее время буду писать PC программу для взаимодействия с ним.
Закрыто

Вернуться в «Микроконтроллеры и ПЛИС»