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

Обсуждаем контроллеры компании Atmel.
Аватара пользователя
Apparatchik
Держит паяльник хвостом
Сообщения: 908
Зарегистрирован: Вс май 23, 2010 13:55:42
Откуда: Украина, Александрия

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

Сообщение Apparatchik »

mr4ester писал(а):исправил вот этот оператор

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

unsigned int i;
for(i=0; i<1024; i++)
он все равно не ругается на то что я не объявил Error: D:\cvavr\zamok\zamok 2.c(246): must declare first in block

В CVAVR переменную нужно объявлять в начале функции или глобально, где вздумается некатит (по крайней мере в той версии, что я пользовался).
«И всё-таки она вертится!»
Sergi
Мучитель микросхем
Сообщения: 412
Зарегистрирован: Ср янв 04, 2012 11:57:40
Откуда: Алчевск

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

Сообщение Sergi »

Вроде бы CVAVR требует явного указания параметров для функций.
Попробуйте void CheckSensors(void) вместо void CheckSensors()
Аватара пользователя
unalex
Мучитель микросхем
Сообщения: 424
Зарегистрирован: Сб авг 25, 2007 22:02:05
Откуда: Германия, Viernheim

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

Сообщение unalex »

разложение числа на единицы, десятки...

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

void decodeValue(int value);
int power10(unsigned char power);

int main()
{
   decodeValue(1234);

   return 0;
}
//Декодируем
void decodeValue(int value)
{
   int Value[4];

   for (unsigned char i = 0; i < 4; i++)
   {
      Value[i] = (value / power10(i)) % 10;
   }
}

//Считаем степень десятки(можно стандартной функцией, но нужно привести к int)
int power10(unsigned char power)
{
   if (!power)
      return 1;
   else
      return 10 * power10(power - 1);
}
Коктейль "Рекурсивный": 20% спирта, 30% воды, 50% коктейля "Рекурсивный"...
Аватара пользователя
vitalik_1984
Поставщик валерьянки для Кота
Сообщения: 2482
Зарегистрирован: Пт авг 27, 2010 05:57:06
Откуда: Тюмень
Контактная информация:

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

Сообщение vitalik_1984 »

mr4ester писал(а):он все равно не ругается на то что я не объявил Error: D:\cvavr\zamok\zamok 2.c(246): must declare first in block, и еще одна ошибка, скорее наверно что я плохо синтаксис языка знаю, есть функция опроса сенсоров, вообщем вот она чтоб не возникало недопонимания
Код:

Вообще в си есть три этапа использования функции
1.объявление
2.описание
3.использование

Можно совместить объявление с описанием.
Вы объявление функции не сделали, и уже вызываете её.
Блок описания переместите выше, чем первый вызов функции и все будет ок.
Либо все по правилам объявляйте.
Аватара пользователя
unalex
Мучитель микросхем
Сообщения: 424
Зарегистрирован: Сб авг 25, 2007 22:02:05
Откуда: Германия, Viernheim

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

Сообщение unalex »

чтобы не было недоразумений с объявлениями функций, лучше использовать несколько файлов

main.c - собственно главная программа
blabla.h - объявление
blabla.c - сами функции

если функции сложные и их много, то для каждой из них лучше создать свою пару файлов, или объединить их в функциональные группы со схожими действиями
Коктейль "Рекурсивный": 20% спирта, 30% воды, 50% коктейля "Рекурсивный"...
a_skr
Вымогатель припоя
Сообщения: 630
Зарегистрирован: Пн июн 14, 2010 13:07:29
Откуда: Жуковский

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

Сообщение a_skr »

Apparatchik писал(а):В CVAVR переменную нужно объявлять в начале функции или глобально, где вздумается некатит (по крайней мере в той версии, что я пользовался).
переменные можно объявлять в начале блока. причем, существуют рекомендации - максимально сужать область видимости переменных.

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

void f(void)
{
  int i;
...
  if(...)
  {
    int a, b;
...
    for(a=0; a<5; a++)
    {
      int c;
...
    } 
...
  }
}
Последний раз редактировалось a_skr Пт янв 11, 2013 00:48:24, всего редактировалось 2 раза.
Аватара пользователя
Apparatchik
Держит паяльник хвостом
Сообщения: 908
Зарегистрирован: Вс май 23, 2010 13:55:42
Откуда: Украина, Александрия

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

Сообщение Apparatchik »

a_skr писал(а):переменные можно объявлять в начале блока. причем, существуют рекомендации - максимально сужать область видимости переменных.

Вот только что проверил CVAVR 1.25.9 если объявить переменную не в начале функции, а непосредственно перед циклом, компилятор дает ошибку must declare first in block. В GCC конечно таких проблем нету.
«И всё-таки она вертится!»
a_skr
Вымогатель припоя
Сообщения: 630
Зарегистрирован: Пн июн 14, 2010 13:07:29
Откуда: Жуковский

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

Сообщение a_skr »

в начале блока = first in block. т.е. сразу после открывающей фигурной скобки ;) и область видимости будет ограничена этим блоком { }
ps. подправил свое сообщение для наглядности
Аватара пользователя
Apparatchik
Держит паяльник хвостом
Сообщения: 908
Зарегистрирован: Вс май 23, 2010 13:55:42
Откуда: Украина, Александрия

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

Сообщение Apparatchik »

Я понял, но в Eclipse я могу её объявить где захочу.
«И всё-таки она вертится!»
a_skr
Вымогатель припоя
Сообщения: 630
Зарегистрирован: Пн июн 14, 2010 13:07:29
Откуда: Жуковский

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

Сообщение a_skr »

да, кстати, блок не обязательно сопутствует циклу, условию, и т.д. можно в произвольном "линейном" месте его обозначить

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

a = b + c;
i++;
{
  float f;
  c--;
  f = fun(c)*1.5;
  b = f;
}
a -= b;
eduardo
Нашел транзистор. Понюхал.
Сообщения: 171
Зарегистрирован: Вс июн 17, 2012 16:32:42

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

Сообщение eduardo »

Подскажите,как сделать поочередное чтение элементов массива через нажатие кнопки? Ну типа: нажал–отпустил––1й элемент; нажал–отпустил––2й элемент... и т.д.,затем все сначала.
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

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

Сообщение Аlex »

1. Переменная индекса = 0;
2. Ждём нажатие кнопки
3. Читаем из массива по индексу, равному переменной
4. Инкрементируем переменную индекса
5. ГоуТу п.2
Аватара пользователя
unalex
Мучитель микросхем
Сообщения: 424
Зарегистрирован: Сб авг 25, 2007 22:02:05
Откуда: Германия, Viernheim

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

Сообщение unalex »

1 индекс массива равен 0
2 считываем состояние кнопок, если нажата, делаем антидребезговую задержку
3 после задержки читаем состояние, если не изменилось ждем в цикле пока кнопка будет отпущена
4 читаем элемент массива
5 инкрементируем индекс массива
6 возврат к п.2
Коктейль "Рекурсивный": 20% спирта, 30% воды, 50% коктейля "Рекурсивный"...
Аватара пользователя
Pika4u
Поставщик валерьянки для Кота
Сообщения: 2064
Зарегистрирован: Пт апр 24, 2009 11:39:16
Откуда: г.Оренбург

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

Сообщение Pika4u »

Ребят,вопрос возник по CVAVR. Совсем отчаявшись запустить ds1307 собственноручно, я подумал попытаться переписать функции с CVAVR на IAR. Значит так, в DS1307.h используются DS1307.lib(где прописаны функции) и I2C.h. В DS1307.lib функции описаны на основе функций I2C, но в I2C.h только прототипы функций. Где же на самом деле описываются функции I2C?
Steve Jobs. 1955-2011. Мы помним, как ты преобразовал наш мир....
Аватара пользователя
*Trigger*
Друг Кота
Сообщения: 3059
Зарегистрирован: Пн май 11, 2009 14:15:00
Откуда: СПб

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

Сообщение *Trigger* »

По аналогии: в I2C.lib.
Этот пост оказался полезен? Не поленись, нажми Изображение слева!
:) :)) :)))
Куплю индикаторы ИТС-1А, ИТС-1Б, ИГВ1-8х5Л, ИГПС1-222/7, ИГПС1-111/7 и подобные.
Аватара пользователя
Pika4u
Поставщик валерьянки для Кота
Сообщения: 2064
Зарегистрирован: Пт апр 24, 2009 11:39:16
Откуда: г.Оренбург

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

Сообщение Pika4u »

Как это ни странно,в I2C.h никакой речи об I2C.lib не ведется, и такого файла у меня даже нету :(
Steve Jobs. 1955-2011. Мы помним, как ты преобразовал наш мир....
Аватара пользователя
Apparatchik
Держит паяльник хвостом
Сообщения: 908
Зарегистрирован: Вс май 23, 2010 13:55:42
Откуда: Украина, Александрия

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

Сообщение Apparatchik »

Ничего у Вас не выйдет, они "зашиты" гдето в компиляторе, так что придется писать либо свои либо взять готовые открытые (могу поделится для Eclipse в личке).

P.S. а что именно у вас невыходит с CVAVR, там ведь все просто?
«И всё-таки она вертится!»
pokk
Вымогатель припоя
Сообщения: 574
Зарегистрирован: Вт ноя 02, 2010 17:46:37

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

Сообщение pokk »

Подскажите, на что влияет установка частоты при создании нового проекта ? Если я дальше к примеру в протеусе другую частоту задам ?

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

// Crystal Oscillator division factor: 1
#pragma optsize-
CLKPR=(1<<CLKPCE);
CLKPR=(0<<CLKPCE) | (0<<CLKPS3) | (0<<CLKPS2) | (0<<CLKPS1) | (0<<CLKPS0);
#ifdef _OPTIMIZE_SIZE_
#pragma optsize+
#endif

Где можно прочитать что это такое по подробнее ?
Marchello
Встал на лапы
Сообщения: 114
Зарегистрирован: Чт ноя 24, 2011 12:39:13

В чем причина ошибки?!

Сообщение Marchello »

В процессе компиляции проекта CodeVisionAVR ругается, точнее выдает предупреждение:
"Warning: _________: macro 'TWINT' was redefined"
"Warning: _________: macro 'TWEA' was redefined"
"Warning: _________: macro 'TWSTA' was redefined"
"Warning: _________: macro 'TWSTO' was redefined"
"Warning: _________: macro 'TWEN' was redefined"

Вот сам исходник:

#include <mega16.h> // Задаем параметры микроконтроллера
#include <delay.h> // Это для задержек Delay_ms ()
#include <bcd.h>
#include <stdio.h>//для sprintf
//*****************************************************************************
#asm
.equ __i2c_port=0x15; PORTC // Кристал подключаем на PORT C к ножкам 6 и 7
.equ __sda_bit=1
.equ __scl_bit=0
#endasm
#include <i2c.h>
#include <ds1307.h> // Подцепили кристал

//*****************************************************************************

#asm
.equ __lcd_port=0x12; PORTD /* ЖКИ дисплей подключили к порту I/O D */
#endasm
#include <lcd.h>

//*****************************************************************************



#define TWINT 7 //для доступа к виду типа TWCR = (1<<TWINT)|(1<<TWSTA)|(1<<TWEN)
#define TWEA 6
#define TWSTA 5
#define TWSTO 4
#define TWEN 2
#define Start TWCR = ((1 << TWINT) | (1 << TWSTA) | (1 << TWEN))
#define Stop TWCR = ((1 << TWINT) | (1 << TWEN) | (1 << TWSTO))
#define Send TWCR = ((1 << TWINT) | (1 << TWEN)) //с ACK (с подтверждением)
#define Recieve TWCR = ((1 << TWINT) | (1 << TWEA) | (1 << TWEN)) //с NACK (с неподтверждением)
#define Execute (!(TWCR & (1 << TWINT))) //бит TWINT(7-бит регистра TWCR) установился



void main(void)
{
unsigned char r;
char s[60];//буфер для LCD
unsigned char rr[7];

ACSR=0x80; // Analog Comparator Off

TWBR=0x0C; // Bit Rate: 100,000 kHz
TWCR=0x04; // 2 Wire Bus initialization

lcd_init(16); // LCD module initialization

while (1)
{
Start; //ИНИЦИАЛИЗАЦИЯ ЧАСОВ PCF8583
while(Execute);
TWDR=0xA0; //адрес на запись(бит №0 равен 0)
Send;
while(Execute);
TWDR=0x00; //Программируем регистр статуса PCF8583
Send;
while(Execute);
Start; //СТАРТ ЧТЕНИЯ
while(Execute);
TWDR=0xA1; //адрес на чтение (бит №0 равен 1)
Send;
while(Execute);
for(r=0;r<7;r++){ //значения регистров PCF8583(регистры 0-7 часов,а 8-15 будильника)
if(r<6)Recieve; //с подтверждением приёма
else
Send; //последний без подтверждения(показать ведомому,что сеанс связи закончен)
while(Execute);
rr[r]=TWDR;} //в цикле последлвательно читаем и присваеваем членам массива "rr"
Stop;
sprintf(s,"Time %X:%X:%X:%X",rr[4],rr[3],rr[2],rr[1]); //отображаем время
lcd_gotoxy(1,0);
lcd_puts(s);
rr[6] = rr[6]&0x1F;
sprintf(s,"Data %X:%X",rr[5],rr[6]); //отображаем дату
lcd_gotoxy(4,1);
lcd_puts(s);


};
}

После запуска проекта в Proteus на экран выводятся надписи - Time и Data, а вместо самих значений высвечивается F
Аватара пользователя
vitalik_1984
Поставщик валерьянки для Кота
Сообщения: 2482
Зарегистрирован: Пт авг 27, 2010 05:57:06
Откуда: Тюмень
Контактная информация:

Re: В чем причина ошибки?!

Сообщение vitalik_1984 »

macro 'TWINT' was redefined"

для начала переведите
макрос TWIN был переопределен
А теперь подумайте для чего нужны эти строки:

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

#define TWINT 7 //для доступа к виду типа TWCR = (1<<TWINT)|(1<<TWSTA)|(1<<TWEN)
#define TWEA 6
#define TWSTA 5
#define TWSTO 4
#define TWEN 2        

Вообще CVAVR по умолчанию не предопределяет биты, поэтому, видимо, автор сделал это определение.
А в настройках можно их включить так:
Изображение
И тогда эти дефайны уже будут не нужны.
Ответить

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