Форум программистов, компьютерный форум, киберфорум
Наши страницы
Микроконтроллеры Atmega AVR
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.67/58: Рейтинг темы: голосов - 58, средняя оценка - 4.67
polimorf96
9 / 9 / 1
Регистрация: 02.08.2010
Сообщений: 270
1

Прерывание таймера T1 в ATMega16

17.07.2011, 02:35. Просмотров 11289. Ответов 8
Метки нет (Все метки)

Доброго времени суток!
Пишу программу для ATMega16 под VMLAB нужно обработать прерывание от таймера T1 (работает в режиме СТС) . Так вот не могу понять как это сделать.
Пытался:
C
1
2
3
4
ISR(TIMER1 COMPA)
{
       /////
}
не вызывается.
пробовал
C
1
2
interrupt [TIMER1 COMPA] void Timer1_compa(void)
{}
вообще не компилируется.
Как мне правильно прерывание обработать? В интернете искал-не нашёл.
Спасибо за помощь! Вопрос то наверное тупой.

Добавлено через 2 минуты
я даже так пробовал:
C
1
2
3
4
5
#pragma vector = TIMER1_COMPA_vect  //Прерывание по таймеру1
__interrupt void Timer1Compa()
{
    PORTB=0xFF;
}
только видимо VMLAB не знает такую команду компилятору как "vector =....."
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
17.07.2011, 02:35
Ответы с готовыми решениями:

Прерывание по нажатию на кнопку (ATMega16)
Приветствую. Требуется написать программу, которая переводит 16-разрядный Т/С 1 в режим СТС с...

Прерывание по изменению уровня на INT0 в ATmega16
Предисловие. Проект частотомера в AVR Studyo 4. При использовании режима Power-down Mode...

Atmega16 не работает без таймера
Написал программку (atmel studio 7) дисплей повесил на порт B, пара кнопок на порту D (с подтяжкой...

Прерывание по переполнению таймера-счетчика ATmega8535 (ASM, AVR Studio 4)
Система прерываний на примере прерывания по переполнению встроенного таймера-счётчика...

Как реализовать прерывание по переполнению таймера atmega32a в Atmel Studio 4
Здравствуйте! Пытаюсь постигнуть таймеры. Но что-то не получается даже простенькое и понять не...

8
NaUAviaTech
2 / 2 / 1
Регистрация: 30.06.2011
Сообщений: 9
17.07.2011, 10:38 2
Цитата Сообщение от polimorf96 Посмотреть сообщение
Доброго времени суток!
Пишу программу для ATMega16 под VMLAB нужно обработать прерывание от таймера T1 (работает в режиме СТС) .
C
1
2
3
4
5
6
7
#include <avr/interrupt.h>
#include <avr/signal.h>
...
INTERRUPT(SIG_OUTPUT_COMPARE1A) //1A - подставить нужный регистр совпадения
{
  //Что-то делаем
}
Смотрите в сторону Программирование на языке C для AVR и PIC микроконтроллеров.
1
polimorf96
9 / 9 / 1
Регистрация: 02.08.2010
Сообщений: 270
17.07.2011, 11:54  [ТС] 3
Цитата Сообщение от NaUAviaTech Посмотреть сообщение
C
1
2
3
4
5
6
7
#include <avr/interrupt.h>
#include <avr/signal.h>
...
INTERRUPT(SIG_OUTPUT_COMPARE1A) //1A - подставить нужный регистр совпадения
{
  //Что-то делаем
}
Смотрите в сторону Программирование на языке C для AVR и PIC микроконтроллеров.
не вызывается. Наверное я опять что-то напортачил . Вот код всей программы:
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
// ***********************************************************
// Project:
// Author:
// Module description:
// ***********************************************************
 
#include <avr\io.h>              // Most basic include files
#include <avr\interrupt.h>       // Add the necessary ones
#include <avr\signal.h>          // here
 
 
// Define here the global static variables
//
int My_global;
 
INTERRUPT(SIG_OUTPUT_COMPAREOCR1AH)
{
    PORTB=0xFF;
}
//
 
// It is recommended to use this coding style to
// follow better the mixed C-assembly code in the
// Program Memory window
//
void my_function(void) {  // Put the open brace '{' here
          PORTD=0xFF;
}
 
// ***********************************************************
// Main program
//
int main(void) {
   DDRC=0xFF;
   PORTC=0xFF;
   DDRB=0xFF;
   DDRD=0xFF;
 
TCCR1A=0x0;
TCCR1B=0xD;
TCNT1H=0x0;
TCNT1L=0x0;
OCR1AH=0xF;
OCR1AL=0xFF;
asm("sei");
 
 
   while(1) {             // Infinite loop; define here the
      my_function();      // system behaviour
   }
 
}
0
NaUAviaTech
2 / 2 / 1
Регистрация: 30.06.2011
Сообщений: 9
17.07.2011, 21:17 4
Цитата Сообщение от polimorf96 Посмотреть сообщение
Наверное я опять что-то напортачил.
Попробуем разобрать:

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
#include <avr\io.h>            // Тут все понятно
#include <avr\interrupt.h>
#include <avr\signal.h>
 
int My_global;                   // Некая глобальная переменная
 
 
//Обработчик прерывания при совпадении Т1 с OCR1AH? Сравнение идет с OCR1A, а OCR1AH - его старший байт!!!
INTERRUPT(SIG_OUTPUT_COMPAREOCR1AH)
{
    PORTB=0xFF;    //Линии порта В в высокое.
}
 
void my_function(void)
{
          PORTD=0xFF;  //Линии порта D в высокое.
}
 
// ***********************************************************
// Main program
//
int main(void)
{
DDRC=0xFF;     // Линии порта C - выходы
PORTC=0xFF;   // с высоким состоянием.
DDRB=0xFF;     // Линии порта B - выходы
DDRD=0xFF;     // Линии порта D - выходы
 
TCCR1A=0x0;   // Таймер-счетчик отключен от OC1A и OC1B, ШИМ выключен!
TCCR1B=0xD;   // Используется тактовый сигнал МК, при совпадении T1 и OCR1A Е1 сбрасывается
TCNT1H=0x0;   // Обнуляем Т1
TCNT1L=0x0;
OCR1AH=0xF;  // Значение для сравнения Е1 = FFF
OCR1AL=0xFF;
asm("sei");      // Общее разрешение прерывания
 
 
while(1) // Бесконечный цикл
{  
     my_function();      // Здесь функция выполнится один раз, далее порт D и так будет в высоком
}
 
}
Замечания:

1. Не разрешено прерывание при совпадении T1 и OCR1A.
2. Неправильное имя параметра в функции обработки прерывания.
3. Ну сработает прерывание - выставит линии порта В в высокое навсегда.
4. Зачем в бесконечном цикле выставлять каждый раз линии порта Д.

ЗЫ: Какая стоит задача???

Добавлено через 45 минут
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/signal.h>
 
INTERRUPT(SIG_OUTPUT_COMPARE1A)  // Обработчик прерывания по совпадению T1 vs OCR1A
{
  // Что-то делаем
}
 
void main (void)
{
  OCR1AH = 0x0F; // Значение для сравнения
  OCR1AL = 0xFF;
  TCNT1H = 0;     // Т1 в 0
  TCNT1L = 0;
  DDRB = 0xFF;    // Конфигурируем нужный порт
  TCCR1B = (1<<CTC1)|(1<<CS10)  // Тактовую частоту на Т1 и его сброс при совпадении с OCR1
  TIMSC = (1<<OCIE1A) // Разрешить прерывание при совпадении T1 и OCR1
  sei(); // Общее разрешение прерываний
  while(1); // Бесконечный цикл
}


Где-то так, а функционал дополняйте.
1
polimorf96
9 / 9 / 1
Регистрация: 02.08.2010
Сообщений: 270
17.07.2011, 23:54  [ТС] 5
неа не работает.
* my_idea2.c, line 17: error: 'CTC1' undeclared (first use in this function)
* my_idea2.c, line 18: error: expected ';' before 'TIMSC'

а задачи никакой нету у меня так балуюсь с таймеров в VMLAB интересно почему ничего не работает.

Добавлено через 4 минуты
строку где присваевается значение TCCR1B я изменил потом:
TCCR1B=0x9(вроде правильно-0х9-это 1001. CTC1 BIT и CS10 Bit получаются равными 1.
а вот как заменить строку TIMSC = (1<<OCIE1A) я не знаю.
А разве TCCR1A ничего не должно присваиваться?
0
ValeryS
Модератор
7483 / 5666 / 725
Регистрация: 14.02.2011
Сообщений: 19,370
Завершенные тесты: 1
18.07.2011, 09:48 6
я тебе сгенерировал файл для CodeVisionAVR
прерывания от 0 и 1 таймера в самом простом режиме переполнения
моргают светодиоды на первых двух ножках порта B (0,1)
как мог прокомментировал
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
/*****************************************************
This program was produced by the
CodeWizardAVR V2.04.4a Advanced
Automatic Program Generator
© Copyright 1998-2009 Pavel Haiduc, HP InfoTech s.r.l.
[url]http://www.hpinfotech.com[/url]
 
Project : 
Version : 
Date    : 18.07.2011
Author  :
Company : 
Comments: 
 
 
Chip type               : ATmega16
Program type            : Application
AVR Core Clock frequency: 8,000000 MHz
Memory model            : Small
External RAM size       : 0
Data Stack size         : 256
*****************************************************/
 
#include <mega16.h>
 
// прерывание от тамера 0 пререполнение
interrupt [TIM0_OVF] void timer0_ovf_isr(void)
{
// Reinitialize Timer 0 value
PORTB.1=!PORTB.1;  // инвертируем сигнал на ножке 1
 
TCNT0=0x80; /*  значение в регистр счетны регистр таймера
               прерывание вызовется когда он отсчитает 0x80(128) тиков 0x80+0x80=0х100(переполнение)*/  
}
 
// прерывание от тамера 1 пререполнение
interrupt [TIM1_OVF] void timer1_ovf_isr(void)
{
// Place your code here
PORTB.0=!PORTB0; // инвертируем сигнал на ножке 0
TCNT1H=0xFF;
TCNT1L=0x20;   /*  значение в регистр счетный регистр таймера
               прерывание вызовется когда он отсчитает 0xE0(128) тиков 0xE0+0xFF20=0х10000(переполнение)*/  
}
 
// Declare your global variables here
 
void main(void)
{
 
// порт А на вход  на всех подтягивующий резистор отключен (высокоимпендантное состояние)
PORTA=0x00;
DDRA=0x00;
 
// порт B (7-2) на вход  на всех подтягивоющий резистор отключен (высокоимпендантное состояние)
// порт B (1 0) на выход  на выходах 0(рекомендуется не использумые выводы конфигурировать на вход чтобы случайно не сжечь)
PORTB=0x00;
DDRB=0x03;
 
// порт С на вход  на всех подтягивующий резистор включен  (источник тока)
PORTC=0xFF;
DDRC=0x00;
 
// порт D на вход  на всех подтягивующий резистор включен  (источник тока)
PORTD=0xFF;
DDRD=0x00;
//------------------------------------------------------------------------------------
// инициализация таймера0 
TCCR0=0x02;     /* режим Normal(бит 6,3 =0) наиболее простой режим счетный регистр(TCNT0) работает как 
                   суммируищий регистр по каждому импульсу присходит инкремент TCNT0 
                   при переходе 0xFF->0x00 флаг прерывание по переполнению устанавливается  в 1 
                   биты 0-2 управление тактовым сигналом
                   000   таймер остановлен 
                   001   частота кварца делится  на 1
                   010  частота кварца делится  на 8   (наш случай при кварце 8мГц =1мГц)
                   011   частота кварца делится  на 64
                   100    частота кварца делится  на 256
                   101    частота кварца делится  на 1024
                   110    Вывод T0 счет осуществляется по спадаешему фронту
                   111   Вывод T0 счет осуществляется по нарастаешему фронту
                   
                   */
TCNT0=0x80; /*  значение в регистр счетный регистр таймера
               прерывание вызовется когда он отсчитает 0x80(128) тиков 0x80+0x80=0х100(переполнение)*/  
OCR0=0x00;  // регистр сравнения (пока не интересует)
 
//------------------------------------------------------------------------------------
// инициализация таймера1 
TCCR1A=0x00;   /* режим Normal(бит 1,0 =0) наиболее простой режим счетный регистр(TCNT0) работает как 
                   суммируищий регистр по каждому импульсу присходит инкремент TCNT0 
                   при переходе 0xFFFF->0x0000 флаг прерывание по переполнению устанавливается  в 1 */
 
TCCR1B=0x01;    /*     биты 0-2 управление тактовым сигналом
                   000   таймер остановлен 
                   001   частота кварца делится  на 1 (наш случай при кварце 8мГц =8мГц)
                   010  частота кварца делится  на 8   
                   011   частота кварца делится  на 64
                   100    частота кварца делится  на 256
                   101    частота кварца делится  на 1024
                   110    Вывод T0 счет осуществляется по спадаешему фронту
                   111   Вывод T0 счет осуществляется по нарастаешему фронту
                   
                   */
 
TCNT1H=0xFF;
TCNT1L=0x20; /*  значение в регистр счетный регистр таймера
               прерывание вызовется когда он отсчитает 0xE0(128) тиков 0xE0+0xFF20=0х10000(переполнение)*/  
ICR1H=0x00;     // регистр захвата(пока не интересует)
ICR1L=0x00;
OCR1AH=0x00; // регистр сравнения (пока не интересует)
OCR1AL=0x00;  
OCR1BH=0x00;  // регистр сравнения (пока не интересует)
OCR1BL=0x00; 
 
// таймер 2 не используется
ASSR=0x00;
TCCR2=0x00;
TCNT2=0x00;
OCR2=0x00;
 
// внешние прерывания выключены  (пока не интересует)
MCUCR=0x00;
MCUCSR=0x00;
 
/* настройка прерываний от таймера(TIMSK)
  прерывание от переполнения таймера0 (бит0=1) 
    прерывание от переполнения таймера1 (бит2=1)
*/
 
TIMSK=0x05;
 
// компаратор выключен (пока не интересует)
ACSR=0x80;
SFIOR=0x00;
 
// РАЗРЕШИТЬ ПРЕРЫВАНИЯ (без этой команды ни ОДНО прерывание работать не будет)
#asm("sei")
 
while (1)
      {
      //просто крутимся
 
      };
}
рекомендую вместе с CodeVisionAVR поставить AVRStudio
тогда сможешь пользоваться отладчиком и смотреть пошагово что куда записывается и как меняется режим

Добавлено через 6 минут
могу порекомендовать книгу
А. В. Евстифнеев "Микроконтроллеры AVR Семейство Mega руководство пользователя"
очень хорош как справочник
но как учебник не подойдет
1
polimorf96
9 / 9 / 1
Регистрация: 02.08.2010
Сообщений: 270
18.07.2011, 13:11  [ТС] 7
спасибо теперь понял хоть как это всё работает .
AVR Studio есть у меня.
Правда тут осталась та же проблема-этот код не компилируется VMLAB-ом. В CV и AVRStudio всё нормально а вот VMLAB ошибки пишет . А в VMLAB-е всё-таки больше возможностей для отладки микроконтроллеров. Ну ладно буду довольствоваться AVRStudio.
Спасибо за помощь!
0
ValeryS
Модератор
7483 / 5666 / 725
Регистрация: 14.02.2011
Сообщений: 19,370
Завершенные тесты: 1
18.07.2011, 14:45 8
Могут быть ошибки поскольку ключевое слово interrupt для прерываний может не совпадать для разных компиляторов тем более interrupt [TIM0_OVF]
смотри документацию на компилятор как делать прерывания
Цитата Сообщение от polimorf96 Посмотреть сообщение
VMLAB-ом
не пробовал не знаю
AVR Studio по моему не плохой отладчик
тем более среда родная от ATMEL

Добавлено через 2 минуты
Цитата Сообщение от ValeryS Посмотреть сообщение
#asm("sei")
это по моему тоже не переносимо
0
polimorf96
9 / 9 / 1
Регистрация: 02.08.2010
Сообщений: 270
18.07.2011, 14:59  [ТС] 9
да директива #asm не переносима. Так же прерывания там другие и ещё много чего.
0
18.07.2011, 14:59
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
18.07.2011, 14:59

ATmega16. Настроить прерывание для таймера Т1
помогите настроить таймер Т1

[Решено] Не срабатывает прерывание по захвату таймера А
Не срабатывает прерывание по захвату таймера А. Вот код, я уже вырезал все, оставил только...

Прерывание таймера 8h.
Ребята, помогите. Задали задачку на асме. Необходимо переопределить прерывание таймера 8h, и каждые...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru