Микроконтроллеры, АЦП, память и т.д Темы касающиеся микроконтроллеров разных производителей, памяти, АЦП/ЦАП, периферийных модулей... |
01.06.2010, 23:09
|
|
Временная регистрация
Регистрация: 20.05.2010
Сообщений: 64
Сказал спасибо: 8
Сказали Спасибо 2 раз(а) в 2 сообщении(ях)
|
Обработка прерывания таймера 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); // опять же для наглядности.
} |
Помогите пожалуйста. Подскажите хоть в какую сторону копать.
Может есть в этой тиньке регистр какой хитрый, которого в меге нет.
З.Ы. Пробовал пока только в протеусе симулировать. Ничего не выходит с обоими моделями.
Ума не приложу что не так....
|
|
|
|
01.06.2010, 23:50
|
|
Гражданин KAZUS.RU
Регистрация: 14.11.2008
Сообщений: 701
Сказал спасибо: 298
Сказали Спасибо 283 раз(а) в 193 сообщении(ях)
|
Re: обработка прерывания таймера T0 ATtiny2313
"// настраиваем порты ввода-вывода
DDRD = 0xff; // порт D - вход
DDRB = 0xff; // порт В - выход "
Про порт D ничего не напутали?
|
|
|
|
02.06.2010, 00:00
|
|
Временная регистрация
Регистрация: 20.05.2010
Сообщений: 64
Сказал спасибо: 8
Сказали Спасибо 2 раз(а) в 2 сообщении(ях)
|
Re: обработка прерывания таймера T0 ATtiny2313
Сообщение от kittec
|
"// настраиваем порты ввода-вывода
DDRD = 0xff; // порт D - вход
DDRB = 0xff; // порт В - выход "
Про порт D ничего не напутали?
|
Опечатался видимо, когда в форум переносил.
Если б было все так просто...
|
|
|
|
02.06.2010, 00:04
|
|
Гражданин KAZUS.RU
Регистрация: 04.08.2006
Сообщений: 911
Сказал спасибо: 28
Сказали Спасибо 180 раз(а) в 139 сообщении(ях)
|
Re: обработка прерывания таймера T0 ATtiny2313
1) А чего вы настраиваете OCR0A, а обработчик у вас OCR0B?
2) Почитайте даташит в конце концов. Ну две строчки буквально. Просто бесит эта хрень. Не надо весь. Только таймер 0 регистор дескрипшн. CS0-2 находятся в регистре TCCR0B, а WGM0-1 в TCCR0A. А вы как настраиваете?
Забудьте про такое "на жигулях работало, а на тойоте почему-то отказывается". МК отличаются м/у собой. Иногда значительно.
Фраза типа "пробовал и так и так" - верх дилетанства. Напоминает мне тракториста, который говорит "пробовал магнитолу и +- подключать и -+ . Не работает." Не надо делать путём перебора. Надо прочитать как правильно и сделать 1 раз. Если не заработало - значит что-то прочитали невнимательно. Опять перечитываем и опять делаем.
|
|
|
|
02.06.2010, 00:10
|
|
Почётный гражданин KAZUS.RU
Регистрация: 25.05.2010
Адрес: г. Королёв
Сообщений: 8,497
Сказал спасибо: 30
Сказали Спасибо 3,072 раз(а) в 2,013 сообщении(ях)
|
Re: обработка прерывания таймера T0 ATtiny2313
Сообщение от DimanVIP
|
TCCR0A = (1‹‹WGM01)|(0‹‹WGM00)|(0‹‹CS02)|(1‹‹CS01)|(1‹‹CS00 );
|
В TCCR0B задайте коэф. деления и источник тактов. Datasheet стр. 77-78.
|
|
|
|
02.06.2010, 00:26
|
|
Временная регистрация
Регистрация: 20.05.2010
Сообщений: 64
Сказал спасибо: 8
Сказали Спасибо 2 раз(а) в 2 сообщении(ях)
|
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 при нажатии на кнопку
Или я чего-то где то не дочитал или просто уже засыпаю на ходу.
Будем думать дальше.
|
|
|
|
02.06.2010, 03:24
|
|
Почётный гражданин KAZUS.RU
Регистрация: 13.12.2004
Сообщений: 3,172
Сказал спасибо: 11
Сказали Спасибо 692 раз(а) в 504 сообщении(ях)
|
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 несложно.
|
|
|
|
02.06.2010, 09:03
|
|
Временная регистрация
Регистрация: 20.05.2010
Сообщений: 64
Сказал спасибо: 8
Сказали Спасибо 2 раз(а) в 2 сообщении(ях)
|
Re: обработка прерывания таймера T0 ATtiny2313
Не даром говорят утро - вечера мудренее.
Дело тут вовсе не в коде оказалось.
Подцепил я к м/к (в Протеусе) осцилоскоп, и сразу все заработало.
Вернее заработали обработчики прерываний, оба.
Видимо мне какой то веселый симулятор попался. версия его 7,6 sp4.
Всем большое спасибо за внимание и поддержку!
|
|
|
|
02.06.2010, 10:08
|
|
Гражданин KAZUS.RU
Регистрация: 04.08.2006
Сообщений: 911
Сказал спасибо: 28
Сказали Спасибо 180 раз(а) в 139 сообщении(ях)
|
Re: обработка прерывания таймера T0 ATtiny2313
Да дело всётаки в коде!!!
Я вам указал на 2 ошибки, а вы исправили одну!
Даже пост прочитать внимательно не осилили.
Ещё раз повторяю:
Вы инициализируете регистр OCR0A, а обработчик прерывания у вас TIMER0_COMPB_vect. Вы разницу между A и B чувствуете?
При определённых обстоятельствах это прерывание конечно будет приходить, только это никак не связано будет с OCR0A.
|
|
|
|
02.06.2010, 13:28
|
|
Почётный гражданин KAZUS.RU
Регистрация: 13.12.2004
Сообщений: 3,172
Сказал спасибо: 11
Сказали Спасибо 692 раз(а) в 504 сообщении(ях)
|
Re: обработка прерывания таймера T0 ATtiny2313
Сообщение от SasaVitebsk
|
Вы инициализируете регистр OCR0A, а обработчик прерывания у вас TIMER0_COMPB_vect.
|
У него оба обработчика, причем внутри одинаковых.
Сообщение от DimanVIP
|
Видимо мне какой то веселый симулятор попался.
|
Ничего удивительного - более глюкавую программу трудно найти. Завязывайте Вы с ним, вместо экономии времени Вы его только теряете. Если быпроверяли в студии или в железе, то разобрались бы быстрее.
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 01:05.
|
|