Модераторы: PILOT, ManiaK, Mazzi
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Преобразование rs232-COM, Портятся данные 
V
    Опции темы
Gwendolen
Дата 13.9.2011, 14:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 119
Регистрация: 5.4.2005

Репутация: нет
Всего: 1



Добрый день.

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

user posted image

Код

#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, как понимаю это 10^-6F или 1000х10^10-9F. Хотя не заметил, чтобы протеус менял результаты при изменении емкости конденсаторов.

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

P.S. К COM порту подключаю программу Terminal v1.6b(ссылка)
P.P.S. Порты к которым подключены протеус и терминал должны быть соединены нуль-модемным кабелем. Использую виртуальные, созданные com0com v2.2.2.0(ссылка).

Присоединённый файл ( Кол-во скачиваний: 3 )
Присоединённый файл  AVR16.zip 59,04 Kb
--------------------
Наносите пользу и причиняйте добро!
PM MAIL   Вверх
UniBomb
Дата 13.9.2011, 15:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок
***
Награды: 1



Профиль
Группа: Завсегдатай
Сообщений: 1754
Регистрация: 24.10.2006
Где: Санкт-Петербург

Репутация: 9
Всего: 97



Мне кажется, что вы перепутали выводы. На R1in должент идти TxD, а на T1out соответственно RxD.
PM MAIL ICQ Skype   Вверх
Gwendolen
Дата 13.9.2011, 15:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 119
Регистрация: 5.4.2005

Репутация: нет
Всего: 1



Насколько, я понимаю дело не в этом. В терминале и в модели порта вход/выход инвертированы.

Сначала я тоже подключал, как Вы сказали, но протеус выдавал ошибки, а на терминал и порт вообще не работали.
--------------------
Наносите пользу и причиняйте добро!
PM MAIL   Вверх
UniBomb
Дата 13.9.2011, 16:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок
***
Награды: 1



Профиль
Группа: Завсегдатай
Сообщений: 1754
Регистрация: 24.10.2006
Где: Санкт-Петербург

Репутация: 9
Всего: 97



Gwendolen, инвертированы они совсем по другой причине. У RS-232 за логический "1" принимается отрицательное напряжение, а за логический "0" соответственно положительное. А так даже зрительно проследите - rx от мк соединён с RxD, а tx соответственно с TxD.

И ещё момент - вы земли точно соединили?

Добавлено через 14 секунд
user posted image
PM MAIL ICQ Skype   Вверх
Gwendolen
Дата 13.9.2011, 18:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 119
Регистрация: 5.4.2005

Репутация: нет
Всего: 1



Дело получается в протеусе. Вот этот вариант нормально взаимодействует с компьютерной программой:
user posted image

Видно придётся моделировать без max232, а в железе его ставить...
--------------------
Наносите пользу и причиняйте добро!
PM MAIL   Вверх
UniBomb
Дата 13.9.2011, 18:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок
***
Награды: 1



Профиль
Группа: Завсегдатай
Сообщений: 1754
Регистрация: 24.10.2006
Где: Санкт-Петербург

Репутация: 9
Всего: 97



Вот этот вариант никогда не пробуйте в железе. Спалите нафиг  smile

Добавлено через 56 секунд
И кстати опять rx в rx. Надо крест накрест.
PM MAIL ICQ Skype   Вверх
Gwendolen
Дата 14.9.2011, 20:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 119
Регистрация: 5.4.2005

Репутация: нет
Всего: 1



Нашел ответ, виртуальный терминал и виртуальный порт не понимают уровня напряжений на выходе MAX232. Там логической единице соответствует напряжение -12 вольт а протеус воспринимает как 0. Для терминала это можно исправить, изменив в настройках полярность RX/TX, для виртуального порта решения не нашел. Однако взаимодействие с программой можно испытать и так, подключив его до MAX232.

P.S. Естественно, реальный разъём порта будет подключен не так, как подключён виртуальный порт, а так:
user posted image
--------------------
Наносите пользу и причиняйте добро!
PM MAIL   Вверх
UniBomb
Дата 14.9.2011, 22:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок
***
Награды: 1



Профиль
Группа: Завсегдатай
Сообщений: 1754
Регистрация: 24.10.2006
Где: Санкт-Петербург

Репутация: 9
Всего: 97



Цитата(Gwendolen @  14.9.2011,  21:25 Найти цитируемый пост)
исправить

Но ведь так и должно быть  smile
PM MAIL ICQ Skype   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Микроконтроллеры (MCU) и микропроцессоры (MPU)"
PILOT ManiaK
UniBomb Mazzi

На данный раздел помимо Правил форума распространяются текже следующие правила:


  • Прежде чем создать тему воспользуйтесь поиском или посмотрите в faq. Возможно на форуме уже есть ответ на ваш или близкий к вашему вопрос.
  • В заголовке темы в квадратных скобках обозначьте используемое семейство микроконтроллера: [avr],[pic],[arm].
  • При создании темы с вопросом указывайте участок кода с ошибкой, версию компилятора, схемы подключения, fuse биты и прочие данные, которые помогут найти правильный ответ. Для форматирования текста программ используйте кнопку код.
  • Новое сообщение должно иметь прямое отношение к тематике этого раздела. Для флуда, просьб выполнить задание, поиска партнёров или исполнителей существуют свои разделы.
  • Если вы заметили несовместимое с правилами сообщение, то можете уведомить об этом модератора раздела нажав кнопку Репорт у соответствующего сообщения.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, PILOT, ManiaK, UniBomb, Mazzi.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Микроконтроллеры (MCU) и микропроцессоры (MPU) | Следующая тема »


 




[ Время генерации скрипта: 0.0464 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.