Easyelectronics.ru

Электроника для всех
Текущее время: 19 окт 2019, 04:50

Часовой пояс: UTC + 5 часов



JLCPCB – Прототипы печатных плат за $2/10pcs (Любой цвет!)
Крупнейший производитель печатных плат и прототипов. Более 600000 клиентов и свыше 10000 заказов в день!
Получите скидку на почтовую отправку при первом заказе в JLCPCB!

Начать новую тему Ответить на тему  [ Сообщений: 70 ]  На страницу Пред.  1, 2, 3  След.
Автор Сообщение
 Заголовок сообщения: Re: WinAvr
СообщениеДобавлено: 07 ноя 2010, 08:27 
Супермодератор
Аватара пользователя

Зарегистрирован: 28 янв 2010, 05:47
Сообщения: 1031
Откуда: Винница
и это будет лучше чем itoa? Число же 16-битное знаковое

_________________
Show


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: WinAvr
СообщениеДобавлено: 07 ноя 2010, 11:01 
Старожил
Аватара пользователя

Зарегистрирован: 10 апр 2010, 18:47
Сообщения: 2490
Откуда: Харьков
Ink писал(а):
че-то я или туплю, или вы тупите:)
число можно бить на разряды делением на 10 и нахождением остатка от дел.

buf[2]=val % 10; val/=10;
buf[1]=val % 10;
buf[0]=val / 10;

или что-то еще надо?


Инк, туплю я, т.к. понимаю, как это сделать, но не знаю, как это средствами Си описать..))
А вообще-то странно, что в WinAVR нет готовой нормальной такой ходовой и нужной функции.
Даже в Микропаскале есть. И весит inttostr всего 300 байт против 1500 sprintf ..


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: WinAvr
СообщениеДобавлено: 21 ноя 2010, 23:26 
Старожил
Аватара пользователя

Зарегистрирован: 10 апр 2010, 18:47
Сообщения: 2490
Откуда: Харьков
Не нашел толком нигде, как правильно записывается адрес вектора прерывания по переполнению таймера Т0?
Вот для сравнения, например так.
ISR(TIMER0_COMP_vect)
И где вообще можно посмотреть адреса преріваний, применительно к WinAVR?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: WinAvr
СообщениеДобавлено: 21 ноя 2010, 23:36 
Старожил
Аватара пользователя

Зарегистрирован: 02 апр 2010, 12:39
Сообщения: 4402
Откуда: Брянск
c:\WinAVR-20100110\avr\include\avr\
В хидерах есть секция где описаны прерывания. Вот так они и описываются.
Например для меги8 ISR (TIMER0_OVF_vect)


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: WinAvr
СообщениеДобавлено: 21 ноя 2010, 23:46 
Старожил
Аватара пользователя

Зарегистрирован: 10 апр 2010, 18:47
Сообщения: 2490
Откуда: Харьков
Bomond писал(а):
c:\WinAVR-20100110\avr\include\avr\
В хидерах есть секция где описаны прерывания. Вот так они и описываются.
Например для меги8 ISR (TIMER0_OVF_vect)

Смотрел я interrupt.h . Но там без поллитры не разберешься..)) Или я не то смотрю, но я в этом файле вообще упоминания про мегу8 не вижу.. Мне для Меги 16 надо.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: WinAvr
СообщениеДобавлено: 21 ноя 2010, 23:53 
Супермодератор
Аватара пользователя

Зарегистрирован: 28 янв 2010, 05:47
Сообщения: 1031
Откуда: Винница
В файлах, которые под конкретный мк, например, iom8.h, iom16.h

А Эклипс, например, сам всё это извлекает и показывает в красивом окошке.

_________________
Show


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: WinAvr
СообщениеДобавлено: 22 ноя 2010, 00:04 
Старожил
Аватара пользователя

Зарегистрирован: 10 апр 2010, 18:47
Сообщения: 2490
Откуда: Харьков
нашел. спасибо!


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: WinAvr
СообщениеДобавлено: 05 дек 2010, 22:22 
Старожил
Аватара пользователя

Зарегистрирован: 10 апр 2010, 18:47
Сообщения: 2490
Откуда: Харьков
Пытаюсь пол дня включить банальное прерывание по переполнению таймера Т0, ничего не работает. Подскажите, в чем дело, уже не могу ничего понять.
Код:
//_______ Init. interrupt timer0 __________________________

  TIMSK =(1<<TOIE0);  // Timer0 overflow interrupt enable
 
  TCCR0 = 3; //     ;Prescaller > ;0=STOP; 2=F/8; 3=F/64 4=F/256;

  cnt_S = 0;
 
  sei () ;   
 
//xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
while(1)
     {
     if (cnt_S >= 1000)
      {
         InvBit(PORTC, 5);
          cnt_S = 0;
      };
   }; 
   return (0);
}

//*****************************************************************

ISR (TIMER0_OVF_vect)
    { 
     cnt_S ++ ; 
    } 

Смотрю в отладчике АСтудии, команда sei(); не включает бит I в SREG, хотя если меняю ее на cli, то прерывание перестает "убивать" основную программу. Сейчас выбросил вообще все, кроме мигания светодиодом - не работает..


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: WinAvr
СообщениеДобавлено: 06 дек 2010, 03:54 
Старожил
Аватара пользователя

Зарегистрирован: 26 янв 2010, 21:48
Сообщения: 3965
Откуда: Звенигород
Я почему-то всегда использовал asm("sei");. Почему не помню, но оно работает:)

_________________
От Парижа до Находки с водкой лучше, чем без водки!


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: WinAvr
СообщениеДобавлено: 06 дек 2010, 18:13 
Старожил
Аватара пользователя

Зарегистрирован: 06 май 2010, 11:00
Сообщения: 2810
Откуда: Н. Новгород
У меня в WinAVR примерах всегда - sei(); - без пробелов, В MicroC - asm sei; , в ICС - SEI(); - заглавные без пробелов
На месте R_ura я попробовал бы ещё {cnt_S==0; cnt_S++;} по последнему выражению у Дейтелей что-то было, (выветрилось уже :( )


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: WinAvr
СообщениеДобавлено: 11 дек 2010, 21:05 
Заглядывает иногда
Аватара пользователя

Зарегистрирован: 22 фев 2010, 19:44
Сообщения: 86
Откуда: Челябинск
А библиотеку avr/interrupt.h подключил?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: WinAvr
СообщениеДобавлено: 03 янв 2011, 21:50 
Старожил
Аватара пользователя

Зарегистрирован: 10 апр 2010, 18:47
Сообщения: 2490
Откуда: Харьков
Наконец добрался до своей неработающей программы.
Не работает прерывание, хоть убейся.. Уже сократил до минимума.. В чем дело - не могу понять..
Подскажите, где грабли??
Show


Перед основным циклом на ЖКИ выводится 4 буквы W, без разрешения прерывания буквы выводятся нормально ( т.е. дальше программа крутится в основном цикле), при включении прерывания они мерцают, такое впечатление, что программа беспрерывно прыгает на метку старт , W выводится снова на ЖКИ, доходит до основного цикла и прерыванием снова сбрасывается на Старт..


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: WinAvr
СообщениеДобавлено: 04 янв 2011, 00:45 
Супермодератор
Аватара пользователя

Зарегистрирован: 28 янв 2010, 05:47
Сообщения: 1031
Откуда: Винница
Сокращай еще. Повыкидывай всякую ненужную фигню, типа InvBit. И cnt_S volatile сделай.

_________________
Show


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: WinAvr
СообщениеДобавлено: 04 янв 2011, 01:01 
Старожил
Аватара пользователя

Зарегистрирован: 10 апр 2010, 18:47
Сообщения: 2490
Откуда: Харьков
xrayman писал(а):
Сокращай еще. Повыкидывай всякую ненужную фигню, типа InvBit. И cnt_S volatile сделай.

)) выбросил уже вообще все... Объявил volatile unsigned int cnt_S; - не пашет..
Перенес все в само прерывание - тоже не пашет.))) Во засада... А ведь косяк где-то есть....
Show


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: WinAvr
СообщениеДобавлено: 04 янв 2011, 01:15 
Старожил
Аватара пользователя

Зарегистрирован: 26 янв 2010, 21:48
Сообщения: 3965
Откуда: Звенигород
Отключи оптимизацию.

_________________
От Парижа до Находки с водкой лучше, чем без водки!


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: WinAvr
СообщениеДобавлено: 04 янв 2011, 01:22 
Старожил
Аватара пользователя

Зарегистрирован: 10 апр 2010, 18:47
Сообщения: 2490
Откуда: Харьков
PRC писал(а):
Отключи оптимизацию.

Отключил . Тоже самое.. В отладчике смотрю - стрелка движется по кругу по прерыванию вместо основного цикла.. Может где скобок не хватает??
Кстати, в АСтудии выставляю в свойствах проекта частоту 16мгц, а в отладчике все-равно 4мгц остается.. Это разве правильно?? И командой sei не устанавливается в отладчике флаг I.. Чудеса..)))


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: WinAvr
СообщениеДобавлено: 04 янв 2011, 01:40 
Старожил
Аватара пользователя

Зарегистрирован: 26 янв 2010, 21:48
Сообщения: 3965
Откуда: Звенигород
R_ura писал(а):
Кстати, в АСтудии выставляю в свойствах проекта частоту 16мгц, а в отладчике все-равно 4мгц остается.. Это разве правильно?? И командой sei не устанавливается в отладчике флаг I.. Чудеса..)))

Правильно. Частота отладчика ставится Debug - AVR Simulator Option.
попробуй - asm("sei");

_________________
От Парижа до Находки с водкой лучше, чем без водки!


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: WinAvr
СообщениеДобавлено: 04 янв 2011, 01:59 
Старожил
Аватара пользователя

Зарегистрирован: 10 апр 2010, 18:47
Сообщения: 2490
Откуда: Харьков
PRC писал(а):
R_ura писал(а):
Кстати, в АСтудии выставляю в свойствах проекта частоту 16мгц, а в отладчике все-равно 4мгц остается.. Это разве правильно?? И командой sei не устанавливается в отладчике флаг I.. Чудеса..)))

Правильно. Частота отладчика ставится Debug - AVR Simulator Option.
попробуй - asm("sei");

)) Это злой рок какой-то...
с asm("sei") тоже не работает.. Где-то я затупил безбожно...
Ни одна из трех команд не устанавливает в отладчике флаг глобальных прерываний.
asm("sei");
sei() ;
SREG |= (1<<(7));
Как такое может быть??


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: WinAvr
СообщениеДобавлено: 04 янв 2011, 02:31 
Супермодератор
Аватара пользователя

Зарегистрирован: 28 янв 2010, 05:47
Сообщения: 1031
Откуда: Винница
Создай новый проект и набери там заново код...

_________________
Show


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: WinAvr
СообщениеДобавлено: 04 янв 2011, 02:32 
Старожил
Аватара пользователя

Зарегистрирован: 10 апр 2010, 18:47
Сообщения: 2490
Откуда: Харьков
xrayman писал(а):
Создай новый проект и набери там заново код...

Спасибо.. Завтра так и сделаю.. А то что-то нездоровое получилось.. ))


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: WinAvr
СообщениеДобавлено: 04 янв 2011, 02:52 
Старожил
Аватара пользователя

Зарегистрирован: 26 янв 2010, 21:48
Сообщения: 3965
Откуда: Звенигород
Можно еще попробовать Iar C. Мне весьма понравился. Правда нет интеграции с протеусом, зато есть чудная отладка через jtag:)

_________________
От Парижа до Находки с водкой лучше, чем без водки!


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: WinAvr
СообщениеДобавлено: 04 янв 2011, 19:07 
Старожил
Аватара пользователя

Зарегистрирован: 06 май 2010, 11:00
Сообщения: 2810
Откуда: Н. Новгород
cnt_S ++ ;

Могу ошибаться, но Дейтели рекомендуют:

cnt_S++ ;


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: WinAvr
СообщениеДобавлено: 16 янв 2011, 22:18 
Старожил
Аватара пользователя

Зарегистрирован: 10 апр 2010, 18:47
Сообщения: 2490
Откуда: Харьков
Спасибо за помощь, но Си продолжает удивлять..))

Вот есть такая незамысловатая программка. Суть ее - в прерывании , каждую 1 млсек
инкрементируется cnt_S и устанавливается флаг прерывания int_1ms.
В основном цикле проверяется содержимое cnt_S, и при досчете до 1000 ( = 1 сек)
инвертируется вывод МК, т.е. мигает светодиод.
По флагу прерывания int_1ms в основном цикле также ведется подсчет кол-ва прерываний
до той же секунды ( 1000млсек) другим счетчиком cnt_1000ms, что вызывает мигание другого светодиода.
По идее светодиоды должны мигать одновременно , но почему-то от счетчика, инкрементируемого в самом прерывании светодиод мигает чаще...
Что здесь не так? Оба счетчика определены как volatile.

Код:
//   i n i t      TCNT0:
  TIMSK =(1<<TOIE0);  // Timer0 overflow interrupt enable
  TCCR0 = 3;          // Prescaller > ;0=STOP; 2=F/8; 3=F/64 4=F/256;
  cnt_S = 0;
  sei();
//xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
while(1)
    { 
       if (cnt_1000ms == 1000) cnt_1000ms = 0;   // clear conter 1ms
       if (int_1ms == 1)  cnt_1000ms ++;             // if interrupt. Ò0 - increment counter 1 sec
       int_1ms = 0;                                             // clear flag int_1ms
//.......................................................
      if (cnt_S == 1000)                         // if  1000ms -
         { InvBit(PORTC, 5);                    // invert. PIN C.5
            cnt_S = 0; };                               // clear   cnt_S

       if (cnt_1000ms ==1000)  InvBit(PORTA, 0); // if  1000ms - invert. PIN A.0

   }; 
   return (0);
}

//*****************************************************************

ISR (TIMER0_OVF_vect)
    { 
       cnt_S ++ ;     
        TCNT0 = 0x06 ;                                 // interrupt 1ms
      int_1ms = 1;                             // set flag int_1ms
    }

В отладчике посмотрел и оказалось, если в прерывание програма уходит со строки
if (int_1ms == 1) cnt_1000ms ++; // if interrupt. - increment counter 1 sec
то возвращается из прерывания на следующую строку:
int_1ms = 0; // clear flag int_1ms
в этом случае состояние cnt_1000ms не инкрементируется.
Как с этим правильно бороться? Запретить прерывания на это время??


Последний раз редактировалось R_ura 16 янв 2011, 22:38, всего редактировалось 1 раз.

Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: WinAvr
СообщениеДобавлено: 16 янв 2011, 22:33 
Старожил

Зарегистрирован: 22 мар 2010, 22:54
Сообщения: 3995
меня смущает 2 условия

if (cnt_1000ms ==1000)

сделайте одно, как if (cnt_S == 1000). как минимум. дальше не вглядывался..
ну и int_1ms = 0 делайте только если оно было =1.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: WinAvr
СообщениеДобавлено: 16 янв 2011, 23:01 
Старожил
Аватара пользователя

Зарегистрирован: 10 апр 2010, 18:47
Сообщения: 2490
Откуда: Харьков
Ink писал(а):
меня смущает 2 условия

if (cnt_1000ms ==1000)

сделайте одно, как if (cnt_S == 1000). как минимум. дальше не вглядывался..
ну и int_1ms = 0 делайте только если оно было =1.

Спасибо..
Я сделал вот так, все заработало.
Код:
while(1)
    {  cli ();
       if (cnt_1000ms == 1000) cnt_1000ms = 0;                    // clear conter 1ms
       if (int_1ms == 1) { cnt_1000ms ++;  int_1ms = 0; };        // if interrupt. Ò0 - increment counter 1 sec
                                                                                       // clear flag int_1ms
      sei();

Но не знаю, насколько это правильно с точки зрения Си?
По сути выходит , надо запрещать прерывания везде, где проверяются переменные, меняющиеся в прерываниях?


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 70 ]  На страницу Пред.  1, 2, 3  След.

Часовой пояс: UTC + 5 часов


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

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


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB