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 КБ) 308 скачиваний
Аватара пользователя
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»