Модераторы: PILOT, ManiaK, Mazzi
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как зайти в прерывание СТС через раз? 
:(
    Опции темы
supercelt
Дата 15.8.2015, 22:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 658
Регистрация: 25.8.2005

Репутация: нет
Всего: 1



Код

#define F_CPU 16000000 //Частота камня
#include <avr/io.h>
#include <stdio.h>
#include <stdlib.h>
#include <avr/interrupt.h>
#include <string.h>
//#include "n5110.h"
#include <util/delay.h>

ISR(TIMER2_COMP_vect){
    if(PIND & (1 << 7)){ //А теперь делаем 1 раз за период

        }
}

int main(void){
        DDRD |= (1 << 7);
        PORTD &= ~(1 << 7);
        DDRD &= ~(1 << 6);
        PORTD |= (1 << 6); 
        OCR2 = 63; //Задаём частоту счётчика. При предделителе 1/1 и OCR = 31 Частота будет 125 kHz
        TCCR2 |= (0 << WGM20)|(1 << WGM21); //Режим работы таймера-счётчика0 - сброс при совпадении (СТС)
        TCCR2 |= (0 << CS22)|(0 << CS21)|(1 << CS20); //предделитель частоты 1\1
        TCCR2 |= (0 << COM21)|(1 << COM20); //Смена сигнала на PD7 - Toggle
        TIMSK |= (1 << OCIE2); //Разрешаем уходить в прерывание при совпадении TCNT2 и OCR2*/

        asm("sei");
        
        while(1){
            asm("nop");
        }
}


Попадаем в вектор 2 раза за период CLk, который генерится на D7. А надо заходить 1 раз на период. Я делаю как указано выше. Оно работает, но правильно ли это?
PM   Вверх
Mazzi
Дата 17.8.2015, 10:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Правильный
**


Профиль
Группа: Комодератор
Сообщений: 825
Регистрация: 3.4.2003

Репутация: 9
Всего: 21



Я бы счётчик поставил.


--------------------
Мне нужны помощники.
PM MAIL WWW   Вверх
bass
Дата 19.8.2015, 14:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 315
Регистрация: 5.8.2007

Репутация: нет
Всего: 2



Цитата(supercelt @ 15.8.2015,  22:43)
Код

#define F_CPU 16000000 //Частота камня
#include <avr/io.h>
#include <stdio.h>
#include <stdlib.h>
#include <avr/interrupt.h>
#include <string.h>
//#include "n5110.h"
#include <util/delay.h>

ISR(TIMER2_COMP_vect){
    if(PIND & (1 << 7)){ //А теперь делаем 1 раз за период

        }
}

int main(void){
        DDRD |= (1 << 7);
        PORTD &= ~(1 << 7);
        DDRD &= ~(1 << 6);
        PORTD |= (1 << 6); 
        OCR2 = 63; //Задаём частоту счётчика. При предделителе 1/1 и OCR = 31 Частота будет 125 kHz
        TCCR2 |= (0 << WGM20)|(1 << WGM21); //Режим работы таймера-счётчика0 - сброс при совпадении (СТС)
        TCCR2 |= (0 << CS22)|(0 << CS21)|(1 << CS20); //предделитель частоты 1\1
        TCCR2 |= (0 << COM21)|(1 << COM20); //Смена сигнала на PD7 - Toggle
        TIMSK |= (1 << OCIE2); //Разрешаем уходить в прерывание при совпадении TCNT2 и OCR2*/

        asm("sei");
        
        while(1){
            asm("nop");
        }
}


Попадаем в вектор 2 раза за период CLk, который генерится на D7. А надо заходить 1 раз на период. Я делаю как указано выше. Оно работает, но правильно ли это?

Не пойму какая конкретная задача стоит.
Но про режим СТС таймера АВР можно и почитать.
Какую нужно интервал такой и выставляете.

http://chipenable.ru/index.php/programming...im-ctc-ch2.html


PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Микроконтроллеры (MCU) и микропроцессоры (MPU)"
PILOT ManiaK
UniBomb Mazzi

На данный раздел помимо Правил форума распространяются текже следующие правила:


  • Прежде чем создать тему воспользуйтесь поиском или посмотрите в faq. Возможно на форуме уже есть ответ на ваш или близкий к вашему вопрос.
  • В заголовке темы в квадратных скобках обозначьте используемое семейство микроконтроллера: [avr],[pic],[arm].
  • При создании темы с вопросом указывайте участок кода с ошибкой, версию компилятора, схемы подключения, fuse биты и прочие данные, которые помогут найти правильный ответ. Для форматирования текста программ используйте кнопку код.
  • Новое сообщение должно иметь прямое отношение к тематике этого раздела. Для флуда, просьб выполнить задание, поиска партнёров или исполнителей существуют свои разделы.
  • Если вы заметили несовместимое с правилами сообщение, то можете уведомить об этом модератора раздела нажав кнопку Репорт у соответствующего сообщения.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, PILOT, ManiaK, UniBomb, Mazzi.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Микроконтроллеры (MCU) и микропроцессоры (MPU) | Следующая тема »


 




[ Время генерации скрипта: 0.0628 ]   [ Использовано запросов: 20 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.