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

 
 
> Постоянные изменения OCR0., Некорректная запись в этот регистр.
Александр К.
сообщение Oct 28 2010, 17:39
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 28
Регистрация: 12-11-06
Из: Волгоград
Пользователь №: 22 235



Есть потребность непрерывно перезаписывать в Меге 16 OCRO. Можно ли это делать? Дело в том, что на практике запись идёт с ошибками.

CODE
// Timer 0 output compare interrupt service routine
interrupt [TIM0_COMP] void timer0_comp_isr(void)
{
if ((!PINB.3) && (!flag_s_eep))
{
flag_s=1; // Разрешение записи
PORTD.5=0; // Индикация записи - включить СД
}


if(!flag_start)
{
flag_start=1;
TCNT1=0;
TCNT0=0;
OCR0=1;
t_zub=0;
return;
}

if(!flag_zub1) // Поиск 1-го зуба
{
t_zub0=t_zub;
t_zub=TCNT1;
TCNT1=0;
if((t_zub > (t_zub0 + (t_zub0>>1))) && (t_zub0))
{
flag_zub1=1;
t_zub4=0;
OCR0=5;
}
else TCNT0=0;
return;
}

switch (OCR0)
{
case 1:
t_zub1=TCNT1;
t_zub0=t_zub;
t_zub=t_zub1-t_zub29;

if(t_zub < (t_zub0 + (t_zub0>>1)))
{
//PORTD.5=0; // Индикация потери синхронизации
}
//else PORTD.5=1;

if((i_zub < i_zub_max) && (flag_s))
{
t_zub_i[i_zub++]=1;
t_zub_i[i_zub++]=t_zub;
}
OCR0=2;
break;

case 2:
t_zub2=TCNT1;
t_zub=t_zub2-t_zub1;
if((i_zub < i_zub_max) && (flag_s))
{
t_zub_i[i_zub++]=2;
t_zub_i[i_zub++]=t_zub;
}
OCR0=3;
break;

case 3:
t_zub3=TCNT1;
t_zub=t_zub3-t_zub2;
if((i_zub < i_zub_max) && (flag_s))
{
t_zub_i[i_zub++]=3;
t_zub_i[i_zub++]=t_zub;
}
OCR0=4;
break;

case 4:
t_zub4=TCNT1;
t_zub=t_zub4-t_zub3;
if((i_zub < i_zub_max) && (flag_s))
{
t_zub_i[i_zub++]=4;
t_zub_i[i_zub++]=t_zub;
}
OCR0=5;
break;

case 5:
t_zub5=TCNT1;
TCNT1=0;
t_zub=t_zub5-t_zub4;
if((t_zub5)&&(t_zub4)) // При t_zub4=0 нет данных
{ // о времени полуоборота
n=7500000/t_zub5;
if(n > 600) flag_pusk=1; // Запуск двигателя произведён.
flag_pper=1;
}
if((i_zub < i_zub_max) && (flag_s) && (t_zub4))
{
t_zub_i[i_zub++]=5;
t_zub_i[i_zub++]=t_zub;
}
OCR0=6;
break;

case 6:
t_zub6=TCNT1;
t_zub=t_zub6;
if((i_zub < i_zub_max) && (flag_s))
{
t_zub_i[i_zub++]=6;
t_zub_i[i_zub++]=t_zub;
}
OCR0=7;
break;

case 7:
t_zub7=TCNT1;
t_zub=t_zub7-t_zub6;
if((i_zub < i_zub_max) && (flag_s))
{
t_zub_i[i_zub++]=7;
t_zub_i[i_zub++]=t_zub;
}
OCR0=8;
break;

case 8:
t_zub8=TCNT1;
t_zub=t_zub8-t_zub7;
if((i_zub < i_zub_max) && (flag_s))
{
t_zub_i[i_zub++]=8;
t_zub_i[i_zub++]=t_zub;
}
OCR0=9;
break;

case 9:
t_zub9=TCNT1;
t_zub=t_zub9-t_zub8;
if((i_zub < i_zub_max) && (flag_s))
{
t_zub_i[i_zub++]=9;
t_zub_i[i_zub++]=t_zub;
}
OCR0=10;
break;

case 10:
t_zub10=TCNT1;
t_zub=t_zub10-t_zub9;
if((i_zub < i_zub_max) && (flag_s))
{
t_zub_i[i_zub++]=10;
t_zub_i[i_zub++]=t_zub;
}
OCR0=11;
break;


case 11:
t_zub11=TCNT1;
t_zub=t_zub11-t_zub10;
if((i_zub < i_zub_max) && (flag_s))
{
t_zub_i[i_zub++]=11;
t_zub_i[i_zub++]=t_zub;
}
OCR0=12;
break;

case 12:
t_zub12=TCNT1;
t_zub=t_zub12-t_zub11;
if((i_zub < i_zub_max) && (flag_s))
{
t_zub_i[i_zub++]=12;
t_zub_i[i_zub++]=t_zub;
}
OCR0=13;
break;

case 13:
t_zub13=TCNT1;
t_zub=t_zub13-t_zub12;
if((i_zub < i_zub_max) && (flag_s))
{
t_zub_i[i_zub++]=13;
t_zub_i[i_zub++]=t_zub;
}
OCR0=14;
break;

case 14:
t_zub14=TCNT1;
t_zub=t_zub14-t_zub13;
if((i_zub < i_zub_max) && (flag_s))
{
t_zub_i[i_zub++]=14;
t_zub_i[i_zub++]=t_zub;
}
OCR0=15;
break;

case 15:
t_zub15=TCNT1;
t_zub=t_zub15-t_zub14;
if((i_zub < i_zub_max) && (flag_s))
{
t_zub_i[i_zub++]=15;
t_zub_i[i_zub++]=t_zub;
}
OCR0=16;
break;

case 16:
t_zub16=TCNT1;
t_zub=t_zub16-t_zub15;
if((i_zub < i_zub_max) && (flag_s))
{
t_zub_i[i_zub++]=16;
t_zub_i[i_zub++]=t_zub;
}
OCR0=17;
break;

case 17:
t_zub17=TCNT1;
t_zub=t_zub17-t_zub16;
if((i_zub < i_zub_max) && (flag_s))
{
t_zub_i[i_zub++]=17;
t_zub_i[i_zub++]=t_zub;
}
OCR0=18;
break;

case 18:
t_zub18=TCNT1;
t_zub=t_zub18-t_zub17;
if((i_zub < i_zub_max) && (flag_s))
{
t_zub_i[i_zub++]=18;
t_zub_i[i_zub++]=t_zub;
}
OCR0=19;
break;

case 19:
t_zub19=TCNT1;
t_zub=t_zub19-t_zub18;
if((i_zub < i_zub_max) && (flag_s))
{
t_zub_i[i_zub++]=19;
t_zub_i[i_zub++]=t_zub;
}
OCR0=20;
break;

case 20:
t_zub20=TCNT1;
TCNT1=0;
t_zub=t_zub20-t_zub19;
if(t_zub20) n=7500000/t_zub20;
if(n > 600) flag_pusk=1; // Запуск двигателя произведён.
flag_pper=1;
if((i_zub < i_zub_max) && (flag_s))
{
t_zub_i[i_zub++]=20;
t_zub_i[i_zub++]=t_zub;
}
OCR0=21;
break;

case 21:
t_zub21=TCNT1;
t_zub=t_zub21;
if((i_zub < i_zub_max) && (flag_s))
{
t_zub_i[i_zub++]=21;
t_zub_i[i_zub++]=t_zub;
}
OCR0=22;
break;

case 22:
t_zub22=TCNT1;
t_zub=t_zub22-t_zub21;
if((i_zub < i_zub_max) && (flag_s))
{
t_zub_i[i_zub++]=22;
t_zub_i[i_zub++]=t_zub;
}
OCR0=23;
break;

case 23:
t_zub23=TCNT1;
t_zub=t_zub23-t_zub22;
if((i_zub < i_zub_max) && (flag_s))
{
t_zub_i[i_zub++]=23;
t_zub_i[i_zub++]=t_zub;
}
OCR0=24;
break;

case 24:
t_zub24=TCNT1;
t_zub=t_zub24-t_zub23;
if((i_zub < i_zub_max) && (flag_s))
{
t_zub_i[i_zub++]=24;
t_zub_i[i_zub++]=t_zub;
}
OCR0=25;
break;

case 25:
t_zub25=TCNT1;
t_zub=t_zub25-t_zub24;
if((i_zub < i_zub_max) && (flag_s))
{
t_zub_i[i_zub++]=25;
t_zub_i[i_zub++]=t_zub;
}
OCR0=26;
break;

case 26:
t_zub26=TCNT1;
t_zub=t_zub26-t_zub25;
if((i_zub < i_zub_max) && (flag_s))
{
t_zub_i[i_zub++]=26;
t_zub_i[i_zub++]=t_zub;
}
OCR0=27;
break;

case 27:
t_zub27=TCNT1;
t_zub=t_zub27-t_zub26;
if((i_zub < i_zub_max) && (flag_s))
{
t_zub_i[i_zub++]=27;
t_zub_i[i_zub++]=t_zub;
}
OCR0=28;
break;

case 28:
t_zub28=TCNT1;
t_zub=t_zub28-t_zub27;
if((i_zub < i_zub_max) && (flag_s))
{
t_zub_i[i_zub++]=28;
t_zub_i[i_zub++]=t_zub;
}
OCR0=29;
break;

case 29:
t_zub29=TCNT1;
t_zub=t_zub29-t_zub28;
if((i_zub < i_zub_max) && (flag_s))
{
t_zub_i[i_zub++]=29;
t_zub_i[i_zub++]=t_zub;
}
OCR0=1;
TCNT0=0;
break;

} //Скобка switch

}


Фрагмент массива t_zub_i : 001D 0A0A 0022 C44F 0003 01AD 0003 01A7 0004 01A0 0005 0359...
В этом массиве нечётные "слова" должны увеличиваться на единицу до 29 включительно, затем опять начинаться с единицы. Но в реальности этого гарантированно нет. Почему?

Сообщение отредактировал Александр К. - Oct 28 2010, 18:37
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
SasaVitebsk
сообщение Oct 28 2010, 18:56
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 2 712
Регистрация: 28-11-05
Из: Беларусь, Витебск, Строителей 18-4-220
Пользователь №: 11 521



При записи в OCR регистр, значение обновляется после завершения периода. Не смотрел текст, так как очень большой. Но принципиально, всё должно работать. Обновлять надо по TOV.
Go to the top of the page
 
+Quote Post
Александр К.
сообщение Oct 28 2010, 19:15
Сообщение #3


Участник
*

Группа: Участник
Сообщений: 28
Регистрация: 12-11-06
Из: Волгоград
Пользователь №: 22 235



Цитата(_Pasha @ Oct 28 2010, 22:56) *
2. Тем более непонятно, какая часть прерывания ее должна перевзводить обратно, после фрагмента case 29: ....

Эта:
Код
case 29:
   ...
   OCR0=1;
   TCNT0=0;
   ...

На п.1. Какая разница? Если можно, поясните.

Цитата(SasaVitebsk @ Oct 28 2010, 22:56) *
...Обновлять надо по TOV.

Это как?
И где завершается период - при начале следующего? Может, в этом проблема?

Сообщение отредактировал Александр К. - Oct 28 2010, 19:16
Go to the top of the page
 
+Quote Post
SasaVitebsk
сообщение Oct 29 2010, 06:11
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 2 712
Регистрация: 28-11-05
Из: Беларусь, Витебск, Строителей 18-4-220
Пользователь №: 11 521



Цитата(Александр К. @ Oct 28 2010, 22:15) *
Это как?
И где завершается период - при начале следующего? Может, в этом проблема?

Например

OC25 I W20 OC25 I W15 OC20 I ....
Где I - прерывание, W - запись значения в OCR, OC - текущая отработка.

То есть у вас идёт запаздывание. Что вы читаете из OCR я не знаю - не пробовал. Но возможно у вас во всей этой логике и кроется ошибка. Обычно вывод осуществляется по таблице. Иными словами вы же и так знаете, что туда пишите. Так зачем ненужная обратная связь? Расчитывайте исходя из значений, что пишете.
Go to the top of the page
 
+Quote Post
Александр К.
сообщение Oct 29 2010, 10:51
Сообщение #5


Участник
*

Группа: Участник
Сообщений: 28
Регистрация: 12-11-06
Из: Волгоград
Пользователь №: 22 235



Спасибо. Попробую изменить код.
Go to the top of the page
 
+Quote Post
Александр К.
сообщение Nov 6 2010, 11:52
Сообщение #6


Участник
*

Группа: Участник
Сообщений: 28
Регистрация: 12-11-06
Из: Волгоград
Пользователь №: 22 235



Я нашёл, где косяк. CodeVisionAVR не может выполнить такой код:

Код
while((i_zub < i_zub_max) && (flag_s))
         {
          t_zub_i[i_zub++]=0x1234;
         }

Разумеется, сообщений об ошибках нет.
Т.е. индекс массива не может быть задан как переменная? Или элементы массива по одиночке нельзя переопределять?

Как это можно обойти?
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Nov 8 2010, 09:30
Сообщение #7


Гуру
******

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



Цитата(Александр К. @ Nov 6 2010, 13:52) *
CodeVisionAVR не может выполнить такой код:
Исключительно информативно. А что означает в вашем понятии "не может выполнить код"?


--------------------
На любой вопрос даю любой ответ
"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
Александр К.
сообщение Nov 9 2010, 10:07
Сообщение #8


Участник
*

Группа: Участник
Сообщений: 28
Регистрация: 12-11-06
Из: Волгоград
Пользователь №: 22 235



Если массив определить вот так: unsigned int t_zub_i[], то в него ничего не пишется (или пишется непонятно что), хотя и ошибок при компиляции никаких не показывается. Обошёл просто: unsigned int t_zub_i[96]. Т.е. при явном задании числа элементов массива всё заработало.
Go to the top of the page
 
+Quote Post
MrYuran
сообщение Nov 9 2010, 10:15
Сообщение #9


Беспросветный оптимист
******

Группа: Свой
Сообщений: 4 640
Регистрация: 26-12-07
Из: Н.Новгород
Пользователь №: 33 646



Цитата(Александр К. @ Nov 9 2010, 13:07) *
Если массив определить вот так: unsigned int t_zub_i[], то в него ничего не пишется (или пишется непонятно что)

Скорее, пишется непонятно куда, т.к. массив задан нулевой длины
Ну и соответственно там, непонятно где, произвольно изменяется непонятно чем.


--------------------
Программирование делится на системное и бессистемное. ©Моё :)
— а для кого-то БГ — это Bill Gilbert =)
Go to the top of the page
 
+Quote Post
Александр К.
сообщение Nov 9 2010, 13:10
Сообщение #10


Участник
*

Группа: Участник
Сообщений: 28
Регистрация: 12-11-06
Из: Волгоград
Пользователь №: 22 235



По описанию CodeVision это вроде допускается - не указывать длинну. Сам должен подсчитать smile.gif .
Go to the top of the page
 
+Quote Post
Палыч
сообщение Nov 9 2010, 15:07
Сообщение #11


Гуру
******

Группа: Свой
Сообщений: 2 399
Регистрация: 10-05-06
Из: г. Новочеркасск
Пользователь №: 16 954



Цитата(Александр К. @ Nov 9 2010, 16:10) *
Сам должен подсчитать.
IMHO, сам подсчитает, если есть начальная инициализация:
Код
unsigned int t_zub_i[]= {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
В остальных случаях, размер массива определить должны Вы.
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- Александр К.   Постоянные изменения OCR0.   Oct 28 2010, 17:39
- - _Pasha   А ничего, что у Вас изменение сабжа сильно джиттер...   Oct 28 2010, 18:10
|- - Александр К.   Цитата(_Pasha @ Oct 28 2010, 22:10) А нич...   Oct 28 2010, 18:36
|- - _Pasha   Цитата(Александр К. @ Oct 28 2010, 21:36)...   Oct 28 2010, 18:56
- - _Pasha   Цитата(Александр К. @ Oct 28 2010, 22:15)...   Oct 28 2010, 19:25
|- - Александр К.   Цитата(_Pasha @ Oct 28 2010, 23:25) ...По...   Oct 28 2010, 19:30
|- - _Pasha   Цитата(Александр К. @ Oct 28 2010, 22:30)...   Oct 28 2010, 20:41
|- - Александр К.   Цитата(_Pasha @ Oct 29 2010, 00:41) Там п...   Oct 29 2010, 04:29
|- - _Pasha   Цитата(Александр К. @ Oct 29 2010, 07:29)...   Oct 29 2010, 05:37
|- - Александр К.   Цитата(_Pasha @ Oct 29 2010, 09:37) Тогда...   Oct 29 2010, 05:58
- - MrYuran   Цитата(Александр К. @ Nov 9 2010, 16:10) ...   Nov 9 2010, 13:24


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

 


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


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