Реклама на сайте English version  DatasheetsDatasheets

KAZUS.RU - Электронный портал. Принципиальные схемы, Datasheets, Форум по электронике

Новости электроники Новости Литература, электронные книги Литература Документация, даташиты Документация Поиск даташитов (datasheets)Поиск PDF
  От производителей
Новости поставщиков
В мире электроники

  Сборник статей
Электронные книги
FAQ по электронике

  Datasheets
Поиск SMD
Он-лайн справочник

Принципиальные схемы Схемы Каталоги программ, сайтов Каталоги Общение, форум Общение Ваш аккаунтАккаунт
  Каталог схем
Избранные схемы
FAQ по электронике
  Программы
Каталог сайтов
Производители электроники
  Форумы по электронике
Помощь проекту

Микроконтроллеры, АЦП, память и т.д Темы касающиеся микроконтроллеров разных производителей, памяти, АЦП/ЦАП, периферийных модулей...

 
Опции темы
Непрочитано 01.06.2010, 23:09  
DimanVIP
Временная регистрация
 
Регистрация: 20.05.2010
Сообщений: 64
Сказал спасибо: 8
Сказали Спасибо 2 раз(а) в 2 сообщении(ях)
DimanVIP на пути к лучшему
По умолчанию Обработка прерывания таймера T0 ATtiny2313

Доброго всем времени суток.
Раньше писал для ATmega16, все работало отлично.
Но понадобилось собрать схемку на ATtiny2313
Проблемы начались почти сразу же, ни как не могу обработать прерывания таймера Т0.
Вот кусок кода (начинал с него когда-то), который точно работает на меге (написано в IARе):

Код:
#include ‹ioavr.h›
#include ‹intrinsics.h›

int main( void )
{
// настраиваем порты ввода-вывода
  DDRD = 0xff;   // порт D - вход
  DDRB = 0xff; // порт В - выход  
  PORTD = 0xff;// включаем подтягивающие резисторы
// настраиваем таймер Т0
  TCCR0A = (1‹‹WGM01)|(0‹‹WGM00)|(0‹‹CS02)|(1‹‹CS01)|(1‹‹CS00);
  TCNT0 = 0;
  OCR0A = 0x80;
//  TIFR = (1‹‹OCF0A); // и с ним, и без него роли не играет
  
  __enable_interrupt();
//  asm("sei");          // пробовал и то
//  SREG = 0x80;      // и другое....
  
  while(1){    
    if ((PIND&(1‹‹PD6))==0)  // проверка входа
    {
//      TIMSK = (1‹‹OCIE0B);
      TIMSK = (1‹‹OCIE0A);
      PORTB = (1‹‹PB6);     // для наглядности. работает
    }
    else
    {
    }    
  }
  return 0;
}
#pragma vector= TIMER0_COMPB_vect      // и #pragma vector= TIMER0_COMPA_vect пробовал
__interrupt void Timer0CompVect(void)
{   // а вот сюда никак попасть не могу
  PORTB ^= (1‹‹PB7);
  PORTB = (1‹‹PB5);    // опять же для наглядности. 
}
Помогите пожалуйста. Подскажите хоть в какую сторону копать.
Может есть в этой тиньке регистр какой хитрый, которого в меге нет.

З.Ы. Пробовал пока только в протеусе симулировать. Ничего не выходит с обоими моделями.
Ума не приложу что не так....
Реклама:
DimanVIP вне форума  
Непрочитано 01.06.2010, 23:50  
kittec
Гражданин KAZUS.RU
 
Регистрация: 14.11.2008
Сообщений: 701
Сказал спасибо: 298
Сказали Спасибо 283 раз(а) в 193 сообщении(ях)
kittec на пути к лучшему
По умолчанию Re: обработка прерывания таймера T0 ATtiny2313

"// настраиваем порты ввода-вывода
DDRD = 0xff; // порт D - вход
DDRB = 0xff; // порт В - выход "
Про порт D ничего не напутали?
kittec вне форума  
Непрочитано 02.06.2010, 00:00  
DimanVIP
Временная регистрация
 
Регистрация: 20.05.2010
Сообщений: 64
Сказал спасибо: 8
Сказали Спасибо 2 раз(а) в 2 сообщении(ях)
DimanVIP на пути к лучшему
По умолчанию Re: обработка прерывания таймера T0 ATtiny2313

Сообщение от kittec Посмотреть сообщение
"// настраиваем порты ввода-вывода
DDRD = 0xff; // порт D - вход
DDRB = 0xff; // порт В - выход "
Про порт D ничего не напутали?
Опечатался видимо, когда в форум переносил.
Если б было все так просто...
DimanVIP вне форума  
Непрочитано 02.06.2010, 00:04  
SasaVitebsk
Гражданин KAZUS.RU
 
Регистрация: 04.08.2006
Сообщений: 911
Сказал спасибо: 28
Сказали Спасибо 180 раз(а) в 139 сообщении(ях)
SasaVitebsk на пути к лучшему
По умолчанию Re: обработка прерывания таймера T0 ATtiny2313

1) А чего вы настраиваете OCR0A, а обработчик у вас OCR0B?
2) Почитайте даташит в конце концов. Ну две строчки буквально. Просто бесит эта хрень. Не надо весь. Только таймер 0 регистор дескрипшн. CS0-2 находятся в регистре TCCR0B, а WGM0-1 в TCCR0A. А вы как настраиваете?

Забудьте про такое "на жигулях работало, а на тойоте почему-то отказывается". МК отличаются м/у собой. Иногда значительно.

Фраза типа "пробовал и так и так" - верх дилетанства. Напоминает мне тракториста, который говорит "пробовал магнитолу и +- подключать и -+ . Не работает." Не надо делать путём перебора. Надо прочитать как правильно и сделать 1 раз. Если не заработало - значит что-то прочитали невнимательно. Опять перечитываем и опять делаем.
SasaVitebsk вне форума  
Непрочитано 02.06.2010, 00:10  
omercury
Почётный гражданин KAZUS.RU
 
Аватар для omercury
 
Регистрация: 25.05.2010
Адрес: г. Королёв
Сообщений: 8,497
Сказал спасибо: 30
Сказали Спасибо 3,072 раз(а) в 2,013 сообщении(ях)
omercury на пути к лучшему
По умолчанию Re: обработка прерывания таймера T0 ATtiny2313

Сообщение от DimanVIP Посмотреть сообщение
TCCR0A = (1‹‹WGM01)|(0‹‹WGM00)|(0‹‹CS02)|(1‹‹CS01)|(1‹‹CS00 );
В TCCR0B задайте коэф. деления и источник тактов. Datasheet стр. 77-78.
omercury вне форума  
Непрочитано 02.06.2010, 00:26  
DimanVIP
Временная регистрация
 
Регистрация: 20.05.2010
Сообщений: 64
Сказал спасибо: 8
Сказали Спасибо 2 раз(а) в 2 сообщении(ях)
DimanVIP на пути к лучшему
По умолчанию Re: обработка прерывания таймера T0 ATtiny2313

Сообщение от SasaVitebsk Посмотреть сообщение
1) А чего вы настраиваете OCR0A, а обработчик у вас OCR0B?
2) Почитайте даташит в конце концов. Ну две строчки буквально. Просто бесит эта хрень. Не надо весь. Только таймер 0 регистор дескрипшн. CS0-2 находятся в регистре TCCR0B, а WGM0-1 в TCCR0A. А вы как настраиваете?

Забудьте про такое "на жигулях работало, а на тойоте почему-то отказывается". МК отличаются м/у собой. Иногда значительно.

Фраза типа "пробовал и так и так" - верх дилетанства. Напоминает мне тракториста, который говорит "пробовал магнитолу и +- подключать и -+ . Не работает." Не надо делать путём перебора. Надо прочитать как правильно и сделать 1 раз. Если не заработало - значит что-то прочитали невнимательно. Опять перечитываем и опять делаем.
С самого начала делал все по даташиту.
Весь день. Пару книг именно по этой микрухе успел перечитать (по этим регистрам). Под конец дня уже терпение начало кончаться, и начался метод научного тыка.

По Вашему совету получается так (если не ошибаюсь):
Код:
 DDRD = 0;   // порт D - вход
  DDRB = 0xff; // порт В - выход  
  PORTD = 0xff;// включаем подтягивающие резисторы
// настраиваем таймер Т0
  TCCR0A = (1‹‹WGM01)|(0‹‹WGM00);                 //|(0‹‹CS02)|(1‹‹CS01)|(1‹‹CS00);
  TCCR0B = (1‹‹CS02)|(0‹‹CS01)|(1‹‹CS00);  
  TCNT0 = 0;
  OCR0A = 0x80;
//  TIFR = (1‹‹OCF0A);
  OCR0B = 0x70;
  
  __enable_interrupt();
  
  while(1){
    
    if ((PIND&(1‹‹PD6))==0)  // проверка нажатия
    {
      TIMSK = (1‹‹OCIE0B);
      TIMSK = (1‹‹OCIE0A);
      PORTB = (1‹‹PB6);
    }
    else
    {
    }      
  }
  return 0;
}

#pragma vector= TIMER0_COMPB_vect
__interrupt void Timer0CompVect(void)
{
//  __delay_cycles(40000);
  PORTB ^= (1‹‹PB7);
  PORTB = (1‹‹PB5);
}

// для проверки...
#pragma vector= TIMER0_COMPA_vect
__interrupt void Timer0CompVect(void)
{
//  __delay_cycles(40000);
  PORTB ^= (1‹‹PB7);
  PORTB = (1‹‹PB5);
}
Этот вариант обкатывался под разными соусами.
Итог один: только установка PB6 при нажатии на кнопку

Или я чего-то где то не дочитал или просто уже засыпаю на ходу.

Будем думать дальше.
DimanVIP вне форума  
Непрочитано 02.06.2010, 03:24  
kison
Почётный гражданин KAZUS.RU
 
Регистрация: 13.12.2004
Сообщений: 3,172
Сказал спасибо: 11
Сказали Спасибо 692 раз(а) в 504 сообщении(ях)
kison на пути к лучшему
По умолчанию Re: обработка прерывания таймера T0 ATtiny2313

Сообщение от DimanVIP Посмотреть сообщение
Или я чего-то где то не дочитал или просто уже засыпаю на ходу.
Будем думать дальше.
Вы в чем проверяете то? А то окажется что в Протеусе, а там может что угодно не работать. У меня T2313 нет, но следубщая конструкция в симуляторе студии работает:
Код:
#include ‹avr/io.h›
#include ‹avr/interrupt.h›

ISR(TIMER0_COMPA_vect)
{
PORTD++;
}


int main(void)
{
DDRD = 0xFF;
TCCR0A = (1‹‹WGM01);
OCR0A = 0x80;
TIMSK = (1‹‹OCIE0A);
TCCR0B = (1‹‹CS00);
sei();
while (1)
      {
        asm volatile ("nop");
      };
}
Это правда GCC, но подправить под IAR несложно.
kison вне форума  
Непрочитано 02.06.2010, 09:03  
DimanVIP
Временная регистрация
 
Регистрация: 20.05.2010
Сообщений: 64
Сказал спасибо: 8
Сказали Спасибо 2 раз(а) в 2 сообщении(ях)
DimanVIP на пути к лучшему
По умолчанию Re: обработка прерывания таймера T0 ATtiny2313

Не даром говорят утро - вечера мудренее.
Дело тут вовсе не в коде оказалось.
Подцепил я к м/к (в Протеусе) осцилоскоп, и сразу все заработало.
Вернее заработали обработчики прерываний, оба.

Видимо мне какой то веселый симулятор попался. версия его 7,6 sp4.

Всем большое спасибо за внимание и поддержку!
DimanVIP вне форума  
Непрочитано 02.06.2010, 10:08  
SasaVitebsk
Гражданин KAZUS.RU
 
Регистрация: 04.08.2006
Сообщений: 911
Сказал спасибо: 28
Сказали Спасибо 180 раз(а) в 139 сообщении(ях)
SasaVitebsk на пути к лучшему
По умолчанию Re: обработка прерывания таймера T0 ATtiny2313

Да дело всётаки в коде!!!
Я вам указал на 2 ошибки, а вы исправили одну!
Даже пост прочитать внимательно не осилили.

Ещё раз повторяю:
Вы инициализируете регистр OCR0A, а обработчик прерывания у вас TIMER0_COMPB_vect. Вы разницу между A и B чувствуете?

При определённых обстоятельствах это прерывание конечно будет приходить, только это никак не связано будет с OCR0A.
SasaVitebsk вне форума  
Непрочитано 02.06.2010, 13:28  
kison
Почётный гражданин KAZUS.RU
 
Регистрация: 13.12.2004
Сообщений: 3,172
Сказал спасибо: 11
Сказали Спасибо 692 раз(а) в 504 сообщении(ях)
kison на пути к лучшему
По умолчанию Re: обработка прерывания таймера T0 ATtiny2313

Сообщение от SasaVitebsk Посмотреть сообщение
Вы инициализируете регистр OCR0A, а обработчик прерывания у вас TIMER0_COMPB_vect.
У него оба обработчика, причем внутри одинаковых.

Сообщение от DimanVIP Посмотреть сообщение
Видимо мне какой то веселый симулятор попался.
Ничего удивительного - более глюкавую программу трудно найти. Завязывайте Вы с ним, вместо экономии времени Вы его только теряете. Если быпроверяли в студии или в железе, то разобрались бы быстрее.
kison вне форума  
 

Закладки
Опции темы

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

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
"Глюк" AVR таймера от кварца 32768 Гц alexgap Коллекция глюков 23 16.09.2013 07:29
Как настроить прерывание от таймера реального времени c04 Микроконтроллеры, АЦП, память и т.д 0 25.05.2010 21:19
Вложенные прерывания HITECH PIC16 picavr Микроконтроллеры, АЦП, память и т.д 17 07.03.2010 17:39
Вход в прерывания для PIC микроконтроллеров dimmich Микроконтроллеры, АЦП, память и т.д 4 06.12.2009 17:17
прерывания usart в avr studio 4.13 zubr_ Микроконтроллеры, АЦП, память и т.д 6 14.10.2009 18:33


Часовой пояс GMT +4, время: 01:05.


Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot