|
|
  |
Передача через UART |
|
|
|
May 24 2010, 15:35
|
Участник

Группа: Участник
Сообщений: 17
Регистрация: 24-05-10
Пользователь №: 57 488

|
Доброго времени суток!) Недавно начал изучать IAR. Требуется передать массив символов через UART. Бит UDRE регистра USR всегда равен 0, хотя должен устанавливаться в 1 сразу же после отправки символа. Код #include <io8515.h> #define bit(n) (1<<(n)) #pragma vector = TIMER1_OVF1_vect __interrupt void T1_OVF_Handler(); void Init(); bool Put_Text_UART(const char* text, const unsigned int n); const unsigned char GText[] = "Proverka"; int main() { Init(); while(1){ } return 0; }
void Init() { TCCR1A = 0x01; //PWM mode, TOP=255, TCCR1B = 0x01; DDRB = 0x00; DDRD = 0x00; PORTD = 0; PORTB = 0; UBRR = 12; //9600 Baud OCR1A = 0xFF UCSRB = bit(3); TIMSK = bit(7); //TIMSK = (1<<TOIE1) asm("sei"); }
void Put_Text_To_UART(const unsigned char* text, const unsigned int n) { for (unsigned int i=0; i<n; i++) { //Если в этом месте ввести цикл отслеживания готовности, прога виснет, USR = 0x00 UDR = text[i]; } } __interrupt void T1_OVF_Handler() { Put_Text_To_UART(GText, sizeof(GText)); } Также есть проблемы с прогрузкой. Пробовал загрузить hex файл через AVR ISP, в результате вылезает ошибка "Programming Error(s) occured", "Failed to verify device". Более простые программы идут замечательно.
Сообщение отредактировал eracer - May 24 2010, 15:40
|
|
|
|
|
May 24 2010, 19:38
|
Местный
  
Группа: Свой
Сообщений: 283
Регистрация: 13-06-07
Из: Челябинск
Пользователь №: 28 391

|
Цитата Также есть проблемы с прогрузкой. Пробовал загрузить hex файл через AVR ISP, в результате вылезает ошибка "Programming Error(s) occured", "Failed to verify device". Более простые программы идут замечательно. Это у Вас проблемы со схемой или программатором...а вовсем не в hex. Черным по белому написано же "Произошли ошибки при программировании", "Не прошла верификация". Самое простое - проверьте кабель от программатора до схемы. При маленьком размере hex прошивка может происходить нормально, а при большем уже вызывать ошибки программирования...было подобное, уменьшил длину соединительного ISP кабеля и все стало стабильно. Цитата //Если в этом месте ввести цикл отслеживания готовности, прога виснет, USR = 0x00 Вот так проверяете? Цитата while ( !( UCSRA & (1<<UDRE)) )
|
|
|
|
|
May 24 2010, 21:15
|
Участник

Группа: Участник
Сообщений: 17
Регистрация: 24-05-10
Пользователь №: 57 488

|
Цитата(mrKirill @ May 24 2010, 23:38)  Это у Вас проблемы со схемой или программатором...а вовсем не в hex. Черным по белому написано же "Произошли ошибки при программировании", "Не прошла верификация". Самое простое - проверьте кабель от программатора до схемы.
При маленьком размере hex прошивка может происходить нормально, а при большем уже вызывать ошибки программирования...было подобное, уменьшил длину соединительного ISP кабеля и все стало стабильно. Hex файл действительно вряд ли создался "неправильный". Пользовался проводом STK300, загружал с помощью проги AVR ISP. На кафедре вроде бы есть AVR ISP mkll, если дело именно в этом, можно будет попробовать. Насколько я знаю в IARe есть возможность создавать файлы .bat, но пока что я такой опции не нашел. Цитата Вот так проверяете? while ( !( UCSRA & (1<<UDRE)) ) Именно так, только у меня регистр USR. В этом месте получается бесконечный цикл. На форуме вроде отмечали, что дебаггер IARa далек от совершенства, но проверить врет ли он возможности не было, по отмеченной выше причине.
|
|
|
|
|
May 25 2010, 06:43
|
Частый гость
 
Группа: Свой
Сообщений: 163
Регистрация: 16-02-07
Из: Харьков
Пользователь №: 25 425

|
Цитата(eracer @ May 25 2010, 00:15)  Hex файл действительно вряд ли создался "неправильный". Пользовался проводом STK300, загружал с помощью проги AVR ISP. На кафедре вроде бы есть AVR ISP mkll, если дело именно в этом, можно будет попробовать. Насколько я знаю в IARe есть возможность создавать файлы .bat, но пока что я такой опции не нашел.
Именно так, только у меня регистр USR. В этом месте получается бесконечный цикл. На форуме вроде отмечали, что дебаггер IARa далек от совершенства, но проверить врет ли он возможности не было, по отмеченной выше причине. включите подтяжку на PD0 и PD1 - когда заработает, то будет работать стабильнее... 1. Ваша частота 2 МГц ? - если ответ - нет, 1 МГц, то в UBRR надо писать 6. 2. На частоте 1 МГц 1 тик таймера равен 1 мкс, 1 цикл - 255 мкс...время отправки одного символа по УАРТ на скорости 9600 - 1 мс - перенастройте таймер.
|
|
|
|
|
May 25 2010, 07:40
|
Участник

Группа: Участник
Сообщений: 17
Регистрация: 24-05-10
Пользователь №: 57 488

|
Цитата(swisst @ May 25 2010, 10:43)  включите подтяжку на PD0 и PD1 - когда заработает, то будет работать стабильнее...
1. Ваша частота 2 МГц ? - если ответ - нет, 1 МГц, то в UBRR надо писать 6. 2. На частоте 1 МГц 1 тик таймера равен 1 мкс, 1 цикл - 255 мкс...время отправки одного символа по УАРТ на скорости 9600 - 1 мс - перенастройте таймер. Спасибо, поставил коэффициент деления CK/1024. Со скоростью я напутал - 19200 Бод/с, частота 4 МГц. Проблема тем не меннее осталась - в симуляторе регистр USR = 0x00 независимо от состояния регистра UDR.
|
|
|
|
|
May 25 2010, 07:40
|
Участник

Группа: Участник
Сообщений: 17
Регистрация: 24-05-10
Пользователь №: 57 488

|
(удалено)
Сообщение отредактировал eracer - May 25 2010, 07:42
|
|
|
|
|
May 25 2010, 09:32
|

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

|
Цитата(eracer @ May 25 2010, 10:40)  в симуляторе регистр USR = 0x00 независимо от состояния регистра UDR. В симуляторе периферия не симулируется. Никак. Только ядро. Так что отлаживаться вам придется на реальном железе.
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
May 28 2010, 07:27
|
Участник

Группа: Участник
Сообщений: 17
Регистрация: 24-05-10
Пользователь №: 57 488

|
Если, может быть, кто-то столкнется с аналогичной проблемой, в итоге воспользовался программой AVReal для загрузки.
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|