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

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

14.12.2012, 21:33. Просмотров 2728. Ответов 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;

}

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

Работа с EEPROM (ATMega16)
Кароче суть в том, что задали лабу а я хз как зделать, весь инет перелазил, а нужно вот что... ...

Работа с прерываниями Atmega16
Здравствуйте, недавно с али пришла мне долгожданная железка Atmega16A. Помигал светодиодами - стало...

Atmega16. Работа с периферией
Здраствуйте. Нужен проект ввода / вывода информации на базе процессора ATMEGA16 с печатной платой,...

Лабораторная работа на AtMega16
Добрый день! Никак не могу сделать лабораторную в VmLab. Задание следующее: Реализовать калькулятор...

ATMega16. Работа с индикатором HD4478
В программировании на С делаю первые шаги так что сильно не пинайте. Делаю генератор на...

4
soridumpid
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
0 / 0 / 0
Регистрация: 11.12.2012
Сообщений: 2
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
soridumpid
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
stritsh
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
01.01.2013, 02:55
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
01.01.2013, 02:55

atmega16 - работа с SD карточкой на CodeVisionAvr
С помощью стандартной библиотеки пытаюсь инициализировать карточку, #include &lt;mega16.h&gt; //...

Работа с LCD дисплеем HD44780 из МК Atmega16 (GCC)
Здравствуйте, пытаюсь подключить LCD дисплей к микроконтроллеру, скачал библиотеку, но уже на...

Работа с дисплеем HD44780 в Протеус (ATMega16, ASM)
Писал когда то програмку для выводов символов на ЖКИ. Раньше работала. Решил тут недавно добавить...


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

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

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