Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Передача через UART
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > MCS51, AVR, PIC, STM8, 8bit
eracer
Доброго времени суток!)
Недавно начал изучать 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". Более простые программы идут замечательно.
mrKirill
Цитата
Также есть проблемы с прогрузкой. Пробовал загрузить hex файл через AVR ISP, в результате вылезает ошибка "Programming Error(s) occured", "Failed to verify device". Более простые программы идут замечательно.

Это у Вас проблемы со схемой или программатором...а вовсем не в hex.
Черным по белому написано же "Произошли ошибки при программировании", "Не прошла верификация".
Самое простое - проверьте кабель от программатора до схемы.

При маленьком размере hex прошивка может происходить нормально, а при большем уже вызывать ошибки программирования...было подобное, уменьшил длину соединительного ISP кабеля и все стало стабильно.

Цитата
//Если в этом месте ввести цикл отслеживания готовности, прога виснет, USR = 0x00

Вот так проверяете?
Цитата
while ( !( UCSRA & (1<<UDRE)) )
eracer
Цитата(mrKirill @ May 24 2010, 23:38) *
Это у Вас проблемы со схемой или программатором...а вовсем не в hex.
Черным по белому написано же "Произошли ошибки при программировании", "Не прошла верификация".
Самое простое - проверьте кабель от программатора до схемы.

При маленьком размере hex прошивка может происходить нормально, а при большем уже вызывать ошибки программирования...было подобное, уменьшил длину соединительного ISP кабеля и все стало стабильно.


Hex файл действительно вряд ли создался "неправильный". Пользовался проводом STK300, загружал с помощью проги AVR ISP. На кафедре вроде бы есть AVR ISP mkll, если дело именно в этом, можно будет попробовать. Насколько я знаю в IARe есть возможность создавать файлы .bat, но пока что я такой опции не нашел.

Цитата
Вот так проверяете?
while ( !( UCSRA & (1<<UDRE)) )

Именно так, только у меня регистр USR. В этом месте получается бесконечный цикл. На форуме вроде отмечали, что дебаггер IARa далек от совершенства, но проверить врет ли он возможности не было, по отмеченной выше причине.
swisst
Цитата(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 мс - перенастройте таймер.
eracer
Цитата(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.
eracer
(удалено)
Сергей Борщ
Цитата(eracer @ May 25 2010, 10:40) *
в симуляторе регистр USR = 0x00 независимо от состояния регистра UDR.
В симуляторе периферия не симулируется. Никак. Только ядро. Так что отлаживаться вам придется на реальном железе.
eracer
Огромное спасибо всем кто ответил! Кучу времени потратил, застряв на этой проблеме. angry.gif Надеюсь дальше будет попроще unsure.gif
eracer
Если, может быть, кто-то столкнется с аналогичной проблемой, в итоге воспользовался программой AVReal для загрузки.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.