реклама на сайте
подробности

 
 
> Прерывание по таймеру - поможите, после срабатывания прерывания возврат не на то место
dedded
сообщение Apr 25 2007, 07:45
Сообщение #1


Участник
*

Группа: Свой
Сообщений: 35
Регистрация: 28-01-06
Из: Ванино
Пользователь №: 13 712



Ребят, в большом проекте попался кусок, над которым я уже туплю. Среда CVAVR 1.25. Нужно выдать на ногу, неважно какую, количество импульсов, с определенной частотой. После обработки прерывания по таймеру, где меняется сигнал на ноге, возвращается тупо не туда, где прерывание прервало работу проги.

#include <mega16.h>
#include <stdio.h>
#include <delay.h>


long int step_kol;
int step;


interrupt [TIM0_OVF] void timer0_ovf_isr(void)
{
// Reinitialize Timer 0 value
TCNT0=step // загрузили константу
step_kol++; //счетчик количества шагов
PORTC.0^=1; // дернули ногой

}

void main(void){

// уже не до красоты - переписал, чтобы понятно было порт С - выход

DDRC = 255;
PORTC = 0;

TIMSK=0x3;

#asm("sei")

while(1){


было
step=0x100; //константа для задания частоты
поправил, это просто описка
step=0x10;


TCCR0 = 0x00; //stop
TCNT0 = step; //set count
TCCR0 = 0x05; //start timer с предделителем на 1024


while (step_kol<1000){ //жду, когда в таймере пройдет 1000 циклов
#asm("wdr");
}
step_kol=0;
delay_ms(5000); сюда не доходит
}
}

кусок выдрал аккуратно вроде, точнее заново оформил
что же я не так делаю?
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
dedded
сообщение Apr 25 2007, 11:28
Сообщение #2


Участник
*

Группа: Свой
Сообщений: 35
Регистрация: 28-01-06
Из: Ванино
Пользователь №: 13 712



Отвечу сразу всем: написано действительно криво, потому как весь код сюда ложить смысла нет. просто по быстрой оформил проектик с этим злополучным куском, чтобы сюда положить.
Задача общая, - сформировать посылку № на ногу, тут PORTC.2 для управления ШД. срезал все лишнее, чтобы идею понять можно было.
interrupt [TIM0_OVF] void timer0_ovf_isr(void)
{

TCCR0 = 0x00; //stop
TCNT0=step;
step_kol++;
PORTC.0^=1;
TCCR0 = 0x05;
}

так тоже - самое

step = описался, равен 10

WDT - оставил из большого куска, чтобы в этом цикле собака не срабатывала.

Алгоритм - запустили таймер, который 1000 раз должен отработать( в данном случае) после этого паузы и прочее.
До пауз дело не доходит
Стек переполняется


Цитата(Валентиныч @ Apr 25 2007, 17:38) *
И при входе/выходе в/из прерывание сохранять/восстанавливать программный счетчик.

Глупый , наверное , вопрос - а CVAVR это не делает? можете бросать в меня гнилыми апельсинами

Цитата(GDI @ Apr 25 2007, 18:21) *
Кусок кода приведенный автором написан криво, очень криво, но я спишу это на трудности переноса сути вопроса из большого проекта smile.gif
А вот что я заметил:

2) зачем в главном цикле while(1){} производится постоянно переинициализация таймера(останов, загрузка опять же 16 битным значением 8 битного регистра счета, старт с предделителем)?

3) далее зачем то ждем 1000 циклов таймера чтобы сбросить WatchDog, причем используется переменная long int step_kol. хотя тут хватило бы и простого int.
4) затем задержка на 5 сек во время которой продолжаются прерывания таймера.

В итоге, автор не написал как работает данный кусок, но я предположу, что происходит постоянная генерация на ноге PortC.0 с частотой переполнения 8 битного таймера на частоте XTAL/1024, т.е. частота XTAL/1024/256, возможно , с короткими перерывами. Также предположу что автор хотел генерировать 1000 импульсов с перерывом в 5 секунд, но данный кусок этого просто не может обеспечить.


этот кусок в таком виде должен через каждые 5 сек выдавать 1000 импульсов, на выдачу импульсов при 11,0592 уходит примерно 2 секудны, 5 сек - это с запасом, чтобы в эмуляторе картинка была

а после выполнения прерывания - чаще всего начинает работать сначала проги, но в проекте - не с начала, т.е не сброс, но с достаточно конкретного места
Go to the top of the page
 
+Quote Post
Валентиныч
сообщение Apr 25 2007, 11:31
Сообщение #3


Профессионал
****

Группа: Свой
Сообщений: 553
Регистрация: 17-02-05
Из: Свердловская обл.
Пользователь №: 2 712



Цитата(dedded @ Apr 25 2007, 14:28) *
Глупый , наверное , вопрос - а CVAVR это не делает? можете бросать в меня гнилыми апельсинами

Не знаю... Работаю в другой среде. Поэтому и предположил.


--------------------
Закономерность: Чем больше узнаю, тем меньше знаю...
Любые мнения, даже ошибочные, имеют право на существование.
Чем лучше узнаю людей, тем больше нравятся собаки...
Go to the top of the page
 
+Quote Post
dedded
сообщение Apr 25 2007, 11:54
Сообщение #4


Участник
*

Группа: Свой
Сообщений: 35
Регистрация: 28-01-06
Из: Ванино
Пользователь №: 13 712



Цитата(Валентиныч @ Apr 25 2007, 19:31) *
Не знаю... Работаю в другой среде. Поэтому и предположил.


Предположение смахивает на правду, кста, алгоритм брал из когда - то работающего проекта. Тот писался тоже на CVAVR только какой-то ранней версии. Ребят, у кого есть - CVAVR 1.25 и VMLAB проверьте, плиз. что-то я читал у них на сайте насчет работы с лицензией, сделанной кейгеном. Кто-то же выложил это на фтп. Ну и еще вопрос - купить то есть где CVAVR? Поиск результатов не дал.

Цитата(tag @ Apr 25 2007, 18:27) *
...в глаза бросается использование watchdog-а, нет явной настройки (а по умолчанию он не запущен) и вдруг он стартуется #asm(wdr) ... а затем пауза вставлена delay_ms(5000); довольно продолжительная...может быть проблема в этом?

да, тут маленько неправильно, WD срабатывает каждые 2 секунды, в это месте он конечно сработает, но он не доходит до этого места. Правильнее конечно время задержки поставить 1.8 секунды, только проблема балин не тут.
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- dedded   Прерывание по таймеру - поможите   Apr 25 2007, 07:45
- - arttab   перед заносом в TCNT0 таймер не остановлен. это мо...   Apr 25 2007, 08:56
|- - Валентиныч   Цитата(arttab @ Apr 25 2007, 11:56) перед...   Apr 25 2007, 09:38
- - GDI   Кусок кода приведенный автором написан криво, очен...   Apr 25 2007, 10:21
|- - Snaky   Цитата(GDI @ Apr 25 2007, 13:21) 3) далее...   Apr 25 2007, 10:48
- - tag   Цитата(dedded @ Apr 25 2007, 07:45) кусок...   Apr 25 2007, 10:27
- - GDI   step все равно лучше сделать char или const char и...   Apr 25 2007, 12:02
|- - dedded   Цитата(GDI @ Apr 25 2007, 20:02) step все...   Apr 25 2007, 12:15
|- - aesok   Проанализируйте окошко "Call stack" и во...   Apr 25 2007, 12:33
|- - dedded   Цитата(aesok @ Apr 25 2007, 20:33) Проана...   Apr 25 2007, 12:52
|- - Сергей Борщ   Цитата(dedded @ Apr 25 2007, 11:52) TIMSK...   Apr 25 2007, 15:13
|- - dedded   Цитата(Сергей Борщ @ Apr 25 2007, 23:13) ...   Apr 25 2007, 16:15
- - GDI   TCCR0 = 0x00; //stop TCNT0 = step; //set count TCC...   Apr 25 2007, 12:57
- - dedded   Цитата(GDI @ Apr 25 2007, 20:57) TCCR0 = ...   Apr 25 2007, 13:08


Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 20th August 2025 - 01:17
Рейтинг@Mail.ru


Страница сгенерированна за 0.01431 секунд с 7
ELECTRONIX ©2004-2016