Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: while(!(UCSR0A & b01000000));
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > MCS51, AVR, PIC, STM8, 8bit
SatMinistry
продолжу вопрос если можно: а строка
Цитата
while(!(UCSR0A & b01000000));

подразумевает использование прерывания чтобы установился этот самый флаг завершения передачи? И можно ли как-то без него обойтись....
Палыч
Вопрос не четко сформулирован...
Флаг устанавливается по условиям, указанным в DS. Прерывания на установку флага не влияют (за исключением сброса некоторых флагов - сбрасываются при соответствующем прерывании)
SatMinistry
вопрос просто перенесли из другой ветки. там было про посылку символа в уарт....это строка ожидания пока не установится флаг завершения передачи....прерываний я уже понял что нет тут никаких...просто я не мог понять а что сбрасывает этот флаг....а сбрасывает его по видимому строка UCSR0A = b01000000 - вычитал что вот так странно сделано что надо записать 1 чтобы сбросить флаг. Верно?
Палыч
Цитата(SatMinistry @ Jun 12 2010, 11:45) *
вычитал что вот так странно сделано что надо записать 1 чтобы сбросить флаг. Верно?

Совершенно верно.
SatMinistry
эта функция вывода символа в уарт у меня заработала. Теперь бьюсь над тем чтоб вывести строку через буфер....с использованием va_list и т.д....на функции vsprintf которой хочу отправить строку в буфер контроллер перезаружаетсяsad.gif
Палыч
Цитата(SatMinistry @ Jun 16 2010, 18:52) *
бьюсь над тем чтоб вывести строку через буфер....с использованием va_list и т.д.

Предлагаете поработать телепатом? Текст своей функции приведите.
SatMinistry
Я с работы уже уходил не успевал скинуть. Завтра приведу в точности а памяти конструкция следующая:

char sbuf[100];

void func(char *format, ...)
{
va_list pa;
va_start(format, pa);
vsprintf(sbuf, pa, format );
va_end(format, pa);
//и тут в цикле for этот самый sbuf через работающую ф-цию выводится в уарт через объявление указателя и его приращение... но железо перезапускается на строке vsprintf(sbuf, pa, format ); я так понимаю потому что т.к. функция вывода одного символа в компорт работает я понаставлял вывод символа после каждой строки и последним выводится символ перед этой строкой и заново выводится сначала вкруговую со старта программы откуда я сделал вывод что контроллер тупо ресетится...
}

завтра приведу нормально текст и сам вызов чтобы можно было конкретно о чем-то говорить.
PS А пока если можно ткните в какую сторону впринципе почитать про отладку программ в иар на нашенском если есть....
Сергей Борщ
Цитата(SatMinistry @ Jun 16 2010, 20:36) *
PS А пока если можно ткните в какую сторону впринципе почитать
Посмотрите в сторону размера стеков.
Палыч
1. Возможно - память подвела, но - нужно так:
vsprintf(sbuf, format, pa);

2. Посмотрите внимательно на описание va_start - там есть исключения (не попали ли в них?).
SatMinistry
вот как это выглядит на самом деле smile.gif :
Код
char s1buf[100];

void MYTX_printf(const char *format, ...)
{
  DEBUG_TX('r');
  va_list ap;
  DEBUG_TX('i');
  va_start(ap, format);
  DEBUG_TX('t');
  vsprintf(s1buf,format,ap);
  DEBUG_TX('e');
  va_end(ap);
  DEBUG_TX('m');
  for(char *uk = s1buf; *uk; uk++)
  {
    DEBUG_TX('y');
    DEBUG_TX(*uk);
    DEBUG_TX('G');
  }
}


Код
void DEBUG_TX(unsigned char bt)
{
    UCSR0A= (1<<6);   //UCSR0A= b01000000;
    UDR0=bt;
    while(!(UCSR0A & (1<<6)));  //while(!(UCSR0A & b01000000));
}

И вызов этого дела происходит следующим образом:
Код
MYTX_printf((char *) "**** Software LAGs - OK\r\n");


ЗЫ Ситуация в общем такая что мне дали готовую плату устройства чтоб я с ней поковырялся и поучился....но что там на что может влиять я себе пока не представляю в общем-то...там и память внешняя навешана и много всякого разного....меня же пока интересует только запуск мк и его уарт. но что-либо проверяю физической прошивкой т.к. не знаю пока в чем это делать программно и при этом понятно начинающему....
Сергей Борщ
Цитата(SatMinistry @ Jun 17 2010, 10:30) *
UCSR0A= (1<<6); //UCSR0A= b01000000;

чтоб я с ней поковырялся и поучился...
Чтобы вы поучились, как не нужно писать программы.
Сколько стека вы выделили программе?
Зачем вы константную строку приводите к неконстантному char *? Тем самым вы разрешаете функции изменять (намеренно или случайно) эту строку. Но для константной строки это бессмысленно. Тем более что прототип функции указывает, что ожидается const char *. Зачем же здесь приведение? Также почитайте описание компилятора на предмет ключевого слова __flash и посмотрите в листинге, где расположена ваша строка "**** Software LAGs - OK\r\n" - в ОЗУ или во флешь. Тогда будем двигаться дальше.
SatMinistry
Вызов уже поменял на
Цитата
MYTX_printf("Software LAGs - OK\r\n");

с приведением то осталось с попыток использовать для задачи иаровскую заморочку _formatted_write_P. и там же использовалось флеш.....а тут я флеш нигде не пишу.....
От убирания приведения правда ничего вообще не поменялось....замечание по поводу пинов я понял я просто пока хочу разобраться в примитивном виде с идеями и как они работают и исправил так как первое пришло в голову (в коде большого проекта который дали к плате было то что закомментено но оно не компилилось по понятным причинам в созданном новом проекте), а то что так писать не нужно понимаю...
Стек в опциях проэкта посмотрел стоял 0х20 байт и 16 левелов. После увеличения значений все стало работать совершенно иначе. прога уже доходит до своего основного бесконечного цикла судя по диоду и крутится в нем, а в терминале посылаемая строка.smile.gif

ЗЫ: я пробовал запускать дебаггер в ИАРе но при попытки просмотра какой-то страницы кроме СОDE он наглухо вис....
ЗЫ2: а что значит посмотреть в листинге куда строка пишется?
Сергей Борщ
Цитата(SatMinistry @ Jun 17 2010, 16:59) *
ЗЫ2: а что значит посмотреть в листинге куда строка пишется?
В настройке компилятора указать, чтобы генерил файл листинга. В полученном после компиляции файле листинга посмотреть - в какой сегмент компилятор положил строку. Далее в описании компилятора посмотреть, к чему относится этот сегмент - к флешу или к ОЗУ. В зависимости от этого для доступа должны использоваться разные команды (компилятор сам знает какие по наличию или отсутствию квалификатора __flash у указателя), а явным приведением вы могли отменить этот квалификатор. В результате - строка во флешь, а вы обращаетесь в ОЗУ. А там вместо строки - какой-то мусор.
SatMinistry
спасибо завтра поищу что это такое на будущее. Пока это работает будем двигаться дальше - пытаться принимать с уарта и обрабатывать это делоsmile.gif
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.