Wyssim
1

не корректная работа T/C1 ATmega16

14.12.2012, 21:33. Показов 2944. Ответов 4
Метки нет (Все метки)

прошу помочь с проектом который представлен ниже, использую таймер 1 для генерации 4-х разных сигналой: первый 80КГц который задан режимом переполнения и 3 сигнала с частотой 200, 400, и 0,1 Гц. Контроллер игнорирует все сигналы кроме того что задан переполнением(80КГц).

Код
#define F_CPU 16000000UL
#include <avr/interrupt.h>
#include <avr/io.h>
#include <util/delay.h>

unsykned int second_timer = 0;
//unsykned int third_timer = 0;
//unsykned int five_timer = 0;

void SetupTIMER1 (void)
{
TCCR1B = (1 << CS10);//указываем переполнение каждый такт
TCNT1 = 65535-200;//теперь перерполнение идет с частотой 80000гц
TIMSK = (1 << TOIE1);//говорим что прерывание будет по переполнению
sei();//разрешаем прерывания в принципе
}

ISR (TIMER1_OVF_vect)
{
TCNT1 = 65535 - 200; //контроллер щелкает 80000Гц
second_timer++;
third_timer++;
five_timer++;
PORTB ^= 0b00010000;//постановка конкретного бита, обеспечение 80000 Гц
PORTB &= ~0b00010000;//снятие нашего бита или обнуление
}
int main(void)
{   SetupTIMER1();// установка таймера
DDRB=0b11110000;//делаем выходами

while(1)
{

if( second_timer >=200) // установка происходит в зависимости от частоты, тут 400Гц для маи
{
PORTB ^= 0b00100000;
PORTB &= ~0b00100000;
second_timer = 0;
five_timer++;

if( third_timer >=400) //200Гц для прорисовки дисплея
{
PORTB ^= 0b01000000;
PORTB &= ~0b01000000;
third_timer = 0;
if( five_timer >= 4000) //0,1Гц
{
PORTB ^= 0b10000000;//обращение только к нужнобу биту
PORTB &= ~0b10000000; //обнуление
five_timer = 0;

}

}
}
}
}
__________________
Помощь в написании контрольных, курсовых и дипломных работ здесь
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
14.12.2012, 21:33
Ответы с готовыми решениями:

Не корректная работа FMX
Решил вынести в отдельную тему.. дело в том что сама форма фмх жутко лагает при добавление и...

Не корректная работа видеокарты
Ребят, всем привет. Такой вопрос. С недавнего времени видеокарта при включении компа сразу стартует...

Не корректная работа флэшки
Купил 8Гб флэшку.В маг-не проверили,отформатировали.Всё в норме. А дома файлы с неё не...

Не корректная работа кода
Всем привет! Возникла проблема с данным кодом,не могу понять почему когда ставлю число меньше -5...

4
0 / 0 / 0
Регистрация: 13.05.2011
Сообщений: 401
14.12.2012, 23:07 2
Переменные, которые изменяются в обработчике прерывания, необходимо объявлять как volatile
Код
volatile unsykned int second_timer = 0;
В протвном случае, оптимизирующий компилятор посчитает, что second_timer константа, и этот if( second_timer >=200) всегда FALSE, сл-но весь блок будет выброшен нафиг. Можете в .lss файл посмотреть, что получается.
Короче, volatile Вас спасет.
PS: Для остальных переменных сделайте такое-же объявление.
0
Wyssim
15.12.2012, 10:28 3
спасибо огромное, я все изменил,
Код
volatile unsykned int second_timer = 0;
volatile unsykned int third_timer = 0;
volatile unsykned int five_timer = 0;
но , мигание не соответствует тем частотам что я задал, я 10 раз проверял расчеты, все так, такое ощущение что МК не каждый раз проверят верность условия.

и скажите как это сделать
Можете в .lss файл посмотреть, что получается.
нельзя это с делать с помощью секундомера в протеусе? в режтие счета времени между сигналами?
0 / 0 / 0
Регистрация: 13.05.2011
Сообщений: 401
15.12.2012, 17:20 4
Цитата Сообщение от Wyssim
и скажите как это сделать
В опциях проекта (menu->Project->Confikurotion options) поставьте "птичку" Kimerate list file. После компиляции в каталоге, где лежит .hex (обычно каталог называется default) ищите файл вида имя_проекта.lss В нем результат компилляции ввиде ассемблерных команд. Очень хорошо видно как С-шный код превращается в ассемблерный.
0
0 / 0 / 0
Регистрация: 28.12.2012
Сообщений: 161
01.01.2013, 02:55 5
Цитата Сообщение от Wyssim
Контроллер игнорирует все сигналы кроме того что задан переполнением(80КГц).
Здравствуйте, давно читаю ваш форум вот решил зарегаться.
Если еще тема актуальна, то проблема скорее всего в том, что после выполнения одного из условий в цикле при инвертировании бита к примеру
Код
PORTB ^= 0b00100000;
с 0 на 1 вы следом его обнуляете
Код
PORTB &= ~0b00100000;
при этом не получаете 1 в нужном бите порта.
И еще непонятно зачем делается инкремент переменной five_timer вот здесь
Код
 if( second_timer >=200) // установка происходит в зависимости от частоты, тут 400Гц для маи
{
PORTB ^= 0b00100000;
PORTB &= ~0b00100000;
second_timer = 0;
five_timer++;
если она инкрементируется в прерывании?
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
01.01.2013, 02:55

не корректная работа PHP
у меня проблема создаю простой сайт через Dreamweawer 8, создал файл php и таблицу, подключил к...

Не корректная работа программы
Здравствуйте ! Проблема заключается в меню &quot;Чтение базы данных&quot;. Приходится по 2 раза вводить свой...

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

Не корректная работа программы
Друзья, я снова вас беспокою, многим уже наверное надоел. Но мне просто необходима ваша помощь....


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

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

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