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

 
 
> Глючит FT232BL
uuu2
сообщение May 15 2009, 23:42
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 50
Регистрация: 23-04-09
Пользователь №: 48 156



ATMega48 соединена с FT232BL через TDX/RDX. По нажатию кнопки передаётся два байта на FT232BL:


Код
#define USART_BAUD 9600ul
#define USART_UBBR_VALUE ((F_CPU/(USART_BAUD<<4))-1)

void USART_vInit(void)
{
    // Set baud rate
    unsigned short int UBRRH = USART_UBBR_VALUE>>8;
    unsigned short int UBRRL = USART_UBBR_VALUE;

    // Set frame format to 8 data bits, no parity, 1 stop bit
    UCSR0C = (0<<USBS0)|(1<<UCSZ00)|(1<<UCSZ00);

    // Enable receiver and transmitter
    UCSR0B = (1<<RXEN0)|(1<<TXEN0);
}

void USART_vSendByte(unsigned short int u8Data)
{
    // Wait if a byte is being transmitted
    while((UCSR0A&(1<<UDRE0)) == 0);
    // Transmit data
    UDR0 = u8Data;
}

unsigned short int USART_vReceiveByte()
{
    if ((UCSR0A&(1<<RXC0)) == 0) {return UDR0;} else {return 0;}
}


int main(void)              // начало основой программы
{

...

(ежесекундно проверяется статус кнопки, и, если кнопка нажата, то)

{
мигнуть лампочкой;
USART_vSendByte(10);
USART_vSendByte(15);
}

}


}

Однако результат следующий. Во-первых, за раз отправляется только один байт. Во-вторых, он всегда равен 127 (в 7-битном режиме) или 255 (в 8-битном режиме). В-третьих, даже этот неверный байт отсылается не стабильно: в 60-70% случаев байт не отправляется, хотя лампочка мигает (т.е. условие нажатия выполняется).

Кроме того, приём байта вообще не работает.

Подозреваю, что причина - в неправильной работе с UART.
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
SysRq
сообщение May 16 2009, 13:37
Сообщение #2


Чайник, 1 литр
****

Группа: Свой
Сообщений: 655
Регистрация: 17-05-06
Из: Moscow
Пользователь №: 17 168



Цитата(uuu2 @ May 16 2009, 03:42) *
Код
    // Set frame format to 8 data bits, no parity, 1 stop bit
    UCSR0C = (0<<USBS0)|(1<<UCSZ00)|(1<<UCSZ00);
Тут или код врёт, или комментарий к нему smile.gif Copy\paste - великий источник ошибок в программе.

Впрочем, все равно может не работать. Потому что еще надо фьюзы выбора источника тактирования и деления частоты проверить. И значение F_CPU.

Цитата(uuu2 @ May 16 2009, 03:42) *
Подозреваю, что причина - в неправильной работе с UART.
Ага, около того. Неплохо было бы заголовок темы сменить, а?

Сообщение отредактировал SysRq - May 16 2009, 13:39
Go to the top of the page
 
+Quote Post
uuu2
сообщение May 16 2009, 15:41
Сообщение #3


Участник
*

Группа: Участник
Сообщений: 50
Регистрация: 23-04-09
Пользователь №: 48 156



Цитата(SysRq @ May 16 2009, 17:37) *
Тут или код врёт, или комментарий к нему smile.gif Copy\paste - великий источник ошибок в программе.


Начинать приходится с copy/paste. А потом разбираться с кодом. smile.gif

Код
#define F_CPU 2000000UL
#define USART_BAUD 19200ul
#define USART_UBBR_VALUE ((F_CPU/(USART_BAUD<<4))-1)

UBRR0H = USART_UBBR_VALUE>>8;
UBRR0L = USART_UBBR_VALUE;

[b]UCSR0C =
(0<<UPM00)|(0<<UPM01) // проверка четн.откл
|(0<<USBS0) // 1 стоп-бит
|(1<<UCSZ00)|(1<<UCSZ01) // 8 бит фрейм
|(0<<UMSEL00); // асинхронный[/b]

...

// Передача байта при нажатии кнопки
USART_vSendByte(10);


Биты регистра установил на основе данной странички (http://mcu.narod.ru/HARDANDSOFT/AVR_UART.htm). Там, правда, написано о ATMEGA128, но наименования битов в iom48p.h должны быть такими же (?).

На ПК (драйвер микросхемы FT232BL) установлено:
Код
...
FT_Current_Baud:=19200;
FT_Current_StopBits:=FT_STOP_BITS_1;
FT_Current_Parity:=FT_PARITY_NONE;
FT_Current_DataBits:=6;
Set_USB_Device_DataCharacteristics;
...


Результат передачи данных всё тот же: вместо 1 байта передается 2 неправильных.

Тут, правда я не совесем понял. Начальный и стоп-биты входят во фрейм или нет? Т.е. если я установил фрейм в 8 бит и 1 стоп-бит, то получится 6 бит данных? Правильно?

Кроме того, я посмотрел файл iom48.h

Код
#define UCSR0B _SFR_MEM8(0xC1)
#define TXB80 0
#define RXB80 1
#define UCSZ02 2
#define TXEN0 3
#define RXEN0 4
#define UDRIE0 5
#define TXCIE0 6
#define RXCIE0 7

#define UCSR0C _SFR_MEM8(0xC2)
#define UCPOL0 0
#define UCSZ00 1
#define UCPHA0 1
#define UCSZ01 2
#define UDORD0 2
#define USBS0 3
#define UPM00 4
#define UPM01 5
#define UMSEL00 6
#define UMSEL01 7


Это нормально, что биты UCSZ00 и UCPHA0 занимают одно и то же место в регистре? И почему бит UCSZ02 находится в регистре UCSR0B, а остальны 2 бита (UCSZ00 и UCSZ01) в регистре UCSR0С? Тут (http://mcu.narod.ru/HARDANDSOFT/AVR_UART.htm) все они расположены во одном регистре.

А если установить UCSZ02 в единицу (чтобы передать 9-битный фрейм), то передача реально вообще не происходит.
Цитата(SysRq @ May 16 2009, 17:37) *
Ага, около того. Неплохо было бы заголовок темы сменить, а?
Можно и сменить. Только я не модератор, как я его сменю?
Go to the top of the page
 
+Quote Post
SysRq
сообщение May 16 2009, 16:04
Сообщение #4


Чайник, 1 литр
****

Группа: Свой
Сообщений: 655
Регистрация: 17-05-06
Из: Moscow
Пользователь №: 17 168



Цитата(uuu2 @ May 16 2009, 19:41) *
Код
|(1<<UCSZ00)|(1<<UCSZ01) // 8 бит фрейм
Не фрейма, а данных размер это.

Цитата(uuu2 @ May 16 2009, 19:41) *
Код
FT_Current_DataBits:=6;
А это не фрейма, это данных размер...

Цитата(uuu2 @ May 16 2009, 19:41) *
...наименования битов в iom48p.h должны быть такими же (?).
Почему бы не взять официальный документ от Atmel на МК и не посмотреть (Яндекс\Google знает)? Для всех МК все по-разному.

PS: USART в асинхронном режиме на 19200 работать при 2МГц не будет. Слишком велика ошибка - 7%. Оставьте 9600.
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- uuu2   Глючит FT232BL   May 15 2009, 23:42
- - aaarrr   Код unsigned short int UBRRH = USART_UBBR_VALUE...   May 16 2009, 00:29
- - uuu2   Угу. Исправил. Теперь глючит немного по-другому. ...   May 16 2009, 12:31
|- - uuu2   Цитата(SysRq @ May 16 2009, 20:04) Не фре...   May 16 2009, 19:20
|- - aaarrr   Цитата(uuu2 @ May 16 2009, 23:20) Причём ...   May 16 2009, 19:40
|- - SysRq   Пока сообщение набивал, да отвлекался, все уже до ...   May 16 2009, 19:51
- - uuu2   Гыг! Именно это я и сделал. На МК поставил 960...   May 16 2009, 20:23
- - SysRq   Исключительно повезло, что оно работает. Больше н...   May 16 2009, 20:30
- - uuu2   Ознакомился. Как оказалось, передача всё-таки рабо...   May 16 2009, 22:49
- - DpInRock   Мама дорогая. В древности отроков, которые даташи...   May 16 2009, 23:21
|- - uuu2   Цитата(DpInRock @ May 17 2009, 03:21) Убе...   May 17 2009, 00:19
|- - aaarrr   Цитата(uuu2 @ May 17 2009, 04:19) Мне инт...   May 17 2009, 00:35
- - aaarrr   Чтобы обеспечить стабильную работу UART, отклонени...   May 16 2009, 23:28
|- - @Ark   Цитата(aaarrr @ May 17 2009, 03:28) Чтобы...   May 17 2009, 08:59
- - DpInRock   Чисто случайно юзаю мегу48 на 9600 уже давно. Набл...   May 16 2009, 23:45
- - DpInRock   ЦитатаДа знаю я про эту галочку CLKDIV8 Ага.   May 17 2009, 00:43
- - SysRq   Цитата(aaarrr @ May 17 2009, 04:35) В DS ...   May 17 2009, 14:52
|- - aaarrr   Цитата(SysRq @ May 17 2009, 18:52) ...ост...   May 17 2009, 15:15
- - uuu2   Ну, решил я установить "более точный" вн...   May 17 2009, 23:03
- - aaarrr   Ну, бывает. Заводите внешнюю частоту и проверяйте ...   May 17 2009, 23:49
|- - uuu2   Цитата(aaarrr @ May 18 2009, 03:49) Ну, б...   May 18 2009, 00:20
|- - aaarrr   Цитата(uuu2 @ May 18 2009, 04:20) При чем...   May 18 2009, 00:26
- - uuu2   Отодрал. Заработал. Что это значит: конденсаторы н...   May 18 2009, 00:42
|- - aaarrr   Цитата(uuu2 @ May 18 2009, 04:42) Отодрал...   May 18 2009, 00:55
- - uuu2   М-да. Конденсаторы-то разные. Впаял один кондер не...   May 18 2009, 01:25
- - aaarrr   Цитата(uuu2 @ May 18 2009, 05:25) М-да. К...   May 18 2009, 01:35


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

 


RSS Текстовая версия Сейчас: 21st July 2025 - 19:40
Рейтинг@Mail.ru


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