roboforum.ru

Технический форум по робототехнике.

UART & Hyper terminal

Программирование микроконтроллеров AVR, PIC, ARM.
Разработка и изготовление печатных плат для модулей.

UART & Hyper terminal

Сообщение User » 24 ноя 2007, 14:37

Собрал адаптер для 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
User
 
Сообщения: 20
Зарегистрирован: 30 окт 2007, 12:03

Re: UART & Hyper terminal

Сообщение Digit » 24 ноя 2007, 20:24

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

Re: UART & Hyper terminal

Сообщение rig » 24 ноя 2007, 20:33

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

Re: UART & Hyper terminal

Сообщение User » 25 ноя 2007, 04:59

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

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

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

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

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

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

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

Отправляю я не символ "x". А любой другой. И в зависимости от этого бывает или "x" или "xx" или еще какие кракозябры. Но они постоянны для одного символа. Иногда меняются при перекомпиляции программы или перезапуске контроллера
User
 
Сообщения: 20
Зарегистрирован: 30 окт 2007, 12:03

Re: UART & Hyper terminal

Сообщение avr123.nm.ru » 25 ноя 2007, 06:14

User писал(а):Атмега работает на частоте 4 мгц - встроенный кварц.


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

http://www.avr123.nm.ru/z5.htm
Аватара пользователя
avr123.nm.ru
отсылающий читать курс
 
Сообщения: 14195
Зарегистрирован: 06 ноя 2005, 04:18
Откуда: Москва
Предупреждения: -8

Re: UART & Hyper terminal

Сообщение rig » 25 ноя 2007, 08:45

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

Re: UART & Hyper terminal

Сообщение SSG » 25 ноя 2007, 11:39

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!
Аватара пользователя
SSG
 
Сообщения: 1058
Зарегистрирован: 15 янв 2007, 19:23
Откуда: Беларусь, Барановичи
прог. языки: С для МК, Delphi для ПК

Re: UART & Hyper terminal

Сообщение User » 25 ноя 2007, 11:54

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

Re: UART & Hyper terminal

Сообщение Master » 25 ноя 2007, 13:50

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

Re: UART & Hyper terminal

Сообщение User » 25 ноя 2007, 16:51

А скорость передачи данных соответствует частоте кварца?

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


Продолжая тема отправки на 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 схемы мона псевдографикой рисовать.
User
 
Сообщения: 20
Зарегистрирован: 30 окт 2007, 12:03

Re: UART & Hyper terminal

Сообщение SSG » 26 ноя 2007, 13:50

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


Вернуться в Микроконтроллеры

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

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