В CVAVR переменную нужно объявлять в начале функции или глобально, где вздумается некатит (по крайней мере в той версии, что я пользовался).mr4ester писал(а):исправил вот этот операторон все равно не ругается на то что я не объявил Error: D:\cvavr\zamok\zamok 2.c(246): must declare first in blockКод: Выделить всё
unsigned int i; for(i=0; i<1024; i++)
CodeVision AVR в вопросах и ответах
- Apparatchik
- Держит паяльник хвостом
- Сообщения: 908
- Зарегистрирован: Вс май 23, 2010 13:55:42
- Откуда: Украина, Александрия
Re: CodeVision AVR в вопросах и ответах
«И всё-таки она вертится!»
- Реклама
Re: CodeVision AVR в вопросах и ответах
Вроде бы CVAVR требует явного указания параметров для функций.
Попробуйте void CheckSensors(void) вместо void CheckSensors()
Попробуйте void CheckSensors(void) вместо void CheckSensors()
- unalex
- Мучитель микросхем
- Сообщения: 424
- Зарегистрирован: Сб авг 25, 2007 22:02:05
- Откуда: Германия, Viernheim
Re: CodeVision AVR в вопросах и ответах
разложение числа на единицы, десятки...
Код: Выделить всё
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 в вопросах и ответах
Вообще в си есть три этапа использования функции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 в вопросах и ответах
чтобы не было недоразумений с объявлениями функций, лучше использовать несколько файлов
main.c - собственно главная программа
blabla.h - объявление
blabla.c - сами функции
если функции сложные и их много, то для каждой из них лучше создать свою пару файлов, или объединить их в функциональные группы со схожими действиями
main.c - собственно главная программа
blabla.h - объявление
blabla.c - сами функции
если функции сложные и их много, то для каждой из них лучше создать свою пару файлов, или объединить их в функциональные группы со схожими действиями
Коктейль "Рекурсивный": 20% спирта, 30% воды, 50% коктейля "Рекурсивный"...
- Реклама
Re: CodeVision AVR в вопросах и ответах
переменные можно объявлять в начале блока. причем, существуют рекомендации - максимально сужать область видимости переменных.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 в вопросах и ответах
Вот только что проверил CVAVR 1.25.9 если объявить переменную не в начале функции, а непосредственно перед циклом, компилятор дает ошибку must declare first in block. В GCC конечно таких проблем нету.a_skr писал(а):переменные можно объявлять в начале блока. причем, существуют рекомендации - максимально сужать область видимости переменных.
«И всё-таки она вертится!»
Re: CodeVision AVR в вопросах и ответах
в начале блока = first in block. т.е. сразу после открывающей фигурной скобки
и область видимости будет ограничена этим блоком { }
ps. подправил свое сообщение для наглядности
ps. подправил свое сообщение для наглядности
- Apparatchik
- Держит паяльник хвостом
- Сообщения: 908
- Зарегистрирован: Вс май 23, 2010 13:55:42
- Откуда: Украина, Александрия
Re: CodeVision AVR в вопросах и ответах
Я понял, но в Eclipse я могу её объявить где захочу.
«И всё-таки она вертится!»
Re: CodeVision AVR в вопросах и ответах
да, кстати, блок не обязательно сопутствует циклу, условию, и т.д. можно в произвольном "линейном" месте его обозначить
Код: Выделить всё
a = b + c;
i++;
{
float f;
c--;
f = fun(c)*1.5;
b = f;
}
a -= b;Re: CodeVision AVR в вопросах и ответах
Подскажите,как сделать поочередное чтение элементов массива через нажатие кнопки? Ну типа: нажал–отпустил––1й элемент; нажал–отпустил––2й элемент... и т.д.,затем все сначала.
- Аlex
- Модератор
- Сообщения: 4614
- Зарегистрирован: Чт мар 18, 2010 23:09:57
- Откуда: Планета Земля
- Контактная информация:
Re: CodeVision AVR в вопросах и ответах
1. Переменная индекса = 0;
2. Ждём нажатие кнопки
3. Читаем из массива по индексу, равному переменной
4. Инкрементируем переменную индекса
5. ГоуТу п.2
2. Ждём нажатие кнопки
3. Читаем из массива по индексу, равному переменной
4. Инкрементируем переменную индекса
5. ГоуТу п.2
- unalex
- Мучитель микросхем
- Сообщения: 424
- Зарегистрирован: Сб авг 25, 2007 22:02:05
- Откуда: Германия, Viernheim
Re: CodeVision AVR в вопросах и ответах
1 индекс массива равен 0
2 считываем состояние кнопок, если нажата, делаем антидребезговую задержку
3 после задержки читаем состояние, если не изменилось ждем в цикле пока кнопка будет отпущена
4 читаем элемент массива
5 инкрементируем индекс массива
6 возврат к п.2
2 считываем состояние кнопок, если нажата, делаем антидребезговую задержку
3 после задержки читаем состояние, если не изменилось ждем в цикле пока кнопка будет отпущена
4 читаем элемент массива
5 инкрементируем индекс массива
6 возврат к п.2
Коктейль "Рекурсивный": 20% спирта, 30% воды, 50% коктейля "Рекурсивный"...
- Pika4u
- Поставщик валерьянки для Кота
- Сообщения: 2064
- Зарегистрирован: Пт апр 24, 2009 11:39:16
- Откуда: г.Оренбург
Re: CodeVision AVR в вопросах и ответах
Ребят,вопрос возник по CVAVR. Совсем отчаявшись запустить ds1307 собственноручно, я подумал попытаться переписать функции с CVAVR на IAR. Значит так, в DS1307.h используются DS1307.lib(где прописаны функции) и I2C.h. В DS1307.lib функции описаны на основе функций I2C, но в I2C.h только прототипы функций. Где же на самом деле описываются функции I2C?
Steve Jobs. 1955-2011. Мы помним, как ты преобразовал наш мир....
Re: CodeVision AVR в вопросах и ответах
По аналогии: в I2C.lib.
Этот пост оказался полезен? Не поленись, нажми
слева!

Куплю индикаторы ИТС-1А, ИТС-1Б, ИГВ1-8х5Л, ИГПС1-222/7, ИГПС1-111/7 и подобные.
слева!Куплю индикаторы ИТС-1А, ИТС-1Б, ИГВ1-8х5Л, ИГПС1-222/7, ИГПС1-111/7 и подобные.
- Pika4u
- Поставщик валерьянки для Кота
- Сообщения: 2064
- Зарегистрирован: Пт апр 24, 2009 11:39:16
- Откуда: г.Оренбург
Re: CodeVision AVR в вопросах и ответах
Как это ни странно,в I2C.h никакой речи об I2C.lib не ведется, и такого файла у меня даже нету 
Steve Jobs. 1955-2011. Мы помним, как ты преобразовал наш мир....
- Apparatchik
- Держит паяльник хвостом
- Сообщения: 908
- Зарегистрирован: Вс май 23, 2010 13:55:42
- Откуда: Украина, Александрия
Re: CodeVision AVR в вопросах и ответах
Ничего у Вас не выйдет, они "зашиты" гдето в компиляторе, так что придется писать либо свои либо взять готовые открытые (могу поделится для Eclipse в личке).
P.S. а что именно у вас невыходит с CVAVR, там ведь все просто?
P.S. а что именно у вас невыходит с CVAVR, там ведь все просто?
«И всё-таки она вертится!»
Re: CodeVision AVR в вопросах и ответах
Подскажите, на что влияет установка частоты при создании нового проекта ? Если я дальше к примеру в протеусе другую частоту задам ?
Где можно прочитать что это такое по подробнее ?
Код: Выделить всё
// 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Где можно прочитать что это такое по подробнее ?
В чем причина ошибки?!
В процессе компиляции проекта 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
"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: В чем причина ошибки?!
для начала переведите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 А в настройках можно их включить так:

И тогда эти дефайны уже будут не нужны.


