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

 
 
> Прерывание по таймеру - поможите, после срабатывания прерывания возврат не на то место
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
Ответов
GDI
сообщение Apr 25 2007, 12:02
Сообщение #2


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

Группа: Свой
Сообщений: 1 235
Регистрация: 14-05-05
Из: Санкт-Петербург
Пользователь №: 5 008



step все равно лучше сделать char или const char или вообще #define STEP 0x10 чтоб память не занимать.
инит таймера из главного цикла убрать - поставить ДО while(1)
delay_ms(5000) заменить на delay_ms(1000), но поставить 5 раз а между ними разместить сброс Сторожевого таймера
Перед делеями запретить прерывания от таймера - после делеев - разрешить.
Стек увеличить - может где то в другом месте он переполняется.


--------------------
http://www.embedders.org Блоги разработчиков электроники.
Go to the top of the page
 
+Quote Post
dedded
сообщение Apr 25 2007, 12:15
Сообщение #3


Участник
*

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



Цитата(GDI @ Apr 25 2007, 20:02) *
step все равно лучше сделать char или const char или вообще #define STEP 0x10 чтоб память не занимать.
инит таймера из главного цикла убрать - поставить ДО while(1)
delay_ms(5000) заменить на delay_ms(1000), но поставить 5 раз а между ними разместить сброс Сторожевого таймера
Перед делеями запретить прерывания от таймера - после делеев - разрешить.
Стек увеличить - может где то в другом месте он переполняется.

все исправил

вот так сие выглядит
#include <mega16.h>
#include <stdio.h>

long int step_kol;
char step;

// delay functions
#include <delay.h>

interrupt [TIM0_OVF] void timer0_ovf_isr(void)
{
TCCR0 = 0x00; //stop
TCNT0=step;
step_kol++;
PORTC.0^=1;
}

void main(void){
DDRC = 255;
PORTC = 0;
TIMSK=0x3;
#asm("sei")
step=0x10;

while(1){

TCCR0 = 0x00; //stop
TCNT0 = step; //set count
TCCR0 = 0x05; //start timer

while (step_kol<1000){
#asm("wdr");
}
step_kol=0;

delay_ms(1000);
#asm("wdr");
delay_ms(1000);
#asm("wdr");
delay_ms(1000);
#asm("wdr");
delay_ms(1000);
#asm("wdr");
delay_ms(1000);
#asm("wdr");

}

}
но вот так в отладчике
в прицепе 300 кил

Нифига не понимаю совсем, нашел старый проект, он на AT90s8535 - кусок подобный, все работает, чувствую, что просто туплю.
Эскизы прикрепленных изображений
Прикрепленное изображение
 
Go to the top of the page
 
+Quote Post
aesok
сообщение Apr 25 2007, 12:33
Сообщение #4


Знающий
****

Группа: Участник
Сообщений: 596
Регистрация: 26-05-06
Из: Москва
Пользователь №: 17 484



Проанализируйте окошко "Call stack" и вот эту строку вашей программы:

TIMSK=0x3;

Анатолий.
Go to the top of the page
 
+Quote Post
dedded
сообщение Apr 25 2007, 12:52
Сообщение #5


Участник
*

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



Цитата(aesok @ Apr 25 2007, 20:33) *
Проанализируйте окошко "Call stack" и вот эту строку вашей программы:

TIMSK=0x3;

Анатолий.


TIMSK=0x1 решило все проблемы, всем спасибо за участие, особое - Анатолию, просто заработался уже, глаза мимо смотрели smile.gif
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Apr 25 2007, 15:13
Сообщение #6


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Цитата(dedded @ Apr 25 2007, 11:52) *
TIMSK=0x1 решило все проблемы, всем спасибо за участие, особое - Анатолию, просто заработался уже, глаза мимо смотрели smile.gif
А если бы вы написали
TIMSK |= (1<<TOIE0);
или даже
TIMSK |= (0<<OCIE2)|(0<<TOIE2)|(0<<TICIE1)|(0<<OCIE1A)|(0<<OCIE1B)|(0<<TOIE1)|(1<<TOIE0);
То глазам было бы сильно проще.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
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
- - dedded   Отвечу сразу всем: написано действительно криво, п...   Apr 25 2007, 11:28
|- - Валентиныч   Цитата(dedded @ Apr 25 2007, 14:28) Глупы...   Apr 25 2007, 11:31
|- - dedded   Цитата(Валентиныч @ Apr 25 2007, 19:31) Н...   Apr 25 2007, 11:54
|- - 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 Текстовая версия Сейчас: 29th July 2025 - 13:24
Рейтинг@Mail.ru


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