Форум программистов, компьютерный форум, киберфорум
Наши страницы
Микроконтроллеры Atmega AVR
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.63/8: Рейтинг темы: голосов - 8, средняя оценка - 4.63
krasdok
0 / 0 / 0
Регистрация: 11.03.2010
Сообщений: 62
1

Как реализовать прерывание по переполнению таймера atmega32a в Atmel Studio 4

17.12.2016, 21:21. Просмотров 1522. Ответов 5
Метки нет (Все метки)

Здравствуйте!
Пытаюсь постигнуть таймеры.
Но что-то не получается даже простенькое и понять не могу почему.
Вот код который пробую(в отладчике вроде все работает, а записываю в контроллер нет):
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
#include <avr/io.h>
#include <avr/interrupt.h>
 
ISR( TIMER1_OVF_vect )
{
  TCNT1 = 64456; //выставляем начальное значение TCNT1
  if( PINB & ( 1 << PB0 ) ) {
    PORTB &= ~( 1 << PB0 );
  }
  else {
    PORTB |= ( 1 << PB0 );
  }
}
 
int main()
{
  DDRB = ( 1 << PB0 );  // настраиваем PB0 на выход
  TCCR1B = (1<<CS12)|(0<<CS11)|(1<<CS10); // настраиваем делитель
  TIMSK |= (1<<TOIE1); // разрешаем прерывание по переполнению таймера
  TCNT1 = 64456;        // выставляем начальное значение TCNT1
  sei();                // выставляем бит общего разрешения прерываний
  while(1);             // вечный цикл
  return 0;
}

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
17.12.2016, 21:21
Ответы с готовыми решениями:

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

Прерывание по переполнению не работает
Я начинающий. Сделал первый девайс на Tiny13. Первую прошивку написал на CAVR....

ATMega8. Таймер счетчик. Прерывание по переполнению
Доброго времени суток, господа. Пытаюсь организовать прерывание по переполнению...

Режим CTC, прерывание по переполнению "теряем" обязательно?
Правильно ли я понимаю, что при работе таймера в режиме CTC, обязательно...

Как включить sprintf() в Atmel Studio
Возможно глупый вопрос, но все же)) Необходимо преобразовать переменную с...

5
ValeryS
Модератор
7372 / 5573 / 707
Регистрация: 14.02.2011
Сообщений: 18,934
17.12.2016, 21:44 2
krasdok, включайте теги форматирования кода
для языка Си выделить листинг и нажать кнопочку С на шапке
0
Skyer
76 / 60 / 47
Регистрация: 05.05.2013
Сообщений: 188
18.12.2016, 00:45 3
Проверьте схему. Сейчас зашил, все работает. На всякий случай прикладываю проект из 4-ой студии
1
Вложения
Тип файла: rar Test.rar (588.5 Кб, 8 просмотров)
krasdok
0 / 0 / 0
Регистрация: 11.03.2010
Сообщений: 62
18.12.2016, 17:44  [ТС] 4
Спасибо!
Залил ваш hex у меня тоже мигает.
Но когда загрузил проект в Atmel Studio 4, то вылезли ошибки...
Снимок экрана прилагаю.
0
Миниатюры
Как реализовать прерывание по переполнению таймера atmega32a в Atmel Studio 4  
Skyer
76 / 60 / 47
Регистрация: 05.05.2013
Сообщений: 188
18.12.2016, 19:12 5
Тоже была такая проблема. В настройках проекта (Project -> Configuration Options) укажите правильно контроллер (Device)
0
krasdok
0 / 0 / 0
Регистрация: 11.03.2010
Сообщений: 62
21.12.2016, 08:08  [ТС] 6
Фантастика! Создал новый проект, скопировал туда ваш код, скомпилировал и залил все заработало...
Такое происходит когда я делаю кое что на работе, а потом проект копирую на флэшку и пытаюсь дома поэкспериментировать.

Добавлено через 23 часа 17 минут
Вот диодик по таймеру моргает. Научился также отправлять данные на дисплей двухстрочный 1602А.
Теперь бьюсь часики вывести на экран. Пробую соединить первый пример и вывод на экран, не получается тоже...
Диод не моргает вообще а на экране всякая чушь вместо надписей появляется.
Кто разбирается посмотрите код. У меня задача стоит такая на экран выводится текст в бесконечном цикле, а по прерыванию параллельно диодик моргает.
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
#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>
 
#define RS PC0 
#define EN PC1
 
ISR( TIMER1_OVF_vect )
{
  TCNT1 = 64456; //выставляем начальное значение TCNT1
  if( PINB & ( 1 << PB0 ) ) {
    PORTB &= ~( 1 << PB0 );
  }
  else {
    PORTB |= ( 1 << PB0 );
  }
}
 
// Функция записи команды в ЖКИ
void lcd_com(unsigned char p)
{
PORTC &= ~(1 << RS); // RS = 0 (запись команд)
PORTC |= (1 << EN);  // EN = 1 (начало записи команды в LCD)
PORTA &= 0x0F; PORTA |= (p & 0xF0); // Выделяем старший нибл
_delay_us(100);
PORTC &= ~(1 << EN); // EN = 0 (конец записи команды в LCD)
_delay_us(100);
PORTC |= (1 << EN); // EN = 1 (начало записи команды в LCD)
PORTA &= 0x0F; PORTA |= (p << 4); // Выделяем младший нибл
_delay_us(100);
PORTC &= ~(1 << EN); // EN = 0 (конец записи команды в LCD)
_delay_us(100);
}
 
// Функция записи данных в ЖКИ
void lcd_dat(unsigned char p)
{
PORTC |= (1 << RS)|(1 << EN); // RS = 1 (запись данных), EN - 1 (начало записи команды в LCD)
PORTA &= 0x0F; PORTA |= (p & 0xF0); // Выделяем старший нибл
_delay_us(100);
PORTC &= ~(1 << EN); // EN = 0 (конец записи команды в LCD)
_delay_us(100);
PORTC |= (1 << EN); // EN = 1 (начало записи команды в LCD)
PORTA &= 0x0F; PORTA |= (p << 4); // Выделяем младший нибл
_delay_us(100);
PORTC &= ~(1 << EN); // EN = 0 (конец записи команды в LCD)
_delay_us(100);
}
 
// Функция инициализации ЖКИ
void lcd_init(void)
{
DDRC |= (1 << PC1)|(1 << PC0); // PC1, PC0 - выходы
PORTC = 0x00;
DDRA = 0xFF; // порт D - выход
PORTA = 0x00;
 
_delay_ms(50); // Ожидание готовности ЖК-модуля
 
// Конфигурирование четырехразрядного режима
PORTA |= (1 << PA5);
PORTA &= ~(1 << PA4);
 
// Активизация четырехразрядного режима
PORTC |= (1 << EN);
PORTC &= ~(1 << EN);
_delay_ms(5); 
 
lcd_com(0x28); // Шина 4 бит, LCD - 2 строки
lcd_com(0x08); // Полное выключение дисплея
lcd_com(0x01); // Очистка дисплея
_delay_us(100);
lcd_com(0x06); // Сдвиг курсора вправо
_delay_ms(10);
lcd_com(0x0C); // Включение дисплея, курсор не видим
}
 
// Основная программа
int main (void)
 {
unsigned char znak = 0; // определяем переменную
 DDRB = ( 1 << PB0 );  // настраиваем PB0 на выход
  TCCR1B = (1<<CS12)|(0<<CS11)|(1<<CS10); // настраиваем делитель
  TIMSK |= (1<<TOIE1); // разрешаем прерывание по переполнению таймера
  TCNT1 = 64456;        // выставляем начальное значение TCNT1
  sei();   
lcd_init(); // Инициализация дисплея
 
while (1)
{
//sei();
asm("nop"); 
lcd_com(0x80); // Вывод в верхнюю левую позицию 1 строки
lcd_dat(znak/100 + '0'); // Выделяем сотни
lcd_dat((znak/10)%10 + '0'); // Выделяем десятки 
lcd_dat(znak%10 + '0'); // Выделяем единицы
lcd_dat('='); // Выводим знак равенства
lcd_dat(znak); // Выводим содержимое знакогенератора
_delay_ms(100); // Тут можно поменять задержку вывода символов
lcd_com(0xC0);
 
lcd_dat('V'); 
lcd_dat('o'); 
lcd_dat('l'); 
lcd_dat('k'); 
lcd_dat('o'); 
lcd_dat('v'); 
lcd_dat('='); 
lcd_dat('1'); 
lcd_dat('5'); 
lcd_dat(':'); 
lcd_dat('0');
lcd_dat('4'); 
lcd_dat(':');
lcd_dat('7');
lcd_dat('6'); 
 
_delay_ms(100);
znak++; // Следующий символ знакогенератора
}
}
Добавлено через 3 часа 58 минут
Помогите понять что не так в коде...
Очень жду помощи

Добавлено через 19 часов 22 минуты
Все решено заработало...МК перезагружался походу из-за питания. (Код рабочий если кому надо подключить дисплей)
Да я заметил что на экране все начинается с начало(как бы все перезапускается).
Все питалось от USB компьютера (прошивал и сразу смотрел что получается макетная плата такая)
Подключил USB кабель к блоку питания от зарядки телефона и все заработало.
На экране информация изменяется сама по себе а диод сам по себе моргает (многозадачность получается).
Теперь буду думать как часики доделать...
0
21.12.2016, 08:08
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
21.12.2016, 08:08

Как в Atmel studio избавится от дребезга контактов?
Народ я тут в интернете нашёл программу для таймера на микроконтроллере Atmega8...

Как подключить в atmel studio 7 свою библиотеку?
у меня Atmel Studio 7 #include &quot;libraries/lcd.h&quot; положил в папку с проектом и...

Atmel Studio 6 . Как подключить к проекту библиотеку
Добрый день! Как в Atmel Studyo 6 подключить к проекту скомпилированную...


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

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

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