реклама на сайте
подробности

 
 
> Проблема с авр, Начал изучать авр и не могу разобраться с таймерами
Andrew82
сообщение Jan 7 2008, 08:14
Сообщение #1





Группа: Участник
Сообщений: 12
Регистрация: 7-01-08
Пользователь №: 33 871



Начал изучать авр и не могу разобраться с таймерами к авр на порт д подключен семисегментный индикатор раз в сек он должен увеличивать цифру т.е. от 0 до девяти и так далее в чем ошибка подскажите? Симулирую на протеусе все файлы в архиве. Помогите и подскажите.
Прикрепленные файлы
Прикрепленный файл  seg.zip ( 34.58 килобайт ) Кол-во скачиваний: 48
 
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов (1 - 7)
ivstech
сообщение Jan 7 2008, 09:23
Сообщение #2


Местный
***

Группа: Свой
Сообщений: 204
Регистрация: 5-01-06
Пользователь №: 12 860



Разрешите прерывания
Go to the top of the page
 
+Quote Post
Andrew82
сообщение Jan 7 2008, 10:27
Сообщение #3





Группа: Участник
Сообщений: 12
Регистрация: 7-01-08
Пользователь №: 33 871



void main()
{
io_init();
timer0_init();
Dig_init();
PORTD = Dig[0];
#asm("sei"); // тут глобально разрешил прерывания
while(1)
{}
}
но в протеусе все равно не вижу то что хочется подскажите чуть развернутее
Go to the top of the page
 
+Quote Post
Aesthete Animus
сообщение Jan 7 2008, 14:58
Сообщение #4


Местный
***

Группа: Свой
Сообщений: 222
Регистрация: 9-06-07
Пользователь №: 28 317



2Andrew82

Из Вашегоисходника:
Код
void timer0_init()
{
  SREG |= (1 << 7);
  OCR0 = 1;  // Таймер срабатывает каждые 1024 такта. Прерывание каждые
  // 1024*16 тактов.
  TCCR0 |= (1 << WGM01) | (1 << CS00) | (1 << CS02);
  TIMSK |= (1 << OCIE0);
  TIFR |=(1 << 1);
}


По порядку
"SREG |= (1 << 7);" - необходимости в такой конструкции нет, хотя и она вполне законна. Лучше было написать sei() или #asm("sei") или __asm__ __volatile__ ("sei" :: ), в зависимости от компилятора.

"OCR0 = 1; // Таймер срабатывает каждые 1024 такта. Прерывание каждые 1024*16 тактов." - Непонятно... (С)

"TIFR |=(1 << 1);" - Зачем это?

"TIMSK |= (1 << OCIE0);" - а вот тут похоже и зарыта собака. Вы включаете прерывание по сравнению, но обрабатываете похоже прерывание по переполнению. Вот это у вас далее по тексту:
Код
interrupt [TIM0_OVF] void timer0_ovf_isr(void)


Пожалуйста, указывайте явно, какой используете контроллер и компилятор.
Go to the top of the page
 
+Quote Post
Andrew82
сообщение Jan 7 2008, 15:56
Сообщение #5





Группа: Участник
Сообщений: 12
Регистрация: 7-01-08
Пользователь №: 33 871



[---skipped---]


void timer0_init()
{
#asm("sei");
OCR0 = 16; // Таймер срабатывает каждые 1024 такта. Прерывание каждые 1024*16 тактов.
TCCR0 |= (1 << WGM01) | (1 << CS00) | (1 << CS02); //
TIMSK |= (1 << TOIE0);
} так я понимаю будет правильно да? указываю что прерываение по переполнению TOIE0 это 0 бит
переделанный исходник в архиве, кодевижион компилятор и чип мега 16


Moderator to
Andrew82: избегайте бездумного цитирования постов.
Прикрепленные файлы
Прикрепленный файл  seg.zip ( 811 байт ) Кол-во скачиваний: 36
 
Go to the top of the page
 
+Quote Post
Aesthete Animus
сообщение Jan 7 2008, 16:20
Сообщение #6


Местный
***

Группа: Свой
Сообщений: 222
Регистрация: 9-06-07
Пользователь №: 28 317



Цитата(Andrew82 @ Jan 7 2008, 18:56) *
void timer0_init()
{
#asm("sei");
OCR0 = 16; // Таймер срабатывает каждые 1024 такта. Прерывание каждые 1024*16 тактов.
TCCR0 |= (1 << WGM01) | (1 << CS00) | (1 << CS02); //
TIMSK |= (1 << TOIE0);
} так я понимаю будет правильно да? указываю что прерываение по переполнению TOIE0 это 0 бит
переделанный исходник в архиве, кодевижион компилятор и чип мега 16


Да нет, же, вы же хотите получить "Прерывание каждые 1024*16 тактов". Для это и устанавливаете OCR = 16. В строчке "TIMSK |= (1 << OCIE0);" ничего неправильного не было. Только нужно при этом обрабатывать прерывание по сравнинию, но у вас был написан обрботчик по переполнению [TIM0_OVF]. Я в CV не работал, но наверное TIM_OVF означает переполнение.
Go to the top of the page
 
+Quote Post
bloodden
сообщение Jan 7 2008, 18:43
Сообщение #7


Бывалый
***

Группа: Validating
Сообщений: 375
Регистрация: 19-10-05
Из: Kiev, UA
Пользователь №: 9 853



//Инициализация таймера
// Timer/Counter 0 initialization
// Clock source: System Clock
// Mode: Normal top=FFh
// OC0 output: Disconnected
TCCR0=0x05;
TCNT0=0x16;
OCR0=0x00;


//Включаем прерывания по ПЕРЕПОЛНЕНИЮ от него
// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=0x01;




//функция, которая исполняется с частотой (частота_кварца/1024)/16
//кстати, частота эта будет для 4МГц кварца 244 Гц. далеко не 1....
// Timer 0 overflow interrupt service routine
interrupt [TIM0_OVF] void timer0_ovf_isr(void)
{
// Reinitialize Timer 0 value
TCNT0=0x16;
// Place your code here

}


В кодевизионе это же делается элементарно с помощью мастера!
И с помощью него же по сравнению сделать элементарно.
Хотя некоторые и говорят, что его мастер только калечит головы начинающим программистам МК, с НАЧАЛА он очень помогает, а потом сам перестаёш его пользовать по одной простой причине: переходиш на другой компилятор.


--------------------
Заходите кому надо на мой сайт
Go to the top of the page
 
+Quote Post
Andrew82
сообщение Jan 8 2008, 12:59
Сообщение #8





Группа: Участник
Сообщений: 12
Регистрация: 7-01-08
Пользователь №: 33 871



Все всем спасибо все во внеминательности я то хотел по сравнению, а не по переполнению, спасибо всем откликнувшимся, пойду дальше изучать.
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 29th July 2025 - 17:32
Рейтинг@Mail.ru


Страница сгенерированна за 0.01398 секунд с 7
ELECTRONIX ©2004-2016