CodeVision AVR в вопросах и ответах

Обсуждаем контроллеры компании Atmel.
Аватара пользователя
levaclaus
Потрогал лапой паяльник
Сообщения: 302
Зарегистрирован: Пн янв 07, 2008 16:56:28
Откуда: Минск

Re: CodeVision AVR в вопросах и ответах

Сообщение levaclaus »

у кого есть CVAVR V1. 24.4 Standard , поделитесь пожалуйста
Реклама
ipf
Встал на лапы
Сообщения: 131
Зарегистрирован: Вт сен 20, 2011 18:41:41
Откуда: Вьетнам

Re: CodeVision AVR в вопросах и ответах

Сообщение ipf »

SubDia писал(а):Ругается, потому как вначале нужно подключить хидер mega8.h:

Код: Выделить всё

#include <MEGA8.H>
Файл должен находиться в папке inc CVAVR.
Спасибо , действительно помогло
Реклама
Аватара пользователя
hd44780
Встал на лапы
Сообщения: 132
Зарегистрирован: Вт июл 14, 2009 09:27:37
Откуда: Донецк, Украина

Re: CodeVision AVR в вопросах и ответах

Сообщение hd44780 »

levaclaus писал(а):у кого есть CVAVR V1. 24.4 Standard , поделитесь пожалуйста
1.25.9 подойдёт? Пользуюсь давно, глюков не заметил.
Аватара пользователя
levaclaus
Потрогал лапой паяльник
Сообщения: 302
Зарегистрирован: Пн янв 07, 2008 16:56:28
Откуда: Минск

Re: CodeVision AVR в вопросах и ответах

Сообщение levaclaus »

собственно такая трабла, скинули мне проект в кодевижион. Там в проекте код в си и скомпилированный нех. Прошиваю нех в конечное устройство - устройство работает. Открываю проект в кодевижион, без каких либо изменений нажимаю "собрать", в результате получается файл нех на несколько бит меньше оригинала и конечное устройство уже не работает. (оригинал 1318 Б, новыя сборка - 1294 Б) Пробовал CodeVisionAVR v1_25_8 pro, пробовал второй кодевижион - результат один и тот же.

Отсюда вывод - несовместимость версий. Т.к. оригинальный нех из проекта прошивается и работает.

This program was produced by the
CodeWizardAVR V1.24.4 Standard
Automatic Program Generator
Реклама
Эиком - электронные компоненты и радиодетали
Аватара пользователя
Volly
Опытный кот
Сообщения: 702
Зарегистрирован: Пт мар 06, 2009 18:22:23

Re: CodeVision AVR в вопросах и ответах

Сообщение Volly »

levaclaus
Первым делом проверьте установки в Project->Configure->C Compiler. Что-б правильный камень был выбран, частота и т.д. Несовместимость у CVAVR обычно встречается при переходе на старые версии, наоборот я пока не встречал.
Реклама
Аватара пользователя
levaclaus
Потрогал лапой паяльник
Сообщения: 302
Зарегистрирован: Пн янв 07, 2008 16:56:28
Откуда: Минск

Re: CodeVision AVR в вопросах и ответах

Сообщение levaclaus »

всё правильно

2 кодевижион не понимает #pragma rl+, зато понимает #pragma ruslcd+ вот и не совместимость(
Реклама
Аватара пользователя
Alex_Megavolt_79
Грызет канифоль
Сообщения: 262
Зарегистрирован: Пт окт 30, 2009 22:33:56
Откуда: Санкт-Петербург

Re: CodeVision AVR в вопросах и ответах

Сообщение Alex_Megavolt_79 »

levaclaus писал(а):всё правильно

2 кодевижион не понимает #pragma rl+, зато понимает #pragma ruslcd+ вот и не совместимость(
2 кодевижин вывкидывает такую ошибку если использовать #pragma ruslcd+
Warning: D:\avr\C\Clock\Clock.c(22): unknown #pragma directive
Аватара пользователя
Volly
Опытный кот
Сообщения: 702
Зарегистрирован: Пт мар 06, 2009 18:22:23

Re: CodeVision AVR в вопросах и ответах

Сообщение Volly »

2 кодевижион не понимает #pragma rl+, зато понимает #pragma ruslcd+ вот и не совместимость(
2 кодевижион не понимает и #pragma ruslcd+, по крайней мере с версии 2.03.
korbofos
Родился
Сообщения: 10
Зарегистрирован: Сб окт 15, 2011 18:04:42

Re: CodeVision AVR в вопросах и ответах

Сообщение korbofos »

Программа для управления модельными сервоприводами при помоши 4017 счётчика!
взял этот пример

Код: Выделить всё

/**
 *
 * Пример управления 9 сервами с использованием прерывания и внешнего
 * счетчика типа 4017. 
 * 
 * Предполагается, что период следования импульсов 20мс,
 * длительность импульса от 1 до 2 мс.Хотя у счетчика 10 выходов,
 * используется только 9 - десятое состояние используется для 
 * формирования паузы, доводящей период до 20мс.
 *
 * Предполагается ATMega16(32) с тактовой частотой 16 МГц. Сервы подключены
 * к выводам порта A.
 *
 * Используется 16-битный таймер, работающий на тактовой частоте процессора
 * деленной на 8, при этом разрешение 0,5 мкс. Тактовые импульсы для внешнего
 * счетчика формируются аппаратно таймером МК на выходе OC1A.
 * Добавив еще один аналогичный обработчик прерываний (по совпадению таймера
 * с регистром OCR1B), и еще один счеткик можно увеличить число серв до 18.
 * 
 * При меньшем разрешении (8мкс) можно использовать и 8-битный таймер.
 *
 **/

#include <avr/io.h>
#include <avr/interrupt.h>


/**
 * Массив, хранящий текущие положения серв. Так как период тактовых
 * импульсов таймера 500нс, то значения в этом массиве равны длительности
 * импульса в микросекундах, умноженной на 2. 3000 для среднего положения,
 * 2000 и 4000 для крайних.
 **/
uint16_t servo_position[9] = {2000, 2200, 2400, 2600, 2800, 3000, 3200, 3412 , 3600};

volatile uint32_t i;

/**
 * Прерывание от таймера
 **/

SIGNAL(SIG_OUTPUT_COMPARE1A)
{
	/* Номер сервы, для которой формируется импульс.
	 * Заметьте, что начинаем не с нуля, а с 1, так как первое прерывание
	 * также формирует тактовый импульс, который устанавливает счетчик
	 * в состояние 1.
	 */
	static uint8_t current_servo = 1;
	/**
	 * Время, необходимое для обработки всех серв, заранее неизвестно, и
	 * может быть любым от 9 до 18 мс. Для обеспечения периода импульсов
	 * 20мс, используем переменную pause. Начальное значение 40000, что
	 * соответствует 20мс. После формирования каждого импульса, переменная
	 * уменьшается на ширину сформированного импульса, и после обработки
	 * всех серв в ней остается время, оставшееся до завершения 20мс периода
	 */
	static uint16_t pause = 40000;

	/* При совпадении таймера с регистром OCR1A, помимо прерывания, МК также
	 * изменяет состояние выхода OC1A с 0 на 1, формируя таким образом фронт
	 * тактового импульса для внешнего счетчика. Чтобы по следующему срабатыванию
	 * таймера был сформирован новый фронт, принудительно сбрасываем выход OCR1A
	 */
	TCCR1A |= _BV(FOC1A);

	if (current_servo == 9) {
		/* Когда current_servo достигает 9 - значит обработаны все сервы, и
		 * нужно выдержать паузу до окончания 20мс периода */
		current_servo = 0;
		OCR1A += pause;
		pause = 40000;
	} else {
		/* current_servo от 0 до 7 - настраиваем таймер на срабатывание
		 * через время, равное ширине импульса. */
		OCR1A += servo_position[current_servo];
		/* Уменьшаем паузу  */
		pause -= servo_position[current_servo];
		/* Переходим к следующей серве */
		current_servo++;
	}
}

int main(void)
{
	/* Настраиваем используемые выводы МК на режим выхода */
	DDRD = 0x60;

	/* Формируем сигнал сброса внешнего счетчика */
	PORTD |= 0x40;
	/* Небольшая пауза перед выдачей первого импульса */
	OCR1A = 2000;

	/* Таймер в режиме простого счетчика от 0 до 0xFFFF. При совпадении таймера
	 * с регистром OCR1A состояние вывода OC1A меняется на противоположное. */
	TCCR1A = _BV(COM1A0);
	/* Предделитель тактовой частоты = 8 */
	TCCR1B = _BV(CS11);
	/* Прерывание по совпадению таймера с регистром OCR1A */
	TIMSK = _BV(OCIE1A);

	/* Освобождаем вход сброса внешнего счетчика */
	PORTD &= ~0x40;
	sei();					/* Разрешаем прерывания */

	for(;;)  {
		i++;
	}
}
Переделал для себя

Код: Выделить всё

#include <mega128.h>
#define OCR3C (*(unsigned int *) 0x82)
#define SERV (DDRE||TCCR3A||TCCR3B||ETIMSK)

unsigned int servo_position[9]={1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 7833};

interrupt [TIM3_COMPC] void timer3_compc_isr(void)
{
static unsigned char current_servo=0;
static unsigned int ocr=2000;    
ocr+=servo_position
OCR3C=ocr; 
if (current_servo==8) 
        {
         current_servo=0;
         TCCR3C|=(1<<FOC3C);
         TCCR3C|=(1<<FOC3C);
        } 
        else 
        {
         current_servor++;
        }
 TCCR3C|=(1<<FOC3C);
}   

void servo (unsigned char servo, unsigned int pos)
{
 if(SERV==OFF){servo_on();}
 if (servo>7){servo=7;}
 if (pos<50){pos=50;}
 if (pos>250){pos=250;}
servo_position[8]+=servo_position[servo];
servo_position[servo]=((pos*74/8)-5);
servo_position[8]-=servo_position[servo];
}
 
void servo_on (void)
{
DDRE|=((1<<DDE5)|(1<<DDE2));
PORTE&=~((1<<PORTE5)|(1<<PORTE2));
PORTE.2=1;
OCR3C=2000;
TCCR3A=0x04;
TCCR3B=0x02;
ETIMSK|=(1<<OCIE3C);
PORTE.2=0;
}   


void main (void)
{
servo(1,200)
}

Проблема в том что программа скомпилированная в кодевижени как-то не правильно считает, сервоприводы дёргаются ! В винавр прога работает нормально!
Где глюк искать?
Аватара пользователя
vitalik_1984
Поставщик валерьянки для Кота
Сообщения: 2482
Зарегистрирован: Пт авг 27, 2010 05:57:06
Откуда: Тюмень
Контактная информация:

Re: CodeVision AVR в вопросах и ответах

Сообщение vitalik_1984 »

if (current_servo==8)
{
current_servo=0;
TCCR3C|=(1<<FOC3C);
TCCR3C|=(1<<FOC3C);
}
else
{
current_servor++;//вот например косяк
}
[TIM3_COMPC]
А что это за прерывание таймера? вы сами придумали? у меня в студии не определяется.
Зато работает такая констукция:
ISR (TIMER3_COMPC_vect)
{ тут ваш код
}
У меня вообще код не компилируется как он у вас работает то?
что за приравнивание SERV==OFF что такое OFF?Откуда компилятор это узнает?
В поисках истины человек развивается.
korbofos
Родился
Сообщения: 10
Зарегистрирован: Сб окт 15, 2011 18:04:42

Re: CodeVision AVR в вопросах и ответах

Сообщение korbofos »

current_servor++ я накосячил при копировании сюда! в компиляторе current_servo++
Это обработчик прерывания в авр студии ISR (TIMER3_COMPC_vect)
А как для кодевижена правильно?
korbofos
Родился
Сообщения: 10
Зарегистрирован: Сб окт 15, 2011 18:04:42

Re: CodeVision AVR в вопросах и ответах

Сообщение korbofos »

[TIM3_COMPC]
А что это за прерывание таймера? вы сами придумали?
Вот обработчик прерывания сгенерированный Code Wizard'ом.

Код: Выделить всё

// Timer3 output compare C interrupt service routine
interrupt [TIM3_COMPC] void timer3_compc_isr(void)
{
// Place your code here

}
SERV==OFF

Код: Выделить всё

#define OFF 0
korbofos
Родился
Сообщения: 10
Зарегистрирован: Сб окт 15, 2011 18:04:42

Re: CodeVision AVR в вопросах и ответах

Сообщение korbofos »

Може в настройках проекта чтонибуть не то стоит? Почему не правильно считает?
Вложения
22.jpg
(65.9 КБ) 309 скачиваний
Аватара пользователя
hd44780
Встал на лапы
Сообщения: 132
Зарегистрирован: Вт июл 14, 2009 09:27:37
Откуда: Донецк, Украина

Re: CodeVision AVR в вопросах и ответах

Сообщение hd44780 »

korbofos
В исходном проекте предполагается Mega16/32, у Вас, насколько я понял, 128-я.
И таймер Вы взяли 3-й вместо 1-го в оригинале. М.б. он инициализируется иначе.
Проверьте режимы, инициализацию таймеров и константы, которые Вы в регистры таймера вписываете. Там могут быть отличия.

Я натыкался на родственные грабли, когда переносил один проект с Mega32 на Meg162. Козлы атмеловцы какие-то биты в каких-то регистрах местами переставили ... Да и сами регистры там какие-то другие были. В итоге Mega32 засыпала нормально, а 162-я не хотела спать :)) . А константы и имена регистров поправил и заснула как миленькая.

Или используйте TC1, а не TC3.

Да и частота камня в оригинале 16 MHz, а у Вас 7.37.... Это тянет отличия в частоте таймера.
Я не вникал, насколько это критично для Вашего алгоритма, но проверьте все эти мелочи внимательно.
korbofos
Родился
Сообщения: 10
Зарегистрирован: Сб окт 15, 2011 18:04:42

Re: CodeVision AVR в вопросах и ответах

Сообщение korbofos »

Таймер могу использовать только 3й- пишу под готовую плату. Да и регистры все переделал под мегу128. В протеусе всё работает, а в железе нет... :(
Да и через авр студию всё работает( с небольшими переделками под неё) в железе.
Но другие куски программы не работают в авр студии. Уже месяц на этом месте застрял(((
korbofos
Родился
Сообщения: 10
Зарегистрирован: Сб окт 15, 2011 18:04:42

Re: CodeVision AVR в вопросах и ответах

Сообщение korbofos »

Код: Выделить всё

#define OCR3C (*(unsigned int *) 0x82)

interrupt [TIM3_COMPC] void timer3_compc_isr(void)
{
static unsigned char current_servo=0;
static unsigned int ocr=2000;    
ocr+=servo_position
OCR3C=ocr; 
if (current_servo==8) 
        {
         current_servo=0;
         TCCR3C|=(1<<FOC3C);
         TCCR3C|=(1<<FOC3C);
        } 
        else 
        {
         current_servor++;
        }
TCCR3C|=(1<<FOC3C);
}   
Нашёл косяк в переменной ocr досчитав до 64250. В седующих прерываниях её значение остаются прежним.
Что придумать?
Аватара пользователя
hd44780
Встал на лапы
Сообщения: 132
Зарегистрирован: Вт июл 14, 2009 09:27:37
Откуда: Донецк, Украина

Re: CodeVision AVR в вопросах и ответах

Сообщение hd44780 »

korbofos писал(а):Нашёл косяк в переменной ocr досчитав до 64250. В седующих прерываниях её значение остаются прежним.
Это здесь, надо полагать?

ocr+=servo_position

Эта строчка странная ... Оборванная какая-то ... Оно и нескомпилируется.
korbofos писал(а):Что придумать?
Убрать её вообще :)) . Зачем Вы ввели эту переменную?
Напишите, как в оригинале OCR1A += servo_position[current_servo];

И ещё.

Декларация
void servo (unsigned char servo, unsigned int pos)

Имя переменной совпадает с именем функции ... Потенциально опасное дело.

Реализуйте оригинальный алгоритм один к одному, заменив только таймер и ноги проца и не изобретайте велосипед. А так - у Вас как-то иначе всё сделано, понять тяжело.

Я, например, вообще не знаю, что такое серводвигатель :)) , не говоря уж о том, как им надо управлять.
Я тупо смотрю код и вижу массу отличий, начиная от частоты проца и заканчивая структурой всей проги.
korbofos
Родился
Сообщения: 10
Зарегистрирован: Сб окт 15, 2011 18:04:42

Re: CodeVision AVR в вопросах и ответах

Сообщение korbofos »

Всем спасибо! зло крылось в #define OCR3C (*(unsigned int *) 0x82)
В водевижене нет 16битной переменной OCR3C, есть OCR3CH, OCR3CL. Хотя в винавр есть есть 16 битная переменная OCR3C...
Вот так всё пошло)))

Код: Выделить всё

interrupt [TIM3_COMPC] void timer3_compc_isr(void)
{
static unsigned char current_servo=0;
static unsigned int ocr=2000;    
ocr+=servo_position[current_servo];
OCR3CH=(unsigned char)(ocr>>8);
OCR3CL=(unsigned char)ocr;
if (current_servo==8) 
        {
         current_servo=0;
         TCCR3C|=(1<<FOC3C);
         TCCR3C|=(1<<FOC3C);
        } 
        else 
        {
         current_servo++;
        }
 TCCR3C|=(1<<FOC3C);
}     
Аватара пользователя
vitalik_1984
Поставщик валерьянки для Кота
Сообщения: 2482
Зарегистрирован: Пт авг 27, 2010 05:57:06
Откуда: Тюмень
Контактная информация:

Re: CodeVision AVR в вопросах и ответах

Сообщение vitalik_1984 »

korbofos писал(а):Всем спасибо! зло крылось в #define OCR3C (*(unsigned int *) 0x82)
В водевижене нет 16битной переменной OCR3C, есть OCR3CH, OCR3CL. Хотя в винавр есть есть 16 битная переменная OCR3C...
Вот так всё пошло)))

Код: Выделить всё

interrupt [TIM3_COMPC] void timer3_compc_isr(void)
{
static unsigned char current_servo=0;
static unsigned int ocr=2000;    
ocr+=servo_position[current_servo];
OCR3CH=(unsigned char)(ocr>>8);
OCR3CL=(unsigned char)ocr;
if (current_servo==8) 
        {
         current_servo=0;
         TCCR3C|=(1<<FOC3C);
         TCCR3C|=(1<<FOC3C);
        } 
        else 
        {
         current_servo++;
        }
 TCCR3C|=(1<<FOC3C);
}     
Конечно

Код: Выделить всё

ocr+=servo_position[current_servo];
и

Код: Выделить всё

ocr+=servo_position;
так то разные строки.Пихать указатель вместо переменной как то некрасиво.

Код: Выделить всё

ocr+=servo_position;
Компилятор в ответ:
Warning 1 assignment makes integer from pointer without a cast

А почему у вас строка TCCR3C|=(1<<FOC3C); два раза повторяется?
В поисках истины человек развивается.
korbofos
Родился
Сообщения: 10
Зарегистрирован: Сб окт 15, 2011 18:04:42

Re: CodeVision AVR в вопросах и ответах

Сообщение korbofos »

всегда должна была быть строка
ocr+=servo_position[current_servo];
это я ошибся(((
ocr+=servo_position;
Повторятся строка

Код: Выделить всё

TCCR3C|=(1<<FOC3C);
для "перепрыгивания" ножки Q0 на 4017 счётчике
Ответить

Вернуться в «AVR»