CodeVision AVR в вопросах и ответах
- levaclaus
- Потрогал лапой паяльник
- Сообщения: 302
- Зарегистрирован: Пн янв 07, 2008 16:56:28
- Откуда: Минск
Re: CodeVision AVR в вопросах и ответах
у кого есть CVAVR V1. 24.4 Standard , поделитесь пожалуйста
Re: CodeVision AVR в вопросах и ответах
SubDia писал(а):Ругается, потому как вначале нужно подключить хидер mega8.h:Код: Выделить всё
#include <MEGA8.H>
Файл должен находиться в папке inc CVAVR.
Спасибо , действительно помогло
- hd44780
- Встал на лапы
- Сообщения: 132
- Зарегистрирован: Вт июл 14, 2009 09:27:37
- Откуда: Донецк, Украина
Re: CodeVision AVR в вопросах и ответах
levaclaus писал(а):у кого есть CVAVR V1. 24.4 Standard , поделитесь пожалуйста
1.25.9 подойдёт? Пользуюсь давно, глюков не заметил.
- levaclaus
- Потрогал лапой паяльник
- Сообщения: 302
- Зарегистрирован: Пн янв 07, 2008 16:56:28
- Откуда: Минск
Re: CodeVision AVR в вопросах и ответах
собственно такая трабла, скинули мне проект в кодевижион. Там в проекте код в си и скомпилированный нех. Прошиваю нех в конечное устройство - устройство работает. Открываю проект в кодевижион, без каких либо изменений нажимаю "собрать", в результате получается файл нех на несколько бит меньше оригинала и конечное устройство уже не работает. (оригинал 1318 Б, новыя сборка - 1294 Б) Пробовал CodeVisionAVR v1_25_8 pro, пробовал второй кодевижион - результат один и тот же.
Отсюда вывод - несовместимость версий. Т.к. оригинальный нех из проекта прошивается и работает.
This program was produced by the
CodeWizardAVR V1.24.4 Standard
Automatic Program Generator
Отсюда вывод - несовместимость версий. Т.к. оригинальный нех из проекта прошивается и работает.
This program was produced by the
CodeWizardAVR V1.24.4 Standard
Automatic Program Generator
Re: CodeVision AVR в вопросах и ответах
levaclaus
Первым делом проверьте установки в Project->Configure->C Compiler. Что-б правильный камень был выбран, частота и т.д. Несовместимость у CVAVR обычно встречается при переходе на старые версии, наоборот я пока не встречал.
Первым делом проверьте установки в Project->Configure->C Compiler. Что-б правильный камень был выбран, частота и т.д. Несовместимость у CVAVR обычно встречается при переходе на старые версии, наоборот я пока не встречал.
- levaclaus
- Потрогал лапой паяльник
- Сообщения: 302
- Зарегистрирован: Пн янв 07, 2008 16:56:28
- Откуда: Минск
Re: CodeVision AVR в вопросах и ответах
всё правильно
2 кодевижион не понимает #pragma rl+, зато понимает #pragma ruslcd+ вот и не совместимость(
2 кодевижион не понимает #pragma rl+, зато понимает #pragma ruslcd+ вот и не совместимость(
- Alex_Megavolt_79
- Грызет канифоль
- Сообщения: 262
- Зарегистрирован: Пт окт 30, 2009 22:33:56
- Откуда: Санкт-Петербург
Re: CodeVision AVR в вопросах и ответах
levaclaus писал(а):всё правильно
2 кодевижион не понимает #pragma rl+, зато понимает #pragma ruslcd+ вот и не совместимость(
2 кодевижин вывкидывает такую ошибку если использовать #pragma ruslcd+
Warning: D:\avr\C\Clock\Clock.c(22): unknown #pragma directive
Re: CodeVision AVR в вопросах и ответах
2 кодевижион не понимает #pragma rl+, зато понимает #pragma ruslcd+ вот и не совместимость(
2 кодевижион не понимает и #pragma ruslcd+, по крайней мере с версии 2.03.
Re: CodeVision AVR в вопросах и ответах
Программа для управления модельными сервоприводами при помоши 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 в вопросах и ответах
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?Откуда компилятор это узнает?
{
current_servo=0;
TCCR3C|=(1<<FOC3C);
TCCR3C|=(1<<FOC3C);
}
else
{
current_servor++;//вот например косяк
}
[TIM3_COMPC]
А что это за прерывание таймера? вы сами придумали? у меня в студии не определяется.
Зато работает такая констукция:
ISR (TIMER3_COMPC_vect)
{ тут ваш код
}
У меня вообще код не компилируется как он у вас работает то?
что за приравнивание SERV==OFF что такое OFF?Откуда компилятор это узнает?
В поисках истины человек развивается.
Re: CodeVision AVR в вопросах и ответах
current_servor++ я накосячил при копировании сюда! в компиляторе current_servo++
Это обработчик прерывания в авр студии ISR (TIMER3_COMPC_vect)
А как для кодевижена правильно?
Это обработчик прерывания в авр студии ISR (TIMER3_COMPC_vect)
А как для кодевижена правильно?
Re: CodeVision AVR в вопросах и ответах
[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
Re: CodeVision AVR в вопросах и ответах
Може в настройках проекта чтонибуть не то стоит? Почему не правильно считает?
- Вложения
-
- 22.jpg
- (65.9 КБ) 308 скачиваний
- hd44780
- Встал на лапы
- Сообщения: 132
- Зарегистрирован: Вт июл 14, 2009 09:27:37
- Откуда: Донецк, Украина
Re: CodeVision AVR в вопросах и ответах
korbofos
В исходном проекте предполагается Mega16/32, у Вас, насколько я понял, 128-я.
И таймер Вы взяли 3-й вместо 1-го в оригинале. М.б. он инициализируется иначе.
Проверьте режимы, инициализацию таймеров и константы, которые Вы в регистры таймера вписываете. Там могут быть отличия.
Я натыкался на родственные грабли, когда переносил один проект с Mega32 на Meg162. Козлы атмеловцы какие-то биты в каких-то регистрах местами переставили ... Да и сами регистры там какие-то другие были. В итоге Mega32 засыпала нормально, а 162-я не хотела спать
. А константы и имена регистров поправил и заснула как миленькая.
Или используйте TC1, а не TC3.
Да и частота камня в оригинале 16 MHz, а у Вас 7.37.... Это тянет отличия в частоте таймера.
Я не вникал, насколько это критично для Вашего алгоритма, но проверьте все эти мелочи внимательно.
В исходном проекте предполагается Mega16/32, у Вас, насколько я понял, 128-я.
И таймер Вы взяли 3-й вместо 1-го в оригинале. М.б. он инициализируется иначе.
Проверьте режимы, инициализацию таймеров и константы, которые Вы в регистры таймера вписываете. Там могут быть отличия.
Я натыкался на родственные грабли, когда переносил один проект с Mega32 на Meg162. Козлы атмеловцы какие-то биты в каких-то регистрах местами переставили ... Да и сами регистры там какие-то другие были. В итоге Mega32 засыпала нормально, а 162-я не хотела спать
Или используйте TC1, а не TC3.
Да и частота камня в оригинале 16 MHz, а у Вас 7.37.... Это тянет отличия в частоте таймера.
Я не вникал, насколько это критично для Вашего алгоритма, но проверьте все эти мелочи внимательно.
Re: CodeVision AVR в вопросах и ответах
Таймер могу использовать только 3й- пишу под готовую плату. Да и регистры все переделал под мегу128. В протеусе всё работает, а в железе нет... 
Да и через авр студию всё работает( с небольшими переделками под неё) в железе.
Но другие куски программы не работают в авр студии. Уже месяц на этом месте застрял(((
Да и через авр студию всё работает( с небольшими переделками под неё) в железе.
Но другие куски программы не работают в авр студии. Уже месяц на этом месте застрял(((
Re: CodeVision AVR в вопросах и ответах
Код: Выделить всё
#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 в вопросах и ответах
korbofos писал(а):Нашёл косяк в переменной ocr досчитав до 64250. В седующих прерываниях её значение остаются прежним.
Это здесь, надо полагать?
ocr+=servo_position
Эта строчка странная ... Оборванная какая-то ... Оно и нескомпилируется.
korbofos писал(а):Что придумать?
Убрать её вообще
Напишите, как в оригинале OCR1A += servo_position[current_servo];
И ещё.
Декларация
void servo (unsigned char servo, unsigned int pos)
Имя переменной совпадает с именем функции ... Потенциально опасное дело.
Реализуйте оригинальный алгоритм один к одному, заменив только таймер и ноги проца и не изобретайте велосипед. А так - у Вас как-то иначе всё сделано, понять тяжело.
Я, например, вообще не знаю, что такое серводвигатель
Я тупо смотрю код и вижу массу отличий, начиная от частоты проца и заканчивая структурой всей проги.
Re: CodeVision AVR в вопросах и ответах
Всем спасибо! зло крылось в #define OCR3C (*(unsigned int *) 0x82)
В водевижене нет 16битной переменной OCR3C, есть OCR3CH, OCR3CL. Хотя в винавр есть есть 16 битная переменная OCR3C...
Вот так всё пошло)))
В водевижене нет 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 в вопросах и ответах
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); два раза повторяется?
В поисках истины человек развивается.
Re: CodeVision AVR в вопросах и ответах
всегда должна была быть строка
ocr+=servo_position[current_servo];
это я ошибся(((
ocr+=servo_position;
Повторятся строкадля "перепрыгивания" ножки Q0 на 4017 счётчике
ocr+=servo_position[current_servo];
это я ошибся(((
ocr+=servo_position;
Повторятся строка
Код: Выделить всё
TCCR3C|=(1<<FOC3C);