Страница 233 из 421
Re: CodeVision AVR в вопросах и ответах
Добавлено: Чт янв 10, 2013 17:09:10
Apparatchik
mr4ester писал(а):исправил вот этот оператор
он все равно не ругается на то что я не объявил Error: D:\cvavr\zamok\zamok 2.c(246): must declare first in block
В CVAVR переменную нужно объявлять в начале функции или глобально, где вздумается некатит (по крайней мере в той версии, что я пользовался).
Re: CodeVision AVR в вопросах и ответах
Добавлено: Чт янв 10, 2013 20:20:54
Sergi
Вроде бы CVAVR требует явного указания параметров для функций.
Попробуйте void CheckSensors(void) вместо void CheckSensors()
Re: CodeVision AVR в вопросах и ответах
Добавлено: Чт янв 10, 2013 20:25:50
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);
}
Re: CodeVision AVR в вопросах и ответах
Добавлено: Чт янв 10, 2013 20:39:38
vitalik_1984
mr4ester писал(а):он все равно не ругается на то что я не объявил Error: D:\cvavr\zamok\zamok 2.c(246): must declare first in block, и еще одна ошибка, скорее наверно что я плохо синтаксис языка знаю, есть функция опроса сенсоров, вообщем вот она чтоб не возникало недопонимания
Код:
Вообще в си есть три этапа использования функции
1.объявление
2.описание
3.использование
Можно совместить объявление с описанием.
Вы объявление функции не сделали, и уже вызываете её.
Блок описания переместите выше, чем первый вызов функции и все будет ок.
Либо все по правилам объявляйте.
Re: CodeVision AVR в вопросах и ответах
Добавлено: Чт янв 10, 2013 21:37:41
unalex
чтобы не было недоразумений с объявлениями функций, лучше использовать несколько файлов
main.c - собственно главная программа
blabla.h - объявление
blabla.c - сами функции
если функции сложные и их много, то для каждой из них лучше создать свою пару файлов, или объединить их в функциональные группы со схожими действиями
Re: CodeVision AVR в вопросах и ответах
Добавлено: Чт янв 10, 2013 22:29:32
a_skr
Apparatchik писал(а):В CVAVR переменную нужно объявлять в начале функции или глобально, где вздумается некатит (по крайней мере в той версии, что я пользовался).
переменные можно объявлять в начале блока. причем, существуют рекомендации - максимально сужать область видимости переменных.
Код: Выделить всё
void f(void)
{
int i;
...
if(...)
{
int a, b;
...
for(a=0; a<5; a++)
{
int c;
...
}
...
}
}
Re: CodeVision AVR в вопросах и ответах
Добавлено: Чт янв 10, 2013 23:47:01
Apparatchik
a_skr писал(а):переменные можно объявлять в начале блока. причем, существуют рекомендации - максимально сужать область видимости переменных.
Вот только что проверил CVAVR 1.25.9 если объявить переменную не в начале функции, а непосредственно перед циклом, компилятор дает ошибку
must declare first in block. В GCC конечно таких проблем нету.
Re: CodeVision AVR в вопросах и ответах
Добавлено: Пт янв 11, 2013 00:44:15
a_skr
в начале блока =
first in block. т.е.
сразу после открывающей фигурной скобки

и область видимости будет ограничена этим блоком { }
ps. подправил свое сообщение для наглядности
Re: CodeVision AVR в вопросах и ответах
Добавлено: Пт янв 11, 2013 00:50:04
Apparatchik
Я понял, но в Eclipse я могу её объявить где захочу.
Re: CodeVision AVR в вопросах и ответах
Добавлено: Пт янв 11, 2013 00:57:16
a_skr
да, кстати, блок не обязательно сопутствует циклу, условию, и т.д. можно в произвольном "линейном" месте его обозначить
Код: Выделить всё
a = b + c;
i++;
{
float f;
c--;
f = fun(c)*1.5;
b = f;
}
a -= b;
Re: CodeVision AVR в вопросах и ответах
Добавлено: Чт янв 17, 2013 16:28:53
eduardo
Подскажите,как сделать поочередное чтение элементов массива через нажатие кнопки? Ну типа: нажал–отпустил––1й элемент; нажал–отпустил––2й элемент... и т.д.,затем все сначала.
Re: CodeVision AVR в вопросах и ответах
Добавлено: Чт янв 17, 2013 19:22:08
Аlex
1. Переменная индекса = 0;
2. Ждём нажатие кнопки
3. Читаем из массива по индексу, равному переменной
4. Инкрементируем переменную индекса
5. ГоуТу п.2
Re: CodeVision AVR в вопросах и ответах
Добавлено: Пт янв 18, 2013 00:13:20
unalex
1 индекс массива равен 0
2 считываем состояние кнопок, если нажата, делаем антидребезговую задержку
3 после задержки читаем состояние, если не изменилось ждем в цикле пока кнопка будет отпущена
4 читаем элемент массива
5 инкрементируем индекс массива
6 возврат к п.2
Re: CodeVision AVR в вопросах и ответах
Добавлено: Пт янв 18, 2013 11:24:09
Pika4u
Ребят,вопрос возник по CVAVR. Совсем отчаявшись запустить ds1307 собственноручно, я подумал попытаться переписать функции с CVAVR на IAR. Значит так, в DS1307.h используются DS1307.lib(где прописаны функции) и I2C.h. В DS1307.lib функции описаны на основе функций I2C, но в I2C.h только прототипы функций. Где же на самом деле описываются функции I2C?
Re: CodeVision AVR в вопросах и ответах
Добавлено: Пт янв 18, 2013 11:33:11
*Trigger*
По аналогии: в I2C.lib.
Re: CodeVision AVR в вопросах и ответах
Добавлено: Пт янв 18, 2013 11:40:35
Pika4u
Как это ни странно,в I2C.h никакой речи об I2C.lib не ведется, и такого файла у меня даже нету

Re: CodeVision AVR в вопросах и ответах
Добавлено: Пт янв 18, 2013 11:52:32
Apparatchik
Ничего у Вас не выйдет, они "зашиты" гдето в компиляторе, так что придется писать либо свои либо взять готовые открытые (могу поделится для Eclipse в личке).
P.S. а что именно у вас невыходит с CVAVR, там ведь все просто?
Re: CodeVision AVR в вопросах и ответах
Добавлено: Пт янв 18, 2013 15:41:40
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
Где можно прочитать что это такое по подробнее ?
В чем причина ошибки?!
Добавлено: Пт янв 18, 2013 21:16:35
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
Re: В чем причина ошибки?!
Добавлено: Пт янв 18, 2013 23:46:59
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 по умолчанию не предопределяет биты, поэтому, видимо, автор сделал это определение.
А в настройках можно их включить так:

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