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

Раздел создан специально для людей которым интересна робототехника, но в силу разных причин они не знают с чего начать.
Задавайте ваши вопросы, какими бы простыми они не казались, постоянные посетители форума постараются ответить на них по мере своих сил.
Робот своими руками. Самодельный робот.

Сообщение avr123.nm.ru » 13 мар 2007, 18:53

Myp писал(а):кстати краткий курс накрылся
не работает...http://www.avr123.nm.ru/

и вот как в таких условиях можно чтото сделать...


надо помнить о запасных вариантах -
 
http://proAVR.narod.ru

и еще штук 20 ...
Последний раз редактировалось avr123.nm.ru 28 май 2010, 11:20, всего редактировалось 1 раз.
Аватара пользователя
avr123.nm.ru
отсылающий читать курс
 
Сообщения: 14195
Зарегистрирован: 06 ноя 2005, 04:18
Откуда: Москва

Сообщение avr123.nm.ru » 13 мар 2007, 18:59

Myp писал(а):void Priem(void)                        
{
 int i = -1;
 while ((i+1) <= 3)
 {          
 buffer[i] = getchar();
 }
}

ну нет выхода из этой процедуры, счётчик не тикает висим на getchar


Посмотрите пожалуйста  http://proAVR.narod.ru/05.htm   "Язык Си для микроконтроллеров"

Что вы везде INT лепите ???  


{
 char ctr = 0;

 while (ctr < 3)
 {          
 buffer[i] = getchar();
 
 ctr++;
 }
}

==========

Что вы изобретаете велосипед - СМОТРИТЕ ПРИМЕРЫ !!!

в том числе и к компилятору.

==========

ctr  - обычное название для счетчиков


i  - для циклов for
Последний раз редактировалось avr123.nm.ru 28 май 2010, 11:21, всего редактировалось 1 раз.
Аватара пользователя
avr123.nm.ru
отсылающий читать курс
 
Сообщения: 14195
Зарегистрирован: 06 ноя 2005, 04:18
Откуда: Москва

Сообщение avr123.nm.ru » 13 мар 2007, 19:00

Кстати давно пора архив скачать на заглавной первой или 6-й странице курса.

Теперь когда .nm.ru  заработает...
Аватара пользователя
avr123.nm.ru
отсылающий читать курс
 
Сообщения: 14195
Зарегистрирован: 06 ноя 2005, 04:18
Откуда: Москва

Сообщение Myp » 13 мар 2007, 19:28

avr123.nm.ru писал(а):
какаято ИЗВРАЩЕННАЯ лабуда !

прочитайте наконец  pid.by.ru/05.htm   "Си для МК"

и начните писать НОРМАЛЬНО !

Что вы везде INT лепите ???  


{
 char ctr = 0;

 while (ctr < 3)
 {          
 buffer[ctr] = getchar();
 
 ctr++;
 }
}


харашо
а толку...
ну вот вставил я эту процедуру...

Код: Выделить всё
void priem(void)
{
 char ctr = 0;

 while (ctr < 3)
 {          
 buffer[ctr] = getchar();
 
 ctr++;
 }
}

и что?
а ничего, из getchar мы всё равно не выходим, сидим и чегото ждём....
Код: Выделить всё
while (1)
     {
     // Place your code here
     priem();
     putchar('1');
     };

мы что должны делать? тупо  печатать в терминал единичку,
как только я в терминал ввожу чтото, читать это в буфер и дальше тупо печатать единичку....
а что имеем?
сидим ждём пока я введу 3 символа, потом наконец печатаем единичку и дальше сидим ничё не делаем ждём пока я введу 3 символа.



я непонимаю, я что какимито словами непонятными описываю что мне надо?
если не ясно что мне нужно могу  ещё раз объяснить.
основная программа должна работать и изредка, по прерыванию, заполнять буфер
а не сидеть постоянно в ожидании символов

может это аппаратно нереализуемо?
раз никто не может сказать как это сделать =/

ЗЫ
какаято ИЗВРАЩЕННАЯ лабуда !

я с вами совершенно согласен
только ничего лучше я немогу написать
я ясно понимаю что то что я написал не будет работать так как я хочу
Аватара пользователя
Myp
скрытый хозяин вселенной :)
 
Сообщения: 18018
Зарегистрирован: 18 сен 2006, 12:26
Откуда: Тверь по прозвищу Дверь
прог. языки: псевдокод =) сила в алгоритме!
ФИО: глубокоуважаемый Фёдор Анатольевич

Сообщение avr123.nm.ru » 13 мар 2007, 19:54

В задаче 5 символы помещаются в буфер таогда когда приходят и при этом возникает прерывание приема.

Так вот сразу анализируйте принятый символ и если он допустим помещайте его в массив.
Аватара пользователя
avr123.nm.ru
отсылающий читать курс
 
Сообщения: 14195
Зарегистрирован: 06 ноя 2005, 04:18
Откуда: Москва

Сообщение avr123.nm.ru » 13 мар 2007, 19:55

Ты напиши варианты допустимых команд - я уж страницу наверно назад спрашивал - тогда понятно будет.
Аватара пользователя
avr123.nm.ru
отсылающий читать курс
 
Сообщения: 14195
Зарегистрирован: 06 ноя 2005, 04:18
Откуда: Москва

Сообщение Myp » 13 мар 2007, 20:17

avr123.nm.ru писал(а):Ты напиши варианты допустимых команд - я уж страницу наверно назад спрашивал - тогда понятно будет.


имхо я с первой страницы пишу эти команды допустимые
принимается 3 символа первый символ это заголовок ост 2 это числовые значения
если заголовок R значит это пакет для правого двига если L для левого и т.д.
варианты:
R00
R10
R20
R..
R90

L00
L10
L20
L..
L90

Так вот сразу анализируйте принятый символ и если он допустим помещайте его в массив.

хм а я тут 6 страниц в течении месяца крестиком вышиваю??


ну хорошо
прерывание сработало
символ принялся,
пускай это тот символ который надо, пускай мы его в буфер засунули
так от следующего символа прерывание опять срабатывает
опять пытаеться проверить символ на валидность
он конечно не подходит потому что это уже пошли числа

перефразирую мою задачу

как мне заставить это дурацкое прерывание складывать символы последовательно в массив???????
Аватара пользователя
Myp
скрытый хозяин вселенной :)
 
Сообщения: 18018
Зарегистрирован: 18 сен 2006, 12:26
Откуда: Тверь по прозвищу Дверь
прог. языки: псевдокод =) сила в алгоритме!
ФИО: глубокоуважаемый Фёдор Анатольевич

Сообщение Myp » 13 мар 2007, 20:24

Код: Выделить всё
// USART Receiver interrupt service routine
interrupt [USART_RXC] void usart_rx_isr(void)
{
char status,data,;
status=UCSRA;
data=UDR;
if ((status & (FRAMING_ERROR | PARITY_ERROR | DATA_OVERRUN))==0)
  {
  rx_buffer[rx_wr_index]=data;
  if (++rx_wr_index == RX_BUFFER_SIZE) rx_wr_index=0;
  if (++rx_counter == RX_BUFFER_SIZE)
     {
     rx_counter=0;
     rx_buffer_overflow=1;
     };
   buffer[i] = getchar();
   i++;


вот этот вот код просто записывает всё что пришло в массив пока он не забьётся
но мне надо чтоб не тупо забивалось а каждый раз буква шла в нулевой элемент а 2 цифры в 1 и 2 элемент массива




можно конечно тупо ограничить буфер приёма 3мя символами
тогда всё будет идеально... до тех пор пока не произойдёт ошибка и какойто символ не дойдёт до назначения.
Аватара пользователя
Myp
скрытый хозяин вселенной :)
 
Сообщения: 18018
Зарегистрирован: 18 сен 2006, 12:26
Откуда: Тверь по прозвищу Дверь
прог. языки: псевдокод =) сила в алгоритме!
ФИО: глубокоуважаемый Фёдор Анатольевич

Сообщение avr123.nm.ru » 13 мар 2007, 22:00

Код:
// USART Receiver interrupt service routine
interrupt [USART_RXC] void usart_rx_isr(void)
{
char status,data,;
status=UCSRA;
data=UDR;
if ((status & (FRAMING_ERROR | PARITY_ERROR | DATA_OVERRUN))==0)
  {
  rx_buffer[rx_wr_index]=data;
  if (++rx_wr_index == RX_BUFFER_SIZE) rx_wr_index=0;
  if (++rx_counter == RX_BUFFER_SIZE)
     {
     rx_counter=0;
     rx_buffer_overflow=1;
     };


   simvol = getchar();

   if ((simvol == 'R')|(simvol == 'L')) {

   i = 0;
   
   buffer[i] = simvol;
   
   i++;

  }


      if ((i) & ((simvol >= '0')&(simvol <= '9')))  {

/* если i не ноль и simvol  содержит число от 0 до 9

условие сложное может напутал...

*/
   
   buffer[i] = simvol;
   
   i++;

      }



    if (i > 2) {

/* если i больше 2 то в масив записано 3 допустимых символа

*/

    i =0;

/*

тут нужно написать код  вывода символов из массива обратно в USART  чтоб на терминал вывелось содержимое.


а после отладки тут написать код выполнения команды отором

*/

   

    }
Аватара пользователя
avr123.nm.ru
отсылающий читать курс
 
Сообщения: 14195
Зарегистрирован: 06 ноя 2005, 04:18
Откуда: Москва

Сообщение avr123.nm.ru » 13 мар 2007, 22:02

simvol

и  buffer[i]

советую объявить как глобальные  типа char


и   buffer  назвать как то подругому -

например   buffer_R_L_xx[i]
Аватара пользователя
avr123.nm.ru
отсылающий читать курс
 
Сообщения: 14195
Зарегистрирован: 06 ноя 2005, 04:18
Откуда: Москва

Сообщение avr123.nm.ru » 13 мар 2007, 22:03

возможно скобок не хватает  }
Аватара пользователя
avr123.nm.ru
отсылающий читать курс
 
Сообщения: 14195
Зарегистрирован: 06 ноя 2005, 04:18
Откуда: Москва

Сообщение Myp » 13 мар 2007, 22:20

хм
лук гуд

ток надо будет ещё немного подумать
есть у меня задумка принимать кое что кроме R L, и немного подлиньше


вот я ещё что спросить хотел
ШИМ работает если выполняется прерывание или прерывание вобще всё останавливает?
Аватара пользователя
Myp
скрытый хозяин вселенной :)
 
Сообщения: 18018
Зарегистрирован: 18 сен 2006, 12:26
Откуда: Тверь по прозвищу Дверь
прог. языки: псевдокод =) сила в алгоритме!
ФИО: глубокоуважаемый Фёдор Анатольевич

Сообщение avr123.nm.ru » 13 мар 2007, 22:30

аппаратный ШИМ не зависит от прерывания - на то он и аппаратный !

но прерывание может прервать запись двух байтного числа в регистр ШИМ !!!

но там по моему буфер есть и пока полное число не запишется оно не станет новым значением ШИМа

======

NM.ru   опять пашет   - скачай архив плиз !
Аватара пользователя
avr123.nm.ru
отсылающий читать курс
 
Сообщения: 14195
Зарегистрирован: 06 ноя 2005, 04:18
Откуда: Москва

Сообщение Myp » 13 мар 2007, 22:49

скачал=)
сохранил





да правда  с условием чёто не то
принималась только первая цифра

написал вот так
Код: Выделить всё
if (i)
     {  
       if (((simvol >= '0')&(simvol <= '9')))  
     {
       buffer[i] = simvol;
       i++;
     }
     }  

стали принимацца 2 цифры
Аватара пользователя
Myp
скрытый хозяин вселенной :)
 
Сообщения: 18018
Зарегистрирован: 18 сен 2006, 12:26
Откуда: Тверь по прозвищу Дверь
прог. языки: псевдокод =) сила в алгоритме!
ФИО: глубокоуважаемый Фёдор Анатольевич

Сообщение avr123.nm.ru » 14 мар 2007, 16:35

ну слава богу !
Аватара пользователя
avr123.nm.ru
отсылающий читать курс
 
Сообщения: 14195
Зарегистрирован: 06 ноя 2005, 04:18
Откуда: Москва

Пред.След.

Вернуться в Новичкам или основы основ роботостроения.

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 32