|
|
  |
Проблемы с USART, Избитая тема, но все-таки |
|
|
|
Jun 6 2009, 07:57
|

Местный
  
Группа: Участник
Сообщений: 228
Регистрация: 4-06-09
Пользователь №: 49 940

|
Вот пытаюсь заставить компьютер принимать данные из контроллера по ком порту. Но получается что-то странное. Программа просло шлет натуральный ряд от 1 до 200. Следовательно должна наблюдаться наклонная прямая, а наблюдается непойми что.. Хотя закономерность в этом есть… Вот и не понятно в чем дело. Сначала думал, что неправильно число бит настроил или скорость- но вроде правильно. Проверьте пожалуйста, наверно глаз замылился. Кварц у меня на 7.372800, что кратно стандартным скоростям ком порта. Прикладываю скриншот и код программы  Код /************************************* ÏÐÈÌÅÐ ÌÈÃÀÍÈß ÑÂÅÒÎÄÈÎÄÎÌ Ïðèìåð ïîäêëþ÷åíèÿ íà ðèñóíêå 1 **************************************/
#include <avr/io.h> #include <util/delay.h>
//#define F_CPU 7372800UL
int main(void) { DDRA = 0xff; DDRB = 0b11000111; DDRC = 0xff; DDRD = 0xff;
SetupOutUART();
unsigned char i;
while(1){ i++; _delay_ms(200); PORTD = ~PORTD; SendByte(i); if (i==200){ i=1; } _delay_ms(200); }
}
void SetupOutUART (void){ UCSRB = 0b00011000; UCSRC = 0b10000110; UBRRL = 7;
}
void SendByte (unsigned char data){ UDR = data; }
|
|
|
|
|
Jun 6 2009, 08:15
|

Познающий...
     
Группа: Свой
Сообщений: 2 963
Регистрация: 1-09-05
Из: г. Иркутск
Пользователь №: 8 125

|
Цитата(Skaf @ Jun 6 2009, 16:57)  Код /************************************* void SetupOutUART (void){ UCSRB = 0b00011000; UCSRC = 0b10000110; UBRRL = 7; } } Очень советую не записывать цифры напрямую в регистры конфигурации, а использовать для этого такой вид записи Код REG_NAME = (1 << BIT_NAME0) | (1 << BIT_NAME1) | (1 << BIT_NAME2); Где REG_NAME - имя регистра, BIT_NAME0, BIT_NAME1, BIT_NAME2 - имена битов. Таким образом гораздо легче прочитать, что делает программа. В Вашем же случае придется октрывать даташит и вычитывать номера разрядов и разбираться, за что они отвечают. К сожалению, даташита нет под рукой. Цитата(Skaf @ Jun 6 2009, 16:57)  Код void SendByte (unsigned char data){ [b]Если данные отправляются "в лоб", то нужно анализировать флаг UDRE. И пока он не равен 1, ничего не отправлять. А задержку на 200 мс - выкинуть.[/b] UDR = data; }
--------------------
Выбор.
|
|
|
|
|
Jun 6 2009, 08:37
|

Местный
  
Группа: Участник
Сообщений: 228
Регистрация: 4-06-09
Пользователь №: 49 940

|
Цитата В Вашем же случае придется октрывать даташит и вычитывать номера разрядов Сейчас исправлю. Перепишу код с указанием битов. Что касается битрейта, то должно быть все верно исходя из формулы его вычисления, частоты кварца 7372800 и делителя 7. Кстати в PROTEUS этот код работает как часы.
|
|
|
|
|
Jun 6 2009, 10:26
|

Профессионал
    
Группа: Свой
Сообщений: 1 001
Регистрация: 27-06-06
Пользователь №: 18 409

|
Ну если вы уверены что у ваша программа работает правильно тогда ищите косяки снаружи  Например в самом COM-порту, терминале, преобразователе ttl-rs232 (если у вас не переходник com-usb) Попробуйте по нажатию кнопки передавать байт и смотреть что будет приходить. Или постоянно передавать какое-либо число. Судя по коду программы всё должно работать правильно. Была-бы под рукой платка с МК и max232 проверил-бы у себя.
|
|
|
|
|
Jun 6 2009, 10:44
|

Профессионал
    
Группа: Свой
Сообщений: 1 001
Регистрация: 27-06-06
Пользователь №: 18 409

|
Цитата(Skaf @ Jun 6 2009, 13:29)  У меня собран кабель-переходник на ST232. Кабель был проверен путем замыкания входа и выхода. Через гипер терминал принималось точно то, что передавалось наружу. Значит вроде должен быть исправен Для проверки UARTа МК закольцуйте данные через него - сделайте отправку эха назад в ком-порт. Добавте функцию ReadByte и после настройки UART цикле while отправляйте эхо. Не забудте разрешить приём если он у вас запрещён. Код void SendByte(unsigned char Data) { //ждём пока не освободится передающий буффер while ( !( UCSRA & (1<<UDRE)) ); UDR = Data; }
unsigned char ReadByte(void) { //ждём пока не буте получен байт while ( !( UCSRA & (1<<RXC)) ); return UDR; }
void main(void) { //тут настройте уарт
//бесконечный цикл while(1) SendByte(ReadByte()); }
} Сможете проверить стабильность работы модуля UART и преобразователя ttl-rs232.
Сообщение отредактировал mempfis_ - Jun 6 2009, 10:45
|
|
|
|
|
Jun 6 2009, 13:12
|

Гуру
     
Группа: Участник
Сообщений: 2 254
Регистрация: 4-05-07
Из: Moscow
Пользователь №: 27 515

|
Цитата 120 121 122 123 257 233 126 127 А поточнее нельзя? Число 257 - это что такое? -- Посмотрите пропайку и степень загрязнения конденсаторов около кварца.
Сообщение отредактировал DpInRock - Jun 6 2009, 13:15
--------------------
On the road again (Canned Heat)
|
|
|
|
|
Jun 6 2009, 17:34
|

Местный
  
Группа: Участник
Сообщений: 228
Регистрация: 4-06-09
Пользователь №: 49 940

|
МК мега16. Совсем не работает это значит не мигает светодиод, который висит на PD7 и мигает за счет PORTD = ~PORTD; Вот реальные байты принятые из ком порта ПК. Должен быть натуральный ряд. Цитата FE 03 04 FF 06 FF 08 1F FE 0B FE F8 0E F8 10 1F FF F3 F4 F1 FF 18 1F 1E 1B 1C 1F 1E FF 20 E1 FE 23 24 3F 26 FE FE FF 3A FB F9 FB FF F9 FE 3F 3E FE 3F 36 3F 38 FE 3E E7 3C 3F 3E 3F 7F FC E8 44 FF F4 FF C8 49 FE E9 4C 4D CE CF 50 FD D2 F3 F4 D5 F5 F7 BC 5F EB EF DC 5F 5E FF E0 61 7E 63 64 F6 66 F6 FF EA 7B 6C FF 6E 6F F8 F1 7E 73 74 F7 76 7F 78 7F 7E 7B 7C 7F 7E 7F 80 FE F0 FC FF F8 FF 88 8F FE FF 8C 8F 8E 8F 90 F1 BE F3 94 9F F6 FF FE 99 9E FB 9C 9F 9E 9F BF FE FF FF A5 BE FA E8 FF FE FB FD AF EE EF BF FB F3 B4 BF BE BF FF BF BE BB BC BD BE BF C0 FF FE C3 C4 FF C6 FC C8 F0 03 F8 F0 07 08 1F FE
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|