Проблема подключения Atmega8L-8PU к COM порту

Подключаем наши девайсы к компьютеру. Обсуждаются: порты, протоколы, драйвера, языки программирования и т.д.
Ответить
Sinerson
Родился
Сообщения: 16
Зарегистрирован: Пт май 07, 2010 11:53:39
Откуда: НИНО
Контактная информация:

Проблема подключения Atmega8L-8PU к COM порту

Сообщение Sinerson »

Всем здравствуйте, захотел связать atmega8 и компьютер по RS232, естественно через MAX232CPE, разбросал на "макетку" мегу, макс, etc. Для теста гоню с МК символ "1", методом printf("1"); но в терминале на компьютере получаю символ "Ъ", причем менял кодировку, пробовал разные OS (Vista, XP SP3, Suse Linux), разве что до DOSa не добрался, если посылать вместо "1" "0" - тогда терминал вообще молчит, если текст, то полная ахинея в терминале.
МК тактуется кварцем на 8Мгц, скорость порта 9600 8N1, обвязка max232 - конденсаторы по 1мФ, длина шнурка МК - COM ~15см
питание МК и max232 осуществляется через кренку, от БП компьютера
При симуляции в протеусе, до max232 в терминале символ "1" с МК нормально идет, а после max232 кидает символ "g", если в свойствах терминала указать Rx/Tx polarity Inverted, тогда единичка идет как надо, но в железе-то я не могу/незнаю как выставить "инверт полярити", Rx/Tx местами пробовал менять, не помогает. В чем может быть дело? Помогите пожалуйста.

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

/*****************************************************
This program was produced by the
CodeWizardAVR V2.04.4a Advanced
Automatic Program Generator
© Copyright 1998-2009 Pavel Haiduc, HP InfoTech s.r.l.
http://www.hpinfotech.com

Project :
Version :
Date    : 17.05.2010
Author  : Sinerson
Company :
Comments:


Chip type               : ATmega8L
Program type            : Application
AVR Core Clock frequency: 8,000000 MHz
Memory model            : Small
External RAM size       : 0
Data Stack size         : 256
*****************************************************/

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

// Declare your global variables here

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

// 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: Timer1 Stopped
// Mode: Normal top=FFFFh
// OC1A output: Discon.
// OC1B output: Discon.
// Noise Canceler: Off
// Input Capture on Falling Edge
// Timer1 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: Timer2 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: 9600
UCSRA=0x00;
UCSRB=0x18;
UCSRC=0x86;
UBRRH=0x00;
UBRRL=0x33;

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

while (1)
      {
      // Place your code here
      delay_ms(1000);
      printf("1");
      };
}

Изображение
Реклама
Аватара пользователя
Yftul
Вымогатель припоя
Сообщения: 540
Зарегистрирован: Пт фев 20, 2009 12:26:26

Re: Проблема подключения Atmega8L-8PU к COM порту

Сообщение Yftul »

А что в putchar() находится?

Вообще стоит проверить правильность указания скорости/четности/числа битов данных. Полярность сигналов поступающих на PC как раз должна быть обратной, так как в нем стоит та же 232 или ее функциональный аналог.
Реклама
Sinerson
Родился
Сообщения: 16
Зарегистрирован: Пт май 07, 2010 11:53:39
Откуда: НИНО
Контактная информация:

Re: Проблема подключения Atmega8L-8PU к COM порту

Сообщение Sinerson »

не совсем понял насчет putchar, на "железе" скорость/четность/управление потоком перебирал разные комбинации, все равно в консоль валиться чушь, Rx/Tx местами менять пробовал с max232 на com, при смене линий в консоли пустота
Аватара пользователя
Yftul
Вымогатель припоя
Сообщения: 540
Зарегистрирован: Пт фев 20, 2009 12:26:26

Re: Проблема подключения Atmega8L-8PU к COM порту

Сообщение Yftul »

Дело в том, что printf() работает через putchar(), потому было интересно посмотреть содержимое данной функции.

Впрочем раз в шпротеусе вывод идет, то дело вероятно не в этом. Попробуйте проверить исправность компорта - замкните ноги 2 и 3 и понажимайте в терминале клавиши, должно пойти эхо. Есть возможность посмотреть осциллографом выход с тестовой платы?

Елки-палки) а назначить вывод TxD как выход не пробовали?:)
Реклама
Эиком - электронные компоненты и радиодетали
Sinerson
Родился
Сообщения: 16
Зарегистрирован: Пт май 07, 2010 11:53:39
Откуда: НИНО
Контактная информация:

Re: Проблема подключения Atmega8L-8PU к COM порту

Сообщение Sinerson »

В общем, терминал продолжает нести ахинею, даже если порт D (как раз тут живут Rx|Tx) сконфигурирован как выход (пробовал назначать DDRD=0x01 , тоже самое что и DDRD=0xFF).
Изображение
Питание осуществлял от отдельного аккумулятора 12В. Осциллографа к сожалению нет.
Может так "дурить" MAX232 ?
или это не он?
Com порт я проверил - 2-3 нога - на выходе нормальное эхо получаю.

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

while (1)
      {
      // Place your code here
delay_ms(200);
putchar(31);
      };
Реклама
Аватара пользователя
Yftul
Вымогатель припоя
Сообщения: 540
Зарегистрирован: Пт фев 20, 2009 12:26:26

Re: Проблема подключения Atmega8L-8PU к COM порту

Сообщение Yftul »

Насчет настроек порта так TxD должен быть выходом, RxD - входом. Если верить датащиту, то:

The DDxn bit in the DDRx Register selects the direction of this pin. If DDxn is written logic one,
Pxn is configured as an output pin. If DDxn is written logic zero, Pxn is configured as an input
pin.


То есть DDRD должен быть 0bxxxxxx10 (в изначальном варианте у вас он равен 0x00).

Касательно проблемы: откуда Putty берет настройки компорта? Пробовали использовать hyperterminal?
Попробуйте для исключения программных глюков вместо putchar(0x31) поставить
UDR = 0x31;

ЗЫ: Глупый вопрос) надеюсь после аккумулятора 12 Вольт стоит стабилизатор на 5 ? :)
Реклама
Sinerson
Родился
Сообщения: 16
Зарегистрирован: Пт май 07, 2010 11:53:39
Откуда: НИНО
Контактная информация:

Re: Проблема подключения Atmega8L-8PU к COM порту

Сообщение Sinerson »

ЗЫ: Глупый вопрос) надеюсь после аккумулятора 12 Вольт стоит стабилизатор на 5 ?

А как же, самый что ни есть настоящий КРЕН :) Хватит, я уже один раз подключил по недогляду Atmega8535 напрямую к 12В, долго искал - чего это он не опознается в программаторе :)
Putty работает с com портом как любой терминальный клиент (это не суть важно, еще пробовал rs232 pro, а также Hyper Terminal, просто к Putty уже привык), что под *nix что под Win* , настройки порта задаются вручную
Изображение
UDR посылать пробовал, те же грабли в терминале. (скринов к сожалению нет, они дома, а я на работе)
В общем пока единственна мысль которая приходит в голову, это заменить max232.
Аватара пользователя
Yftul
Вымогатель припоя
Сообщения: 540
Зарегистрирован: Пт фев 20, 2009 12:26:26

Re: Проблема подключения Atmega8L-8PU к COM порту

Сообщение Yftul »

Скорость на скриншоте не похожа на 9600 :) Этот момент учитываете?

Попробуйте заменить max, но ее неисправность имхо маловероятна.
Рекомендую Вам поискать осциллограф буквально на 5 минут и посмотреть что у Вашей схемы происходит в контрольных точках.
Sinerson
Родился
Сообщения: 16
Зарегистрирован: Пт май 07, 2010 11:53:39
Откуда: НИНО
Контактная информация:

Re: Проблема подключения Atmega8L-8PU к COM порту

Сообщение Sinerson »

Скриншот привел для примера, на вопрос откуда putty берет настройки com порта. Осциллограф попробую найти, вечером дома еще попробую max на эхо проверить, просто прицеплю на com порт и посмотрю будет ли эхо
Аватара пользователя
Yftul
Вымогатель припоя
Сообщения: 540
Зарегистрирован: Пт фев 20, 2009 12:26:26

Re: Проблема подключения Atmega8L-8PU к COM порту

Сообщение Yftul »

Да, это неплохой вариант. Если при замыкании TTL стороны RxD и TxD эхо будет, то MAX однозначно работает.
Sinerson
Родился
Сообщения: 16
Зарегистрирован: Пт май 07, 2010 11:53:39
Откуда: НИНО
Контактная информация:

Re: Проблема подключения Atmega8L-8PU к COM порту

Сообщение Sinerson »

В общем похоже что max здох, соеденил com port компьютера через max232 2 и 3 ногу, так мало того что эха нет, так еще в терминал max постоянно шлет символ "|". Буду пробовать менять макс, после этого отпишусь.
Аватара пользователя
Meteor
Друг Кота
Сообщения: 3961
Зарегистрирован: Пн июл 13, 2009 14:37:39
Откуда: Московская область, наукоград.....
Контактная информация:

Re: Проблема подключения Atmega8L-8PU к COM порту

Сообщение Meteor »

Это как
мало того что эха нет, так еще в терминал max постоянно шлет символ "|"
Уже "тупой" передатчик поумнел и сам (без внешних сигналов) шлет данные в порт? :shock:
Такого не бывает. Ищите огрехи в устройстве/программе.
Загружая на вход компьютера "мусор", на выходе получим "мусор^32".
PS. Не работаю с: Proteus, Multisim, EWB, Micro-Cap... не спрашивайте даже
Аватара пользователя
Yftul
Вымогатель припоя
Сообщения: 540
Зарегистрирован: Пт фев 20, 2009 12:26:26

Re: Проблема подключения Atmega8L-8PU к COM порту

Сообщение Yftul »

Надеюсь, МК отсоединяли при проверке? Проверьте еще раз тщательно сборку.
viPiz
Родился
Сообщения: 10
Зарегистрирован: Ср май 26, 2010 19:14:21
Откуда: Москва
Контактная информация:

Re: Проблема подключения Atmega8L-8PU к COM порту

Сообщение viPiz »

Проблема не в max232. У вас не правильно настроен МК. в параметре UBRR у вас указано 0x33, что соответствует скорости 19200, а вы пытаетесь присоединиться на 9600, по-этому и вылезает ахинея в терминале. Чтоб было соединение на 9600, у вас должно в UBRRL стоять 0x67.
Аватара пользователя
Yftul
Вымогатель припоя
Сообщения: 540
Зарегистрирован: Пт фев 20, 2009 12:26:26

Re: Проблема подключения Atmega8L-8PU к COM порту

Сообщение Yftul »

Вы ошибаетесь.

Страница 161 документации на mega 8 версии rev2486W-AVR-02/10.

U2X в нашем случае равно нулю, так как UCSRA присваивается ноль (стр. 154 того же документа);
viPiz
Родился
Сообщения: 10
Зарегистрирован: Ср май 26, 2010 19:14:21
Откуда: Москва
Контактная информация:

Re: Проблема подключения Atmega8L-8PU к COM порту

Сообщение viPiz »

Yftul писал(а):Вы ошибаетесь.

Страница 161 документации на mega 8 версии rev2486W-AVR-02/10.

U2X в нашем случае равно нулю, так как UCSRA присваивается ноль (стр. 154 того же документа);


Ах, да.... пардоньте.... :oops: datasheet знаю, просто по привычке подумал, что 2х стоит, т.к. сам ставлю 2х всегда... Такая же фигня была.. МК писал в порт фигню всякую.... оказалось, что промахнулсяс тактовой частотой МК, отсюда и baudrate пополз...
Аватара пользователя
Jack_A
Друг Кота
Сообщения: 6307
Зарегистрирован: Вт апр 24, 2007 07:45:40
Откуда: Minsk

Re: Проблема подключения Atmega8L-8PU к COM порту

Сообщение Jack_A »

Yftul писал(а):Насчет настроек порта так TxD должен быть выходом, RxD - входом.


Не обязательно. Если бит TxEN в регистре UART установлен, пин подключается как выход независимо от состояния DDR. По крайней мере в десятке своих дивайсов я ставлю пины Rx,Tx как входы с подтяжкой к 5V, и граблей ни разу не было.

Осциллографа, кая я понимаю, у топикстартера нету, потому что хороший осцилл снимает 75% вопросов.
Аватара пользователя
Yftul
Вымогатель припоя
Сообщения: 540
Зарегистрирован: Пт фев 20, 2009 12:26:26

Re: Проблема подключения Atmega8L-8PU к COM порту

Сообщение Yftul »

Как сказать :) В документации написано именно так, как говорите Вы, однако я управлял выходом TxD параллельно с UART в одном из своих устройств (протупил немного и пришлось делать костыли :oops:).

Так что правильная настройка входов/выходов хотя бы для исключения неисправности имхо нужна.
Аватара пользователя
Jack_A
Друг Кота
Сообщения: 6307
Зарегистрирован: Вт апр 24, 2007 07:45:40
Откуда: Minsk

Re: Проблема подключения Atmega8L-8PU к COM порту

Сообщение Jack_A »

Yftul писал(а):ак что правильная настройка входов/выходов хотя бы для исключения неисправности имхо нужна.

Не спорю. Можно Tx-овую пину через DDR программировать как выход, только при этом в этот бит "1" записывать, у меня в одном из моих ранних там 0 был, так при начале передачи сопряженное устройство удивлялось и переспрашивало "Чаво?!"
:-))
Ответить

Вернуться в «Интеграция с ПК»