количество нажатий на RESET в IAR (обработка перывания)

Вопросы настройки, программирования, прошивки микроконтроллеров и микросхем программируемой логики
AR_AROV
Открыл глаза
Сообщения: 59
Зарегистрирован: Сб янв 14, 2012 11:05:46

количество нажатий на RESET в IAR (обработка перывания)

Сообщение AR_AROV »

Доброго всем времени суток :)

первый раз пишу для МК, прошу сильно не пинать :write:
имею желание написать программу бегущий огонек как в обучалке http://radiokot.ru/start/mcu_fpga/avr/13/ на С
не могу понять как реализовать счетчик нажатий на RESET

MK ATtiny2313V. среда IAR EW. язык С

код программы:

include <ioavr.h>
#include <intrinsics.h>

asm("sei");

unsigned int v = 0;

int main( void )
{ char x;
char B[8] = {0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80};
__enable_interrupt();

DDRB = 255;
DDRD = 255;

while(1)
{
if ( v == 0)
{
for(x = 0; x < 0x07; ++x)
{
PORTD = B[x];
__delay_cycles(1000000);
PORTD = 0;
}
for(x = 0; x < 0x08; ++x)
{
PORTB = B[x];
__delay_cycles(1000000);
PORTB = 0;
}
}
if ( v == 1)
{
for(x = 0; x < 0x08; ++x)
{
PORTB = B[x];
__delay_cycles(1000000);
PORTB = 0;
}
x = 0;
for(x = 0; x < 0x07; ++x)
{
PORTD = B[x];
__delay_cycles(1000000);
PORTD = 0;
}
}
}
return 0;
}

#pragma vector = RESET_vect
__interrupt void RESET_interrupt (void)
{
v++
if (v == 2) v = 0;
}
Реклама
Аватара пользователя
md5sum
Вымогатель припоя
Сообщения: 672
Зарегистрирован: Вт окт 27, 2009 22:39:19
Откуда: Москва

Re: количество нажатий на RESET в IAR (обработка перывания)

Сообщение md5sum »

При сбросе программа всегда выполняется с начала (0x0000 если нет бутлоадера).
В статье правильно написано - надо использовать особенность МК: не сбрасывать регистры (основные) и память.

На асме это реализовать проще, на ЯВУ сложнее, но принцип например такой:
Объявляем неинициализируемую переменную, при старте проверяем источник сброса (см. MCUCSR).
Если сброс по питанию, то обнуляем переменную, если сброс по RESET то инкрементируем переменную.

Далее в программе просто проверяем эту переменную и выполняем то, что нужно..
— Не говорите мне что делать и я не скажу куда Вам идти...
Реклама
AR_AROV
Открыл глаза
Сообщения: 59
Зарегистрирован: Сб янв 14, 2012 11:05:46

Re: количество нажатий на RESET в IAR (обработка перывания)

Сообщение AR_AROV »

md5sum писал(а):При сбросе программа всегда выполняется с начала (0x0000 если нет бутлоадера).
В статье правильно написано - надо использовать особенность МК: не сбрасывать регистры (основные) и память.

На асме это реализовать проще, на ЯВУ сложнее, но принцип например такой:
Объявляем неинициализируемую переменную, при старте проверяем источник сброса (см. MCUCSR).
Если сброс по питанию, то обнуляем переменную, если сброс по RESET то инкрементируем переменную.

Далее в программе просто проверяем эту переменную и выполняем то, что нужно..
не могли вы показать кусочек кода, а то я слишком много всякого перечитал что щас путаюсь (((
Аватара пользователя
pyzhman
Друг Кота
Сообщения: 7016
Зарегистрирован: Вс июл 12, 2009 19:15:29
Откуда: Ижевск
Контактная информация:

Re: количество нажатий на RESET в IAR (обработка перывания)

Сообщение pyzhman »

Про IAR EW не скажу. А вот в CodeVision при компиляции в код вставляется чистилка памяти, которая обнуляет в том числе и регистры. Так что счетчик не проканает. Эту вставку можно отключить в настройках. Возможно такая же фича присутствует и в IAR EW, посмотрите.
Docendo discimus
Реклама
Эиком - электронные компоненты и радиодетали
AR_AROV
Открыл глаза
Сообщения: 59
Зарегистрирован: Сб янв 14, 2012 11:05:46

Re: количество нажатий на RESET в IAR (обработка перывания)

Сообщение AR_AROV »

pyzhman писал(а):Про IAR EW не скажу. А вот в CodeVision при компиляции в код вставляется чистилка памяти, которая обнуляет в том числе и регистры. Так что счетчик не проканает. Эту вставку можно отключить в настройках. Возможно такая же фича присутствует и в IAR EW, посмотрите.
Project -> Options -> General Options-> System-> Initialize unsed interrupt vectors with RETI instructions
снимаем галку, чтобы избавиться от RETI... вот это? уже сделал но все равно
Реклама
Аватара пользователя
pyzhman
Друг Кота
Сообщения: 7016
Зарегистрирован: Вс июл 12, 2009 19:15:29
Откуда: Ижевск
Контактная информация:

Re: количество нажатий на RESET в IAR (обработка перывания)

Сообщение pyzhman »

Если это про IAR EW, то не скажу. Я писал про CodeVision. Называется эта беда Startup file. Если внутренняя, то чистит память, регистры, заносит предварительные данные. Если внешняя, то пишем ручками то, что надо. Какая из них будет пришлепываться зависит от галки в настройках проекта.
Последний раз редактировалось pyzhman Сб янв 14, 2012 11:55:14, всего редактировалось 1 раз.
Docendo discimus
Реклама
AR_AROV
Открыл глаза
Сообщения: 59
Зарегистрирован: Сб янв 14, 2012 11:05:46

Re: количество нажатий на RESET в IAR (обработка перывания)

Сообщение AR_AROV »

но судя по названиям в настройке это оно самое...

... а как бы реализовать этот ресет?
Аватара пользователя
pyzhman
Друг Кота
Сообщения: 7016
Зарегистрирован: Вс июл 12, 2009 19:15:29
Откуда: Ижевск
Контактная информация:

Re: количество нажатий на RESET в IAR (обработка перывания)

Сообщение pyzhman »

Названия как раз разные. В вашем случае речь идет о прерываниях(я так понимаю их отключении), а я говорю о памяти.
Подождите ответа пользователей IAR.
Docendo discimus
Аватара пользователя
md5sum
Вымогатель припоя
Сообщения: 672
Зарегистрирован: Вт окт 27, 2009 22:39:19
Откуда: Москва

Re: количество нажатий на RESET в IAR (обработка перывания)

Сообщение md5sum »

В IAR вроде как надо использовать префикс __noinit при объявлении переменной.
— Не говорите мне что делать и я не скажу куда Вам идти...
AR_AROV
Открыл глаза
Сообщения: 59
Зарегистрирован: Сб янв 14, 2012 11:05:46

Re: количество нажатий на RESET в IAR (обработка перывания)

Сообщение AR_AROV »

md5sum писал(а):В IAR вроде как надо использовать префикс __noinit при объявлении переменной.
написал __no_init int v; все равно...

ИАР выдает вот такую ругать при компиляции
Warning[w52]: More than one definition for the byte at address 0 in common segment INTVEC. It is defined in module "?RESET" as well as in module "main"
BerZerK-ku
Мучитель микросхем
Сообщения: 492
Зарегистрирован: Вт июл 22, 2008 08:10:54

Re: количество нажатий на RESET в IAR (обработка перывания)

Сообщение BerZerK-ku »

Выложите проект.
AR_AROV писал(а):Project -> Options -> General Options-> System-> Initialize unsed interrupt vectors with RETI instructions
снимаем галку, чтобы избавиться от RETI... вот это? уже сделал но все равно
Этим вы убрали автозаполнение векторов прерывания.
AR_AROV
Открыл глаза
Сообщения: 59
Зарегистрирован: Сб янв 14, 2012 11:05:46

Re: количество нажатий на RESET в IAR (обработка перывания)

Сообщение AR_AROV »

BerZerK-ku писал(а):Выложите проект.
AR_AROV писал(а):Project -> Options -> General Options-> System-> Initialize unsed interrupt vectors with RETI instructions
снимаем галку, чтобы избавиться от RETI... вот это? уже сделал но все равно
Этим вы убрали автозаполнение векторов прерывания.
вернуть галочку на место?
Вложения
IAR.zip
проект
(12.26 КБ) 224 скачивания
BerZerK-ku
Мучитель микросхем
Сообщения: 492
Зарегистрирован: Вт июл 22, 2008 08:10:54

Re: количество нажатий на RESET в IAR (обработка перывания)

Сообщение BerZerK-ku »

Я бы вернул )
AR_AROV
Открыл глаза
Сообщения: 59
Зарегистрирован: Сб янв 14, 2012 11:05:46

Re: количество нажатий на RESET в IAR (обработка перывания)

Сообщение AR_AROV »

BerZerK-ku писал(а):Я бы вернул )
галочку вернул )
проект выложил...
BerZerK-ku
Мучитель микросхем
Сообщения: 492
Зарегистрирован: Вт июл 22, 2008 08:10:54

Re: количество нажатий на RESET в IAR (обработка перывания)

Сообщение BerZerK-ku »

Объявляйте так:

Код: Выделить всё

__no_init int v; 
А этот обработчик уберите. Вставьте проверку в main.

Код: Выделить всё

#pragma vector = RESET_vect 
__interrupt void RESET_interrupt (void)
{
  v++;
  if (v == 2) v = 0; 
}
А еще как вариант, объявить v локальной переменной без инициализации.
Аватара пользователя
md5sum
Вымогатель припоя
Сообщения: 672
Зарегистрирован: Вт окт 27, 2009 22:39:19
Откуда: Москва

Re: количество нажатий на RESET в IAR (обработка перывания)

Сообщение md5sum »

AR_AROV писал(а):
BerZerK-ku писал(а):Я бы вернул )
галочку вернул )
проект выложил...

Код: Выделить всё

__no_init int v = 0;
нафиг тогда писать __noinit, если сами даем команду обнулить?

Код: Выделить всё

__no_init int v;
После сброса программа будет выполняться с main!
Какие на... прерывания? В начале main проверьте источник сброса!

Код: Выделить всё

if (MCUCSR&(1<<PORF)) v=0;
if (MCUCSR==(1<<EXTRF)) v++;
— Не говорите мне что делать и я не скажу куда Вам идти...
AR_AROV
Открыл глаза
Сообщения: 59
Зарегистрирован: Сб янв 14, 2012 11:05:46

Re: количество нажатий на RESET в IAR (обработка перывания)

Сообщение AR_AROV »

md5sum не ругайся на меня пожалуйста :cry:, я недели две наверное как вообще этот микроконтроллер в глаза увидел :oops:

Error[Pe020]: identifier "MCUCSR" is undefined D:\atmel\MK\proj\IAR\main.c 17
Error[Pe020]: identifier "PORF" is undefined D:\atmel\MK\proj\IAR\main.c 17
Error[Pe020]: identifier "MCUCSR" is undefined D:\atmel\MK\proj\IAR\main.c 18
Error[Pe020]: identifier "EXTRF" is undefined D:\atmel\MK\proj\IAR\main.c 18

IAR вот так ругается (((
BerZerK-ku
Мучитель микросхем
Сообщения: 492
Зарегистрирован: Вт июл 22, 2008 08:10:54

Re: количество нажатий на RESET в IAR (обработка перывания)

Сообщение BerZerK-ku »

В МК tiny2313 этот регистр носит название MCUSR.
Ваш проект к сожалению открыть не смог, т.к. вы используете более новую версию. Но скорее всего на биты ругается из-за не установленной опции "Enable bit definitions...", расположенной там же где и опция автозаполнения векторов прерывания.
AR_AROV
Открыл глаза
Сообщения: 59
Зарегистрирован: Сб янв 14, 2012 11:05:46

Re: количество нажатий на RESET в IAR (обработка перывания)

Сообщение AR_AROV »

BerZerK-ku писал(а):В МК tiny2313 этот регистр носит название MCUSR.
Спасибо) а другие регистры как называются?
BerZerK-ku писал(а): Ваш проект к сожалению открыть не смог, т.к. вы используете более новую версию. Но скорее всего на биты ругается из-за не установленной опции "Enable bit definitions...", расположенной там же где и опция автозаполнения векторов прерывания.
галочка "Enable bit definitions..." не стоит
AR_AROV
Открыл глаза
Сообщения: 59
Зарегистрирован: Сб янв 14, 2012 11:05:46

Re: количество нажатий на RESET в IAR (обработка перывания)

Сообщение AR_AROV »

не реагирует на RESET :( огонек как бежал так и бежит в одном направлении

Код: Выделить всё

#include <ioavr.h>
#include <intrinsics.h>

asm("sei");

__no_init int v;
 
int main( void )
{ char x;
  
  char B[8] = {0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80};
    __enable_interrupt();
  
  DDRB = 255;
  DDRD = 255;
  
  if (MCUSR&(1<<PORF)) v=0;
  if (MCUSR==(1<<EXTRF)) v++;  

  //v++;
  if (v == 2) v = 0; 
  
  while(1)
  {
   if ( v == 0)
    {
     for(x = 0; x < 0x07; ++x)
     {
      PORTD = B[x];
      __delay_cycles(1000000);
      PORTD = 0;
     }
     for(x = 0; x < 0x08; ++x)
     {
      PORTB = B[x];
      __delay_cycles(1000000); 
      PORTB = 0;
     }
    }
   if ( v == 1)
    { 
     for(x = 0; x < 0x08; ++x)
     {
      PORTB = B[x];
      __delay_cycles(1000000);
      PORTB = 0;
     }
     x = 0;
     for(x = 0; x < 0x07; ++x)
     {
      PORTD = B[x];
      __delay_cycles(1000000);
      PORTD = 0;
     }
    }
  }
  return 0;
}

/* 
#pragma vector = RESET_vect 
__interrupt void RESET_interrupt (void)
{
  v++;
  if (v == 2) v = 0; 
}
*/
Закрыто

Вернуться в «Микроконтроллеры и ПЛИС»