реклама на сайте
подробности

 
 
> Помогите новичку с UART на AT90CAN128, подскажите, где ошибка
gest
сообщение Dec 6 2007, 09:05
Сообщение #1





Группа: Новичок
Сообщений: 3
Регистрация: 6-12-07
Пользователь №: 33 019



Пытаюсь соединиться с компьютером через COM-порт, но ничего не получается. Для согласования использую MAX3232.

Вот код программы:
Код
#define __AVR_AT90CAN128__ 1

#include <avr/io.h>
#include <avr/signal.h>
#include <avr/interrupt.h>

#include <stdio.h>
#include <stdlib.h>

#define F_CPU 73728 //*100

#define UART_BAUD_RATE 96 //*100    

#define baudrate ((F_CPU)/((UART_BAUD_RATE)*16)-1)

void putchar_uart (char c);

int main ( void )
{

  unsigned char count=0;

  DDRE=0x02;

  asm("cli");
  UBRR0L = (unsigned char)baudrate;// 47 for 9600
  UBRR0H = (unsigned char)(baudrate >> 8);// 0 for 9600

  UCSR0B = ( 1 << RXEN0 ) | ( 1 << TXEN0 );
  UCSR0C = ( 1 << UCSZ01 ) | ( 1 << UCSZ00 );// 8 bit, no parity, 1 stop
  asm("sei");

  while(1)
  {

    putchar_uart(count);

    count++;

  }
}

void putchar_uart (char c)
{
    UDR0 = c;
        while ( ! ( UCSR0A & ( 1 << TXC0 ) ) );
    UCSR0A = (1 << TXC0 );
}


На терминал ПК ни один байт не проходит sad.gif
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов (1 - 6)
Axxel
сообщение Dec 7 2007, 06:40
Сообщение #2


Частый гость
**

Группа: Новичок
Сообщений: 140
Регистрация: 31-01-07
Из: Челябинск
Пользователь №: 24 896



Честно говоря не знаю что за микросхема, и зачем в функции передачи
используется сдвиг, но у меня функция передачи так выглядела (AT90S2113):

void send(unsigned char value)
{
while(!(USR&0x20)); //проверка завершения передачи символа
UDR=value;
}

P.S.
УАРТ правильно настроили? Разрешили его использование?

Сообщение отредактировал Axxel - Dec 7 2007, 06:41


--------------------
Если боишься - не говори. если сказал - не бойся. ©
Go to the top of the page
 
+Quote Post
gest
сообщение Dec 7 2007, 09:15
Сообщение #3





Группа: Новичок
Сообщений: 3
Регистрация: 6-12-07
Пользователь №: 33 019



UART настроен и разрешён, пробовал сделать loopback - работает, COM-порт тоже проверил. Пока остаётся думать, что проблема в несовпадении логических уровней\частоты. Но, как мне кажется, это маловероятно :\
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Dec 7 2007, 09:42
Сообщение #4


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Цитата(gest @ Dec 7 2007, 11:15) *
Пока остаётся думать, что проблема в несовпадении логических уровней\частоты. Но, как мне кажется, это маловероятно :\
Может еще линии приема/передачи попутаны или в терминалке включено управление потоком (flow control). Еще попробуйте перед DDRE = 0x02 поставить PORTE = 0x02; (иначе получаете короткий импульс на линии передачи, который может сбивать терминал) или вообще уберите запись в DDRE - порт настраивается на вывод автоматически при разрешении передачи UART. Очень не помешает подтяжка к питанияю на TXD.
Цитата(Axxel @ Dec 7 2007, 08:40) *
и зачем в функции передачи используется сдвиг
А вот это как раз очень грамотно. Это эквивалентно вашему while(!(USR&0x20)), только если вас разбудить в 5 утра - вы не скажете, какой бит проверяется в вашем коде, а gestа даже будить не нужно - в его коде бит явно прописан. Самодокументирующийся код. И ошибочно указать не тот бит гораздо больше шансов у вас.

gestу - не по теме вопроса, но все же:
Код
#define F_CPU 7372800UL
#define UART_BAUD_RATE 9600    

#define baudrate (F_CPU / UART_BAUD_RATE * 16 - 1)


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
InvisibleFed
сообщение Dec 7 2007, 09:55
Сообщение #5


Местный
***

Группа: Свой
Сообщений: 401
Регистрация: 18-11-06
Из: Хабаровск
Пользователь №: 22 469



Ну раз пишите, что новичек, хорошо проверили делителя частоты относительно входной частоты XTAL1 в конфгурационных регистрах UART? Частая ошибка, также, (у самого было) - разведено место на плате под "папу" а впаяна "мама"...
Go to the top of the page
 
+Quote Post
Axxel
сообщение Dec 7 2007, 10:04
Сообщение #6


Частый гость
**

Группа: Новичок
Сообщений: 140
Регистрация: 31-01-07
Из: Челябинск
Пользователь №: 24 896



Да еще: маловероятно, но может быть.
Со стороны РС тремя проводами подключали или нуль-модем?
Со стороны РС должна быть нуль-модемная распайка разъема, иначе
драйвер может не принимать/выдавать сигналы необходимого уровня, сам с таким
сталкивался.

P.S. Сядьте осциллографом со стороны МК, посмотрите сигнал. Если нет-то программа.

Сообщение отредактировал Axxel - Dec 7 2007, 10:07


--------------------
Если боишься - не говори. если сказал - не бойся. ©
Go to the top of the page
 
+Quote Post
gest
сообщение Dec 8 2007, 07:48
Сообщение #7





Группа: Новичок
Сообщений: 3
Регистрация: 6-12-07
Пользователь №: 33 019



Спасибо всем за помощь и подсказки - как оказалось, всё дело было в том, что я вместо внешнего 7,3М кристалла использовал внутренний 1М. Действительно глупо smile.gif
Теперь без осциллографа ни шагу smile.gif
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 27th July 2025 - 16:06
Рейтинг@Mail.ru


Страница сгенерированна за 0.01395 секунд с 7
ELECTRONIX ©2004-2016