На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
  
    > ATMEL-STUDIO 6 INTERRUPT , ОПИСАНИЕ ПРЕРЫВАНИЙ
      Доброго времени суток! Решил пересесть с кодавижина и студии4 на ATMEL STUDIO 6 в связи с тем,что она поддерживает и 8-битные,и 32-битные процы атмела. толкового(а лучше сказать НИКАКОГО)хелпа не имеется.перерыл уже кучу материалов в инете,но ответа так и не нашел. Проблема возникла как и всегда из-за нового синтаксиса.не работает прерывание,и не смог найти толкового ПРИМЕРА ,как правильно написать обработчик. пытался вот так

      #pragma vector=PCINT0_vect
      ISR(KEYS_INTER)

      и вот так

      ISR(_VECTOR(2))

      при подключенной #include <avr/interrupt.h>

      эффект-ноль.компилятор не ругается,но и не выполняется подпрограмма.
      Если у кого есть уже опыт работы с данной ИДЕ или может завалялся хелп,подскжите,пожалуйста,КАК ПРАВИЛЬНО НАПИСАТЬ ОБРАБОТЧИК????
      Может у отладчика в шестерке тоже глюки имеются,как это было в четвертой студии??
      А может уже шарики за ролики заехали и я просто неправильно инициализирую что-то??поэтому выкладываю все как есть.сильно критиковать не надо,это просто прога,слепленная в целях обучения)))))

      #define F_CPU 14745600UL
      #include <avr/io.h>
      #include <stdio.h>
      #include <stdlib.h>
      #include <delay.h>
      #include <avr/interrupt.h>
      //*******************************************
      #pragma vector=USART0_RX_vect
      ISR(USART0_RX_vect)
      {
      while (1) {};
      };

      //*******************************************
      // Pin change 0-7 interrupt service routine
      #pragma vector=PCINT0_vect
      ISR(KEYS_INTERR)





      {
      while (1) {};
      };




      int main(void)


      {
      PORTA=0x00;
      DDRA=0xFF;

      PORTB=0x00;
      DDRB=0xFF;

      PORTC=0x00;
      DDRC=0xFB;

      PORTD=0x00;
      DDRD=0xFF;

      PORTE=0x00;
      DDRE=0x03;

      PORTF=0x00;
      DDRF=0xFF;

      PORTG=0x00;
      DDRG=0x1F;


      // External Interrupt(s) initialization
      // INT0: Off
      // Interrupt on any change on pins PCINT0-7: On
      // Interrupt on any change on pins PCINT8-15: Off
      EICRA=0b00000000;
      PCMSK0=0b11111000;
      EIMSK=0b01000000;
      EIFR=0x40;


      // USART initialization
      // Communication Parameters: 8 Data, 1 Stop, No Parity
      // USART Receiver: On
      // USART Transmitter: Off
      // USART0 Mode: Asynchronous
      // USART Baud Rate: 19200
      UCSR0A=0x00;
      UCSR0B=0x90;
      UCSR0C=0x06;
      UBRR0H=0x00;
      UBRR0L=0x2F;
      asm("sei");

      while(1)
      {
      PORTB |=(1<<PB0);
      PORTB |=(0<<PB0);
      PORTB |=(1<<PB0);
      PORTB |=(0<<PB0);
      }
      }
        Я не полностью уверен, в последних AVRStudio в качестве компилятора C применён avr-gcc с библиотекой AVR-LIBC. По этим ключевым словам и надо искать. На сайте AVR-LIBC я в своё время нашёл все ответы. Но правда оболочка у меня была попроще - WinAVR и компиляция через make (makefile).

        Так, бегло замечания по коду.
        1) avr-gcc не выключает wdt его надо выключать ручками - wdt_disable(); - иначе "странное поведение - постоянный сброс"
        2) по-моему все векторы прерываний имеют "стандартные" имена, их можно посмотреть в заголовочных файлах типа "iom8515.h"
        3) код isr(USART0_RX_vect) немножко зациклен на себе
        ExpandedWrap disabled
          #pragma vector=USART0_RX_vect
           ISR(USART0_RX_vect)
           {
             while (1) {};
           };


        Сейчас у меня нет ни AVRStudio ни процессоров. Стоит только старенькая WinAVR-20100110 (это тоже avr-gcc), которой когда-то пользовался. В этой среде и компилировал прилагаемый пример с прерываниями на C и на ассемблере. Пример - таймер с двумя кнопками (старт/стоп и смена диапазона), одним выходом для нагрузки, и выводом № диапазона на один 7-сегментный индикатор. Там используется аж три прерывания. Отлаживал на макетке - всё работало.

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

        Повторюсь, всему я учился по примерам к avr-libc, а также по форумам при поиске "WinAVR" и "avr-gcc".
        Прикреплённый файлПрикреплённый файлTimer_00.zip (47,31 Кбайт, скачиваний: 437)
          оказалось,что на работе еще и сборка глючная была установлена.а на домашнем компе установил другую,от одного глюка избавился.
          на счет зацикливания в обработчиках-верно.сделал сознательно,учитывая некоторые особенности эмуляции прерываний в студии 4.
          вечером попробую написать самое простое и автономное прерывание-по переполнению таймера.если и оно не пойдет-значит где-то в настройках проекта надо рыться)))) хелп на ГСС мне попадался,онлайновский.но от него легче не стало
          0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
          0 пользователей:


          Рейтинг@Mail.ru
          [ Script execution time: 0,0477 ]   [ 18 queries used ]   [ Generated: 24.04.24, 16:04 GMT ]