Форум программистов, компьютерный форум, киберфорум
Наши страницы
Микроконтроллеры Atmega AVR
Войти
Регистрация
Восстановить пароль
Другие темы раздела
Atmega AVR микроконтроллер Работа с семисегментником на ATtiny2313 http://www.cyberforum.ru/avr/thread1298465.html
Нужна помощь. Используемый софт: AVR Studio 6, Proteus 7.8 Задача: По кнопке должен загораться 7-ми сегментнай индикатор, показыват число от 0 до 9 соответственно. Всего 10 кнопок. Когда кнопка...
Atmega AVR микроконтроллер Инициализация массива (Atmel Studio 6, Си) Почему в Atmel Studio 6 окне Watch не отображаются переменные? Вместо заданных пяти переменных 16,155,36,33,67 отображается пять нулей... #include <avr/io.h> unsigned char Sifra =... http://www.cyberforum.ru/avr/thread1297123.html
Подключение питания для ATmega168-20AU Atmega AVR микроконтроллер
Подскажите пожалуйста и помогите разобраться с питанием программирования данного микроконтроллера. Схема вариометра http://www.avislab.com/blog/vario/ плата полностью готова , возник вопрос куда...
Atmega AVR микроконтроллер Работа с EEPROM (ATMega16)
Кароче суть в том, что задали лабу а я хз как зделать, весь инет перелазил, а нужно вот что... Завдання ось таке: До порту В підключити 8 світлодіодів, а до порту С на 1 і 5 виводити кнопку. В...
Atmega AVR микроконтроллер Изменение порогов срабатывания аквариумного терморегулятора на ATmega8A-AU (Algorithm Builder) http://www.cyberforum.ru/avr/thread1294819.html
Собрал вот такой терморегулятор http://pakhom.weebly.com/r10-2012.html Всё работает без проблем, но хотелось бы изменить порог срабатывания. Т.е. сейчас он работает так: Например...
Atmega AVR микроконтроллер Последовательное зажигание светодиодов по кнопке (ATmega8515, ASM) Добрый день. Требуется помощь для написания программы на ассемблере под AVR ATmega8515 микроконтроллер. В этом деле я новичок. Исходная программа на ассемблере для микроконтроллеров AVR должна... подробнее
dim3740
0 / 0 / 0
Регистрация: 26.04.2014
Сообщений: 109
13.11.2014, 04:19  [ТС] 0

Прерывания по таймеру Т1 в Atmega8

13.11.2014, 04:19. Просмотров 3422. Ответов 6
Метки (Все метки)

Ответ

еще посмотрите, плз, м.б. надо/важно побайтно уставки записывать?
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
#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>
 
//#define F_CPU 1000000UL
#define ZERO_CROSS PD2 //Вход импульсов ZERO-CROSS (INT0)
#define Sw1 PC0        //Кнопка включения и увеличения яркости
 
#define control_triac1A PD4      //Вывод на управляющий электрод симистора
#define control_triac1B PD5      //Вывод на управляющий электрод симистора
#define v_change_brightness1A 10 //Шаг регулировки скорости изменения яркости
#define v_change_brightness1B 8 //Шаг регулировки скорости изменения яркости
 
#define t_pulse_triac 70       //Длительность отпирающего импульса симистора 20 мкс 
 
volatile unsigned int brightness1A;
volatile unsigned int brightness1B;
 
ISR (INT0_vect)                             
{
    //запуск таймера Т1A    
    OCR1A = brightness1A; 
    TCCR1B |= _BV(CS10);  // CS10  - без делителя, режим Нормал, но с сравнением
    
    //запуск таймера Т1B
    OCR1B = brightness1B;
    TCCR1B |= _BV(CS10);    
}
 
ISR (TIMER0_OVF_vect)            
if(bit_is_clear(PINC, Sw1)) brightness1A += v_change_brightness1A;   //уменьшаем яркость
  
 
 
ISR (TIMER1_COMPA_vect)  //T1 прерывание для формирования открывающего импульса симистора
{
    PORTD |= _BV(control_triac1A);  //Передний фронт отпирающего импульса симистора
    _delay_us (t_pulse_triac);    //Длительность отпирающего импульса
    PORTD &= ~_BV(control_triac1A); //Задний фронт отпирающего импульса симистора
}
 
ISR (TIMER1_COMPB_vect)  //T1 прерывание для формирования открывающего импульса симистора
{
    PORTD |= _BV(control_triac1B);  //Передний фронт отпирающего импульса симистора
    _delay_us (t_pulse_triac);    //Длительность отпирающего импульса
    PORTD &= ~_BV(control_triac1B); //Задний фронт отпирающего импульса симистора
}
 
 
int main (void)
{
    PORTC |= _BV(Sw1);//кнопки с подтягивающими резисторами
    DDRD |= _BV(control_triac1A);  //выход управляющего электрода
    DDRD |= _BV(control_triac1B);  //выход управляющего электрода
    DDRD &= ~_BV(ZERO_CROSS);    //вход детектора нуля
    PORTD |= _BV(ZERO_CROSS);    //с подтягивающим резистором 
    MCUCR |= (1 << ISC00)|(1 << ISC01);    // прерывание по росту INT0
    GICR |= _BV(INT0);           //разрешаем внешнее прерывание 0
    
       TIMSK |= _BV(TOIE0);  //разрешаем прерывания таймеров 0  
 
    TIMSK |= _BV(OCIE1A); //разрешаем прерывания таймеров 1A
    TIMSK |= _BV(OCIE1B); //разрешаем прерывания таймеров 1B
        
    TCCR0 |= _BV(CS02);          //запускаем таймер 0 с предделителем на 256 для опроса кнопок регулировки яркости
    
    sei();                       //общее разрешение прерываний
    while(1)
  {}
}
Добавлено через 10 часов 53 минуты
Вопрос решился предварительным сбросом Т1 в перед запуском в функции ISR (INT_vect). Т.е: думаю, что запуск таймера не инициализирует его, он может приостанавливаться/возобновляться. После выхода на обработчик прерывания сравнения, счетчик продолжал счет, потом в него заносилась снова уставка, но его состояние в этот момент могло быть любым. Но остается вопрос (теоретический) - как можно применять режим СТС одновременно для А и В, если более ранний вектор ОБНУЛЯЕТ счет полностью, т.е. и для канала В?

Вернуться к обсуждению:
Прерывания по таймеру Т1 в Atmega8
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
13.11.2014, 04:19
Готовые ответы и решения:

Не срабатывают внешние прерывания INT0/INT1 в Atmega8
Помогите разобраться новичку в МК, в чем может быть проблема. Пытаюсь освоить самостоятельно...

Не работают прерывания по таймеру ATtiny13a
Добрый день, уже замучился, что только не пробовал: менял компиляторы(WinAVR, AtmelStudio4,7),...

Разница между ATMEGA8-16AI и ATMEGA8-16AU
Кто подскажет, в чем разница между ATMEGA8-16AI и ATMEGA8-16AU. Смотрю в Платане цены между ними...

Прерывания по таймеру
Подскажите как сделать что бы прерывания от таймера срабатывало раз в секунду. Сильно не ругайте...

Прерывания по таймеру в PLC 1200
Всем хорошего дня. Столкнулся с проблемой. В PLC 200 есть команды для програмирования прерываний...

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