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

 
 
 
Reply to this topicStart new topic
> while(!(UCSR0A & b01000000));
SatMinistry
сообщение Jun 11 2010, 11:36
Сообщение #1


Участник
*

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



продолжу вопрос если можно: а строка
Цитата
while(!(UCSR0A & b01000000));

подразумевает использование прерывания чтобы установился этот самый флаг завершения передачи? И можно ли как-то без него обойтись....

Сообщение отредактировал SatMinistry - Jun 11 2010, 11:37
Go to the top of the page
 
+Quote Post
Палыч
сообщение Jun 11 2010, 13:12
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 2 399
Регистрация: 10-05-06
Из: г. Новочеркасск
Пользователь №: 16 954



Вопрос не четко сформулирован...
Флаг устанавливается по условиям, указанным в DS. Прерывания на установку флага не влияют (за исключением сброса некоторых флагов - сбрасываются при соответствующем прерывании)
Go to the top of the page
 
+Quote Post
SatMinistry
сообщение Jun 12 2010, 07:45
Сообщение #3


Участник
*

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



вопрос просто перенесли из другой ветки. там было про посылку символа в уарт....это строка ожидания пока не установится флаг завершения передачи....прерываний я уже понял что нет тут никаких...просто я не мог понять а что сбрасывает этот флаг....а сбрасывает его по видимому строка UCSR0A = b01000000 - вычитал что вот так странно сделано что надо записать 1 чтобы сбросить флаг. Верно?
Go to the top of the page
 
+Quote Post
Палыч
сообщение Jun 12 2010, 11:20
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 2 399
Регистрация: 10-05-06
Из: г. Новочеркасск
Пользователь №: 16 954



Цитата(SatMinistry @ Jun 12 2010, 11:45) *
вычитал что вот так странно сделано что надо записать 1 чтобы сбросить флаг. Верно?

Совершенно верно.
Go to the top of the page
 
+Quote Post
SatMinistry
сообщение Jun 16 2010, 14:52
Сообщение #5


Участник
*

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



эта функция вывода символа в уарт у меня заработала. Теперь бьюсь над тем чтоб вывести строку через буфер....с использованием va_list и т.д....на функции vsprintf которой хочу отправить строку в буфер контроллер перезаружаетсяsad.gif
Go to the top of the page
 
+Quote Post
Палыч
сообщение Jun 16 2010, 15:12
Сообщение #6


Гуру
******

Группа: Свой
Сообщений: 2 399
Регистрация: 10-05-06
Из: г. Новочеркасск
Пользователь №: 16 954



Цитата(SatMinistry @ Jun 16 2010, 18:52) *
бьюсь над тем чтоб вывести строку через буфер....с использованием va_list и т.д.

Предлагаете поработать телепатом? Текст своей функции приведите.
Go to the top of the page
 
+Quote Post
SatMinistry
сообщение Jun 16 2010, 17:36
Сообщение #7


Участник
*

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



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

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, 17:37
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Jun 16 2010, 18:07
Сообщение #8


Гуру
******

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



Цитата(SatMinistry @ Jun 16 2010, 20:36) *
PS А пока если можно ткните в какую сторону впринципе почитать
Посмотрите в сторону размера стеков.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
Палыч
сообщение Jun 17 2010, 07:14
Сообщение #9


Гуру
******

Группа: Свой
Сообщений: 2 399
Регистрация: 10-05-06
Из: г. Новочеркасск
Пользователь №: 16 954



1. Возможно - память подвела, но - нужно так:
vsprintf(sbuf, format, pa);

2. Посмотрите внимательно на описание va_start - там есть исключения (не попали ли в них?).
Go to the top of the page
 
+Quote Post
SatMinistry
сообщение Jun 17 2010, 07:30
Сообщение #10


Участник
*

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



вот как это выглядит на самом деле 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");


ЗЫ Ситуация в общем такая что мне дали готовую плату устройства чтоб я с ней поковырялся и поучился....но что там на что может влиять я себе пока не представляю в общем-то...там и память внешняя навешана и много всякого разного....меня же пока интересует только запуск мк и его уарт. но что-либо проверяю физической прошивкой т.к. не знаю пока в чем это делать программно и при этом понятно начинающему....

Сообщение отредактировал rezident - Jun 18 2010, 02:41
Причина редактирования: Оформление цитат исходников.
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Jun 17 2010, 13:04
Сообщение #11


Гуру
******

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



Цитата(SatMinistry @ Jun 17 2010, 10:30) *
UCSR0A= (1<<6); //UCSR0A= b01000000;

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


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
SatMinistry
сообщение Jun 17 2010, 13:59
Сообщение #12


Участник
*

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



Вызов уже поменял на
Цитата
MYTX_printf("Software LAGs - OK\r\n");

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

ЗЫ: я пробовал запускать дебаггер в ИАРе но при попытки просмотра какой-то страницы кроме СОDE он наглухо вис....
ЗЫ2: а что значит посмотреть в листинге куда строка пишется?

Сообщение отредактировал SatMinistry - Jun 17 2010, 14:05
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Jun 17 2010, 16:45
Сообщение #13


Гуру
******

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



Цитата(SatMinistry @ Jun 17 2010, 16:59) *
ЗЫ2: а что значит посмотреть в листинге куда строка пишется?
В настройке компилятора указать, чтобы генерил файл листинга. В полученном после компиляции файле листинга посмотреть - в какой сегмент компилятор положил строку. Далее в описании компилятора посмотреть, к чему относится этот сегмент - к флешу или к ОЗУ. В зависимости от этого для доступа должны использоваться разные команды (компилятор сам знает какие по наличию или отсутствию квалификатора __flash у указателя), а явным приведением вы могли отменить этот квалификатор. В результате - строка во флешь, а вы обращаетесь в ОЗУ. А там вместо строки - какой-то мусор.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
SatMinistry
сообщение Jun 17 2010, 17:39
Сообщение #14


Участник
*

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



спасибо завтра поищу что это такое на будущее. Пока это работает будем двигаться дальше - пытаться принимать с уарта и обрабатывать это делоsmile.gif
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 18th July 2025 - 12:30
Рейтинг@Mail.ru


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