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

 
 
 
Reply to this topicStart new topic
> организация задержки, не пойму в чем дело
alux
сообщение Jun 8 2007, 20:09
Сообщение #1


Знающий
****

Группа: Свой
Сообщений: 589
Регистрация: 24-04-05
Пользователь №: 4 447



Обычно для входа в нужный режим использую длинное (5сек) нажатие на кнопку. Обычно я делаю так:
//Глобальные переменные
unsigned char pause; //счетчик паузы удержания кнопки

#pragma vector=TIMER0_COMPA_vect
__interrupt void TC0_COMPA_ISR(void)
{
if(!(PIND&(1<<PROG))) //если нажата кнопка "PROG"...
{
if(++pause > 250) //более 10ms*250=2.5сек
{
PINC |= (1<<LED1);
Flags |= EDIT;
pause = 0; //обнулить счетчик паузы
}
......
}

//////////////////
//Timer0 initialisation:
TCCR0A=(1<<WGM01); //Сброс таймера при совпадении
TCCR0B=(0<<CS02)|(1<<CS00); //Prescaler = CLK/1024
OCR0A=194; //Обработчик прерывания таймера0 вызывается через 10 мс
TIFR0 = TIFR0; // Clear TC0 interrupt flags
TIMSK0=(1<<OCIE0A); //Разрешить прерывания по совпадению COMPA

... и всегда работало без проблем на максимальной оптимизации по размеру. Компилятор IAR 4.12A.
Этот же пример на том же контроллере и на том же компиляторе в новом проекте не удается создать задержку в 3 сек. Вернее работает, если pause сделать unsigned int и инкрементировать до порядка 65000. Пробовал ставить модификатор volatile. Не помогает. В чем же дело?

Сообщение отредактировал alux - Jun 8 2007, 20:15
Go to the top of the page
 
+Quote Post
arttab
сообщение Jun 9 2007, 01:32
Сообщение #2


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

Группа: Свой
Сообщений: 1 432
Регистрация: 7-12-04
Из: Новосибирск
Пользователь №: 1 371



Если помогает
Цитата
unsigned int
, то скорее всего, идет сбой в счете.

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


--------------------
OrCAD, Altium,IAR, AVR....
Go to the top of the page
 
+Quote Post
alux
сообщение Jun 9 2007, 07:02
Сообщение #3


Знающий
****

Группа: Свой
Сообщений: 589
Регистрация: 24-04-05
Пользователь №: 4 447



Цитата(arttab @ Jun 9 2007, 04:32) *
Если писали для одного и того же мк, то могли часть настройки не перенести из предыдущего проекта, а раньше переносили и все работало.
Очень желательно указывать тип мк.

МК Мега48. Обычно я открываю старый проект, сохраняю под новым именем, удаляю все лишнее, опции компилятора ставлю такие же, линкеру указываю на скопированный в новую директорию тот же файл. Старый проект тоже работал от своего .xcl - файла.
Вот кусок листинга:
108 if(++pause > 250) //â òå÷åíèè 10ms*250=2.5ñåê, òî
\ 00000026 8503 LDD R16, Z+11
\ 00000028 9503 INC R16
\ 0000002A 8703 STD Z+11, R16
\ 0000002C 8502 LDD R16, Z+10
\ 0000002E 8513 LDD R17, Z+11
\ 00000030 3F1B CPI R17, 251
\ 00000032 F0E0 BRCS ??TC0_COMPA_ISR_1
Симулирую в AVRStudio. Все идет по программе. А реально задержки не происходит. Я понимаю, что подобный вопрос уже обсуждался в разных вариациях. Прошу мне помочь в конкретном примере.
Go to the top of the page
 
+Quote Post
Dog Pawlowa
сообщение Jun 9 2007, 07:44
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 2 702
Регистрация: 14-07-06
Пользователь №: 18 823



Цитата(alux @ Jun 9 2007, 10:02) *
Прошу мне помочь в конкретном примере.

Как помочь - даже и не знаю, но сам в таких случаях проверяю период прерывания осциллографом.


--------------------
Уходя, оставьте свет...
Go to the top of the page
 
+Quote Post
alux
сообщение Jun 9 2007, 08:43
Сообщение #5


Знающий
****

Группа: Свой
Сообщений: 589
Регистрация: 24-04-05
Пользователь №: 4 447



Цитата(Dog Pawlowa @ Jun 9 2007, 10:44) *
Как помочь - даже и не знаю, но сам в таких случаях проверяю период прерывания осциллографом.

А что, может быть такое, что компилятор "оптимизировал" период прерывания?
Go to the top of the page
 
+Quote Post
singlskv
сообщение Jun 9 2007, 09:02
Сообщение #6


дятел
*****

Группа: Свой
Сообщений: 1 681
Регистрация: 13-05-06
Из: Питер
Пользователь №: 17 065



Цитата(alux @ Jun 9 2007, 00:09) *
Обычно для входа в нужный режим использую длинное (5сек) нажатие на кнопку. Обычно я делаю так:
//Глобальные переменные
unsigned char pause; //счетчик паузы удержания кнопки
................
if(++pause > 250) //более 10ms*250=2.5сек
..............

Этот же пример на том же контроллере и на том же компиляторе в новом проекте не удается создать задержку в 3 сек.

Эээ...
А как Вы пытаетесь сделать 3сек ? случайно не вот так ?
if(++pause > 300) //более 10ms*300=3сек

unsigned char считает только до 255 smile.gif
Go to the top of the page
 
+Quote Post
alux
сообщение Jun 9 2007, 10:31
Сообщение #7


Знающий
****

Группа: Свой
Сообщений: 589
Регистрация: 24-04-05
Пользователь №: 4 447



Цитата(singlskv @ Jun 9 2007, 12:02) *
Эээ...
А как Вы пытаетесь сделать 3сек ? случайно не вот так ?
if(++pause > 300) //более 10ms*300=3сек

unsigned char считает только до 255 smile.gif

Я же показал пример. Там счет идет до 250. Мне бы хватило и 2,5сек. Но проблема в том, что задержки нет совсем. Даже доли сек. Тоько если ,как я уже говорил, сделать unsgned int и считать до 65535, и то задержка составит около 2сек. Я читал о "прихотях" компилятора. Но до сих пор мы с ним ладили, и таких проблем не было... Теперь это коснулось и меня sad.gif


Прошу прощения за мою невнимательность. При отладке забыл вернуть на место предделитель в старом проекте. И так оно попало в новый проект. smile.gif Всем спасибо. Тему можно удалить, если можно.
//Timer0 initialisation:
TCCR0A=(1<<WGM01); //Ñáðîñ òàéìåðà ïðè ñîâïàäåíèè
>>>>!!! TCCR0B=(0<<CS02)|(1<<CS00); //Prescaler = CLK/1024
OCR0A=194; //Îáðàáîò÷èê ïðåðûâàíèÿ òàéìåðà0 âûçûâàåòñÿ ÷åðåç 10 ìñ
TIFR0 = TIFR0; // Clear TC0 interrupt flags
TIMSK0=(1<<OCIE0A); //Ðàçðåøèòü ïðåðûâàíèÿ ïî ñîâïàäåíèþ COMPA
Go to the top of the page
 
+Quote Post
zltigo
сообщение Jun 9 2007, 11:00
Сообщение #8


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



Цитата(alux @ Jun 9 2007, 13:31) *
Я читал о "прихотях" компилятора. Но до сих пор мы с ним ладили, и таких проблем не было... Теперь это коснулось и меня sad.gif

Надеюсь smile.gif, что после этих разборок Вы станете меньше слушать чрезмерно расплодившиеся байки о "прихотях компиляторов"!!!
По этой причине тему удалять совершенно не стоит.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 19th June 2025 - 07:07
Рейтинг@Mail.ru


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