roboforum.ru

Технический форум по робототехнике.

прерывание виснет

avr123.nm.ru » 12 мар 2007, 21:27

Myp писал(а):поднимаю вобщем заново вопрос

есть вот такой код


У вас приведение типа к int

    (int)MSS          

а в ветвлении
       
      switch (MSS)                     //проверка заголовка
      {
       case 'L':  

используются символы.

Наверно логичней к символьному типу приводить

(char)

avr123.nm.ru » 12 мар 2007, 21:32

наверно зеленые цифры это значения в счетчике программы (PC) и связаны с командами АСМа  - переключись на просмотр АСМа и посмотри.

прочерки повидимому означают что нет четкой привязке к тексту проги на АСМе и нельзя воткнуть там точку останова.

Myp писал(а):как вобще в протеусе делать отладку?
как мне заставить пошагово выполнять программу? :(
ато я жму step into и совершенно ничего не меняется


вот так - proteus123.narod.ru/01.htm

Myp » 12 мар 2007, 21:35

тааак
уже интересней
а квавр различает или нет переменные написанные большими и маленькими буквами???

я чёто решил что он различает переменные с прописными и строчными буквами

ладно переделал
теперь так
Код: Выделить всёРазвернуть
      MSS = resived >> 2;  
     mssint = (int)MSS;

разве это значит что я кроме присваивания переменной mssint числового значения MSS ещё и саму переменную MSS привожу к числовому виду?

avr123.nm.ru » 12 мар 2007, 21:43

выше написал уже.

========

А что не в "микроконтроллерах"  обсуждение ?  
Может там продолжить ?

Myp » 12 мар 2007, 21:48

avr123.nm.ru писал(а):выше написал уже.

========

А что не в "микроконтроллерах"  обсуждение ?  
Может там продолжить ?


тоесть если раскрыть ваш ответ...
я и присвоил числовое значение пер. "mssint" и также изменил исходное значение в  пер. "MSS"
тоесть я не умею работать с переменными в си. =/


ну незнаю как хотите
имхо вопросы из раздела дурацких =)

Myp » 12 мар 2007, 21:54

всёже непонимаю

символы благополучно в буфер принимаються
без проблем
но программа светиком не моргает =/
тоесть мк сидит гдето в процедуре приёма символов и тупо ждёт следующего символа
не выходит из этого ожидания почемуто:(

avr123.nm.ru » 12 мар 2007, 22:06

Не могу понять в чем смысл приведения типа ?

Myp » 12 мар 2007, 22:15

хм
ну мы же принимаем текстовые данные по уарту?
принимаем например строку R20X
и мне надо оперировать с числом 20 а не с символами "2" и "0"

Vooon » 12 мар 2007, 22:39

приведу ваш код со своими комментами

Код: Выделить всёРазвернуть
char resived;
char MSS, LSS;
int mss, lss;

void priem(void)                        //процедура приёма и обработки строки
{
      char *end = 'X';                 // зачем так!???!!! 'X' = 0x58, уже потенциально опасное место!
                                       // а если это буффер - то почему не массив?
      resived = *gets(end, 3);         // мне не понятно...
      MSS = resived >> 2;              // сдвиги не буду комментировать...
      mss = (int)MSS;                  // а толку? в См нет типа данных строка!!! char - это уже число! [0 - 0xFF]
      LSS = resived << 1;              
      lss = (int)LSS - 4;              // опять...

      switch (MSS)                     //проверка заголовка (кстати по стандарту свитч работает с int'ом (16 бит))
      {
       case 'L':                       //если заголовок L (если MSS == 0x4C)
       PORTB.1 = lss;                  // устанавливаем или сбрасываем бит порта
       break;                          
       case 'R':                       //если заголовок R (если MSS == 0x52)
       PORTB.2 = lss;
       break;
       case 'i':                       //тож самое, к этой ножке прицепляем светодиод, для красоты
       PORTB.3 = lss;                  // 'i' = 0x69
       break;
       }
       MSS = 0;                        
}

avr123.nm.ru » 12 мар 2007, 22:47

Myp писал(а):хм

Ну мы же принимаем текстовые данные по уарту?


Все передаются числа.

Myp писал(а):принимаем например строку R20X


Она у вас помещается в строковую переменную ?

Или как в задаче /z5.htm   в буфер содержащий отдельные числа в порядке поступления в USART ?

Myp » 12 мар 2007, 22:49

// зачем так!???!!! 'X' = 0x58, уже потенциально опасное место

почему опасное?:( я таково незнаю. объясните плиз

// а если это буффер - то почему не массив?

эммм ну буфер это как раз "resived" в  нём 4 принятых символа храницца должны.

resived = *gets(end, 3);         // мне не понятно...

так  в хелпе к CVAVR написано...
char *gets(char *str, unsigned char len)

inputs, using getchar, the character string str terminated by the new line character.
The new line character will be replaced with 0.
The maximum length of the string is len. If len characters were read without encountering the new line character, then the string is terminated with 0 and the function ends.
The function returns a pointer to str.


mss = (int)MSS;                  // а толку? в См нет типа данных строка!!! char - это уже число! [0 - 0xFF]

ох блин вот это новость...
:?

Myp » 12 мар 2007, 22:54

avr123.nm.ru писал(а):
Myp писал(а):хм

Ну мы же принимаем текстовые данные по уарту?


Все передаются числа.

Myp писал(а):принимаем например строку R20X


Она у вас помещается в строковую переменную ?

Или как в задаче /z5.htm   в буфер содержащий отдельные числа в порядке поступления в USART ?


хм
ну вот
а в симуляторе написан именно символ который передаётся
вот я и подумал что в памяти храниться тоже символ...
ну и попытался работать с символами...

Myp » 12 мар 2007, 23:18

хорошо
попробуем по другому


чтобы принять 3 символа мне нужно создать массив из 3 символов
и в цикле заполнить этот массив с помощью getchar
(когда я буду ихчитать буфер  приёма будет автоматом очищаться?)

тоесть в итоге я получу массив вида 0х52, 0х32, 0х30 что будет соответствовать общечеловеческой строке "R20"

и дальше уже
switch(massiv[1])
case 'R'

Vooon » 13 мар 2007, 01:10

почему опасное? я таково незнаю. объясните плиз


а потому, что непонятно куда этот указатель (простите за товтологию) указывает  :!:

ну если известно что всегда приходит 4 символа (строка выглядит "R20\0" - где \0 заменяется 1им байтом = 0
(вы наверняка видели в хелпе "null terminated string" - говорит о том что строка ОБЯЗАТЕЛЬНО должна заканчиваться 0 (иначе трудноуловимые баги гарантированны)))

char *gets(char *str, unsigned char len) - где (не смотря в хелп) *str указатель на буффер, len - длинна в байтах

возвращает указатель на начало принятого блока (return str;)

Vooon » 13 мар 2007, 01:23

вот примерно так оно может выглядеть  :)

Код: Выделить всёРазвернуть
char buffer[10]; // реально нужно только 3+1 байт (3 значащих и терминатор)

void myfunc(void)
{
 char val = 0;
 gets(buffer, 3); // по RS232 передаем только направление, и значение (3 символа, без 0 в конце)
 
 if (buffer[0]=='R')
 {
   // включаем движок вправо
   sscanf(&buffer[1], "%i", &val); // в val теперь будет число переданное после буквы

   // далее уже чето колдуем с val
   //***
 }
 else if (buffer[0]=='L')
 {
   // включаем движок влево
   sscanf(&buffer[1], "%i", &val); // в val теперь будет число переданное после буквы

   //***
 }
}


Rambler\'s Top100 Mail.ru counter