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

Участник

Группа: Свой
Сообщений: 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); сюда не доходит } }
кусок выдрал аккуратно вроде, точнее заново оформил что же я не так делаю?
|
|
|
|
|
 |
Ответов
|
Apr 25 2007, 12:15
|

Участник

Группа: Свой
Сообщений: 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 - кусок подобный, все работает, чувствую, что просто туплю.
Эскизы прикрепленных изображений
|
|
|
|
|
Apr 25 2007, 12:52
|

Участник

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

|
Цитата(aesok @ Apr 25 2007, 20:33)  Проанализируйте окошко "Call stack" и вот эту строку вашей программы:
TIMSK=0x3;
Анатолий. TIMSK=0x1 решило все проблемы, всем спасибо за участие, особое - Анатолию, просто заработался уже, глаза мимо смотрели
|
|
|
|
|
Apr 25 2007, 15:13
|

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

|
Цитата(dedded @ Apr 25 2007, 11:52)  TIMSK=0x1 решило все проблемы, всем спасибо за участие, особое - Анатолию, просто заработался уже, глаза мимо смотрели  А если бы вы написали 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)
|
|
|
|
Сообщений в этой теме
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
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|