roboforum.ru

Технический форум по робототехнике.
Текущее время: 04 июн 2025, 21:30

Часовой пояс: UTC + 4 часа




Начать новую тему Эта тема закрыта, вы не можете редактировать и оставлять сообщения в ней.  [ Сообщений: 11 ] 
Автор Сообщение
 Заголовок сообщения: UART & Hyper terminal
СообщениеДобавлено: 24 ноя 2007, 14:37 
Не в сети

Зарегистрирован: 30 окт 2007, 12:03
Сообщения: 20
Собрал адаптер для uart на max232C.
Все подключил, запускаю hyper terminal вот с таким кодом (это фрагмент. с важными параметрами - остальное как обычно сгенерено визардом)

Код:
// USART initialization
// Communication Parameters: 8 Data, 1 Stop, No Parity
// USART Receiver: Off
// USART Transmitter: On
// USART Mode: Asynchronous
// USART Baud Rate: 2400
UCSRA=0x00;
UCSRB=0x08;
UCSRC=0x86;
UBRRH=0x00;
UBRRL=0x67;

while (1)
      {
      // Place your code here

UDR=('x');   
       

      delay_ms(600);

      };
}


вижу в hyper terminal вот такое "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
при каждой отсылке данных появляется "x".
Меняю букву, или немного меняю код получается что то вроде
Код:
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxрЂшшЂшш
ЂшшЂшшЂшшЂшшЂшшЂшшЂшшЂшшЂшшЂшшЂшшЂшшЂшшЂшшЂшшЂшшЂшшЂшшЂшшЂшшЂшшЂшшЂшшЂшшЂшшЂшшЂш


Пробовал и UDR=('x'); и UDR=(74); и UDR=(x);
Не помогает. Постоянно пишет какой нибудь один символ. В основном "x".
Терминал настроен по умолчанию (только скорость выставлена 2400).

Вот такая конструкция не работает вообще

Код:
while (!(UCSRA.5)); /* ждем очистки регистра данных USART - т.е. окончания передачи предыдущего байта (символа) - в ДШ это написано так:
while ( !(UCSRA & (1<<5)) ); */

UDR = ('5'); /


(это из курса. у меня атмега8.)

В чем может быть проблема? Адаптер вроде работает... раз терминал получает.
В софте где то?
Подскажите что делать,куда копать?

printf дает примерно такой же результат.

-------
Новые данные: Advanced serial port monitor пишет что RxD горит, но при каждой посылке UART reciever error.


Последний раз редактировалось Vooon 24 ноя 2007, 18:01, всего редактировалось 1 раз.
добавил CODE


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: UART & Hyper terminal
СообщениеДобавлено: 24 ноя 2007, 20:24 
Не в сети
Аватара пользователя

Зарегистрирован: 27 ноя 2004, 00:42
Сообщения: 3339
Откуда: совсем Москва
ФИО: Григорий
У меня такой косяк с платой RoboCom32 от украинских наших друзей был. Причем, я тогда прикупил у них набор, который оставалось чисто распаять, т.к. МК уже прошит был. У них он работал как часы, а у меня слал такой вот мусор...
В чем проблема была - я не понял. Повозился пару вечеров и отложил, а потом времени вернуться не было. Но я так понял, что это из-за частоты отправленных данных. В моем случае МК был от внутреннего генератора запущен. Видимо, что-то не стыковалось. На внешний кварц я его так до сих пор и не прошил.
Посмотри, у тебя частота нормальная? А то может в этом косяк?

_________________
злой полицейский


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: UART & Hyper terminal
СообщениеДобавлено: 24 ноя 2007, 20:33 
Не в сети
Аватара пользователя

Зарегистрирован: 03 авг 2007, 19:43
Сообщения: 1437
Откуда: Екатеринбург
прог. языки: Си, асм со словарем
напиши что хочешь получить, можно с примером man(), попробую смоделировать своими силами на меге 16й, но отвечу только в ПН, до ПН пиу. Пофлудить или посоветовать могу легко. Блин, диск с кодевижн на работе, домашний лицензия кончилась :o .
Почему не ползуешься функцией предлагаемой по молчанию для передачи символа в буфер, а лезешь на прямую? Так то по примеру каждые 0,6 сек в буфер передачи пишется 'х', что и полчаем.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: UART & Hyper terminal
СообщениеДобавлено: 25 ноя 2007, 04:59 
Не в сети

Зарегистрирован: 30 окт 2007, 12:03
Сообщения: 20
Для начала мне нужно просто отправлять текст, ну скажем "proverka123" с контроллера и ловить его в hyper terminal.
Больше пока что ничего не нужно.

Атмега работает на частоте 4 мгц - встроенный кварц.

Есть два подозрения почему это может быть (впрочем,оба сомнительные):
1. У меня не max232 а max232c. В чем отличие - я не нашел. В даташите который вроде про него, найденый на аллдаташитс.ком - ничего нету. Про "c" версию.

2. Нога gnd у меня подключена в землю от разьема "molex" (питание hdd), а не на землю ком порта. Но я так понимаю это один хрен...

Больше ничего предположить немогу.

Цитата:
Почему не ползуешься функцией предлагаемой по молчанию для передачи символа в буфер, а лезешь на прямую? Так то по примеру каждые 0,6 сек в буфер передачи пишется 'х', что и полчаем.

А что за функция?

Отправляю я не символ "x". А любой другой. И в зависимости от этого бывает или "x" или "xx" или еще какие кракозябры. Но они постоянны для одного символа. Иногда меняются при перекомпиляции программы или перезапуске контроллера


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: UART & Hyper terminal
СообщениеДобавлено: 25 ноя 2007, 06:14 
Не в сети
отсылающий читать курс
Аватара пользователя

Зарегистрирован: 06 ноя 2005, 04:18
Сообщения: 14195
Откуда: Москва
User писал(а):
Атмега работает на частоте 4 мгц - встроенный кварц.


Там нет встроеного кварца, там RC генератор. Советую использовать внешний кварц
и не советую калибровать внутренний генератор...

http://www.avr123.nm.ru/z5.htm


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: UART & Hyper terminal
СообщениеДобавлено: 25 ноя 2007, 08:45 
Не в сети
Аватара пользователя

Зарегистрирован: 03 авг 2007, 19:43
Сообщения: 1437
Откуда: Екатеринбург
прог. языки: Си, асм со словарем
давайка весь исходник архивом


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: UART & Hyper terminal
СообщениеДобавлено: 25 ноя 2007, 11:39 
Не в сети
Аватара пользователя

Зарегистрирован: 15 янв 2007, 19:23
Сообщения: 1058
Откуда: Беларусь, Барановичи
прог. языки: С для МК, Delphi для ПК
User писал(а):
Атмега работает на частоте 4 мгц - встроенный кварц.

Во-первых, это нехорошая частота для использования УСАПП сама по себе, т.к. может приводить к появлению ошибок (хотя для многих задач при малых скоростях передачи вполне). 8)
Во-вторых, частота внутреннего генератора может существенно плавать. Без кварца - никак. Да и в чем проблема? Кварц + 2 конденсатора стоят копейки. :)

User писал(а):
Для начала мне нужно просто отправлять текст, ну скажем "proverka123" с контроллера и ловить его в hyper terminal. Больше пока что ничего не нужно.

Ну так вы и получаете то, что хотите. 8) Rig правильно заметил - у вас передача х стоит в цикле, который выполняется пока включено питание контроллера. Если Вы поставите UDR и delay перед while(1), то у Вас выведется один символ Х (тока делэй уже не нужен будет, наверное).

User писал(а):
А что за функция?

Для одного символа putchar('A'), а для строки
putsf("Good by, world!"); :D

_________________
I live My life!


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: UART & Hyper terminal
СообщениеДобавлено: 25 ноя 2007, 11:54 
Не в сети

Зарегистрирован: 30 окт 2007, 12:03
Сообщения: 20
Про частоту это вы здорово подсказали. Сменил на 1 mhz - работает. Ни-че-го не понимаю...
Никогда б не подумал.
Спасибо!
А конденсатор на кварц подбирается в зависимости от частоты?
Или скажем можно ставть 22 пф и на 4,8,16 mhz?
Для чего он там вообще нужен? С точки зрения электротехники?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: UART & Hyper terminal
СообщениеДобавлено: 25 ноя 2007, 13:50 
Не в сети
Аватара пользователя

Зарегистрирован: 21 дек 2006, 19:56
Сообщения: 4468
Откуда: Украина, г.Одесса
прог. языки: Delphi и С
А скорость передачи данных соответствует частоте кварца?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: UART & Hyper terminal
СообщениеДобавлено: 25 ноя 2007, 16:51 
Не в сети

Зарегистрирован: 30 окт 2007, 12:03
Сообщения: 20
Цитата:
А скорость передачи данных соответствует частоте кварца?

Да. Все делал через визард, все ок.


Продолжая тема отправки на UART.
Собственно конструирую ИК приемник на tsop. Разбираюсь. На уарт хотел выводить импульсы кнопок.

Сдается мне, что то я делаю не так. Посчитал частоту прерывания, сделал чтобы вызывалось каждые 0.002 сек. т.е. 2 мс.
Судя по описанию протокола rc5 - нормальное время. (пульт у меня lg).

Но в терминал уходят данные с огромной погрешностью. на 0.002 мс это не видно, потому что получаю я вот такое
Код:
5    1    1    1    4    5    1   1    4    4    1    1    5    4    5    1    1    4    5    1    1    5    5   5    1    1    1    4


4ки и 5ки - стартовые биты. Остальное еденицы. Думаю подниму ка таймер... пусть будет чаще.
Было TCNT0=6;, ставлю 255.

Ловлю уже вот такое
Код:
236    231    13    46    235    237    238    238    67    2
18    230    56    220    232    48    237    47    236


Причем жму я одну кнопку несколько раз, или другую - последовательность всегда разная и всегда случайная, пределах некоторого разброса. довольно большого как видите. (сейчас просто выводится длительность импульсов в мс*2)

Вопрос:
В чем подвох? Внутренний генератор врет ТАК сильно?
Или я что то не верно делаю в коде?

Примеров таких вещей на кодвижене в инете не нашел. Да и хочется разобратся самостоятельно, а не скопировать чужую программу.

Схема включения tsop следующая:
Код:
               ---------
               |TSOP|
               ---------
            gnd  vcc  data
               |    |   |--------------- Atmega PB0
                 -c-
             (22 мкф)
               |    |
               |    R 100 ом
               |    |
            -----------
            |  -     + | питание 5в.
            -----------


Код:
/*****************************************************
This program was produced by the
CodeWizardAVR V1.25.7a Evaluation
Automatic Program Generator
© Copyright 1998-2007 Pavel Haiduc, HP InfoTech s.r.l.
http://www.hpinfotech.com

Project :
Version :
Date    : 25.11.2007
Author  : Freeware, for evaluation and non-commercial use only
Company :
Comments:


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

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

int cnt=0; //счетчик
int snd=0; //флаг передачи




// Timer 0 overflow interrupt service routine
interrupt [TIM0_OVF] void timer0_ovf_isr(void)
{
// Reinitialize Timer 0 value
TCNT0=6;
         
//каждые 2 ms
if (PINB.0==0) {snd=1;}

if (snd==1) {cnt++;}
// Place your code here

}

// 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: 125,000 kHz
TCCR0=0x02;
TCNT0=6;   // 6 = 0.002 sek 

// 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=0x01;

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

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

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

while (1)
      {
      // Place your code here



if ((PINB.0==1) && (snd==1)) {printf("  %d  ",cnt); cnt=0; snd=0;}
      };
}


Последний раз редактировалось Vooon 25 ноя 2007, 17:16, всего редактировалось 1 раз.
добавил CODE, для вывода консольных программ и схем в псевдографике. кстати тк используется UTF-8 схемы мона псевдографикой рисовать.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: UART & Hyper terminal
СообщениеДобавлено: 26 ноя 2007, 13:50 
Не в сети
Аватара пользователя

Зарегистрирован: 15 янв 2007, 19:23
Сообщения: 1058
Откуда: Беларусь, Барановичи
прог. языки: С для МК, Delphi для ПК
Пример есть в теме про ИК ДУ для робота. Там и RC5, и пересылка в компьютер есть. 8)
Емкость конденсаторов для кварца нужно посмотреть по даташиту.
Для восмьой меги вот:


Вложения:
XTAL.jpg
XTAL.jpg [ 30.95 КиБ | Просмотров: 3866 ]

_________________
I live My life!
Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Эта тема закрыта, вы не можете редактировать и оставлять сообщения в ней.  [ Сообщений: 11 ] 

Часовой пояс: UTC + 4 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 9


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB
phpBB SEO