Страница 92 из 421

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

Добавлено: Сб окт 16, 2010 13:49:00
ValBag
Rinon Ninqueon писал(а):смотрите файл, там весь код. Почти...
Прерывание по INT0 должно срабатывать. Чтобы убедиться, вставьте в функцию индикацию на светодиоде: зажечь - погасить при каждом нажатии кнопки.
По остальному:
В main разрешены прерывания по INT0, по переполнению Т1, по захвату Т1. При работе программы первое прерывание по TIM1_OVF, в соответствие с функцией, снимет разрешения на TIM1_OVF и TIM1_CAPT и остановит таймер. ...Если, конечно, нет продолжения в Почти....
Что за переменные техтх и техтy?
Если Т1 "заставить" работать, то:
TCNT1=0x10000-(Freq/2048)/3200; // получится 65536-1=65535 т. е. после следующего такта опять прерывание. И так постоянно.

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

Добавлено: Сб окт 16, 2010 17:00:44
Rinon Ninqueon
ValBag писал(а):Что за переменные техтх и техтy?
http://radiokot.ru/lab/controller/15/ - вот, я отсюда брал работу с дисплеем
это координаты текста задаются

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

Добавлено: Вс окт 17, 2010 14:34:51
Sounds
Всем привет!
Как перевести эти три строчки(Выражения)? А то не как не могу понять что они делают!

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

(x|=y)
(x&=~y)
(x&y)

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

Добавлено: Вс окт 17, 2010 15:49:09
ValBag
Sounds писал(а):Как перевести эти три строчки(Выражения)?
(x|=y); // Сравнить по "ИЛИ" и записать в "х"
(x&=~y); // Сравнить по "И" с инверсией "У" и записать в "Х"
(x&y); // Сравнить по "И"
Операции поразрядные.

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

Добавлено: Вс окт 17, 2010 15:57:26
ARV
ValBag писал(а):
Sounds писал(а):Как перевести эти три строчки(Выражения)?
(x|=y) // Сравнить по "ИЛИ" и записать в "х"
(x&=~y) // Сравнить по "И" с инверсией "У" и записать в "Х"
(x&y) // Сравнить по "И"
нифига не так это все "переводится!!! сравнить - это if - в этих выражениях этого нет.
правильный перевод:
1. x |= y; - присвоить х результат побитового ИЛИ межу х и у - добавить в x единичные биты из y
2. x &= ~y; - присвоить х результат побитового И между х и инверсией у - в х сбросить в 0 те биты, котрые равны 1 в у

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

Добавлено: Вс окт 17, 2010 16:08:37
ValBag
Причём тут if ? Сравнивается каждый бит первого операнда с соответствующим битом второго операнда, а результат сравнения определяется типом логической операции. Так что все ..."фига".

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

Добавлено: Вс окт 17, 2010 16:55:11
ARV
ValBag писал(а):Причём тут if ? Сравнивается каждый бит первого операнда с соответствующим битом второго операнда, а результат сравнения определяется типом логической операции. Так что все ..."фига".
оставайтесь при своем мнении, не буду мешать.

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

Добавлено: Вс окт 17, 2010 22:33:24
Sounds
Спасибо за ответ! А что вот эти ошибки означают?
Изображение

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

Добавлено: Пн окт 18, 2010 05:00:48
ValBag
Sounds писал(а):Спасибо за ответ! А что вот эти ошибки означают?
Изображение
Примерно так:
первый аргумент функции типа "flash unsigned char (в строке 9)" не совместим с обязательным параметром типа "unsigned char".
Т. е. передается в функцию аргумент не того типа, что был при её определении. Вернее тип тот же, но место хранения разное - flash или sram.

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

Добавлено: Пн окт 18, 2010 10:49:01
Sounds
ого, и как с этим бороться?

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

Добавлено: Пн окт 18, 2010 10:58:05
Rinon Ninqueon
Я сначала завожу переменную типа char *, инициализирую его чем-нибудь
без ошибок работало

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

Добавлено: Пн окт 18, 2010 11:03:33
Sounds
как это сделать? можете поделится примером?

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

Добавлено: Пн окт 18, 2010 11:09:22
Rinon Ninqueon
отправил в ЛС

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

Добавлено: Пн окт 18, 2010 15:45:20
Sounds
Спасибо! Скажи а почему экран может двоить, то есть показывает одно и тоже на двух кристаллах одновременно ?

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

Добавлено: Сб окт 23, 2010 23:40:35
stas00n
Коллеги, может я немного не в тему, у меня вопрос абстрактный по си. Начал недавно пользоваться, даже относительно рабочую программу получилось написать, но блин, никак не вкурю как указателями пользоваться, все что в инете нашел ну никак до меня не доходит, слаб стал умишком... Объясните на пальцах как сделать функцию, к примеру, bin2bcd? Вот я сделал так:

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

char bcd_data[3];                                      //массив для результата
void bin2bcd(int binvalue);       

/*собственно, bin2bcd*/
void bin2bcd(int binvalue)
{
	int t=binvalue;
	bcd_data[2]=bcd_data[1]=-1;
	while (t>=0)
	{
	t=t-100;
	bcd_data[2]++ ;
	}
	t=t+100;
	while (t>=0)
	{
	t=t-10;
	bcd_data[1]++;
	}
	bcd_data[0]=(char) t+10;
}
/*Пользуюсь примерно так*/
void main (void)
{
int a=123;
bin2bcd(a);
}
Все работает, но мне теперь надо чтобы результат сохранялся в другие места, т.е, например, преобразовать надо несколько значений. Надо добавить еще один аргумент к функции, - указатель куда сохранять. КАК? Чтобы я мог сделать несколько вызовов типа:

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

char bcd1[3];
char bcd2[3];
char bcd3[3];
void main (void)
{
int a=123;
int b=456;
int c=789;
bin2bcd(a, тут надо указатель на массив bcd1);
bin2bcd(b, тут надо указатель на массив bcd2);
bin2bcd(c, тут надо указатель на массив bcd3); 
}

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

Добавлено: Сб окт 23, 2010 23:49:34
Apparatchik
Насколько я знаю, если подключить файл bcd.h , то можно использовать bin2bcd() и bcd2bin() и ничего писать не нужно.

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

Добавлено: Вс окт 24, 2010 00:00:08
stas00n
Во-первых, нету у меня такого, а во-вторых хочу разобраться с самим принципом работы с указателями, bin2bcd так, для примера, обо что споткнулся..

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

Добавлено: Вс окт 24, 2010 00:11:50
Apparatchik
stas00n писал(а):Коллеги, может я немного не в тему, у меня вопрос абстрактный по си. Начал недавно пользоваться, даже относительно рабочую программу получилось написать, но блин, никак не вкурю как указателями пользоваться, все что в инете нашел ну никак до меня не доходит, слаб стал умишком... Объясните на пальцах как сделать функцию, к примеру, bin2bcd? Вот я сделал так:

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

char bcd_data[3];                                      //массив для результата
void bin2bcd(int binvalue);       

/*собственно, bin2bcd*/
void bin2bcd(int binvalue)
{
	int t=binvalue;
	bcd_data[2]=bcd_data[1]=-1;
	while (t>=0)
	{
	t=t-100;
	bcd_data[2]++ ;
	}
	t=t+100;
	while (t>=0)
	{
	t=t-10;
	bcd_data[1]++;
	}
	bcd_data[0]=(char) t+10;
}
/*Пользуюсь примерно так*/
void main (void)
{
int a=123;
bin2bcd(a);
}
Все работает, но мне теперь надо чтобы результат сохранялся в другие места, т.е, например, преобразовать надо несколько значений. Надо добавить еще один аргумент к функции, - указатель куда сохранять. КАК? Чтобы я мог сделать несколько вызовов типа:

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

char bcd1[3];
char bcd2[3];
char bcd3[3];
void main (void)
{
int a=123;
int b=456;
int c=789;
bin2bcd(a, тут надо указатель на массив bcd1);
bin2bcd(b, тут надо указатель на массив bcd2);
bin2bcd(c, тут надо указатель на массив bcd3); 
}
Я бы сделал так:

сначала подключаем bcd.h

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

#include <bcd.h>
потом например присвоить первому елементу массива bcd1 преобразованое значение переменной a

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

bcd[1]=bin2bcd (a);
Может конечно я не прав, я тоже только учусь.

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

Добавлено: Вс окт 24, 2010 00:51:10
stas00n
Ну нету у меня bcd.h, нету. У меня эта функция с одним параметром - числом для преобразования. Результат преобразования сохраняется в заранее приготовленный фиксированный массив, а надо сделать функцию с двумя параметрами - кроме числа для преобразования передавать еще и адрес массива, куда сохранить результат... Вот с передачей этого адреса у меня и вилы - как ни напишу -компилятор все на что-нибудь ругается :evil:

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

Добавлено: Вс окт 24, 2010 08:59:16
ARV
вы можете описать функцию примерно так:

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

void my_func(int number, char *bcd);
или так:

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

void my_func(int number, char bcd[]);
и работать внутри функции с указателем bcd, как вам угодно. вот пример:

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

void my_func(int number, char *bcd){
   for(; number; number /= 10){
      *bcd++ = (number % 10) + '0';
   }
*bcd = 0;
}
эта функция чисто для примеру: она формирует "задом наперед" в массиве десятичное число - что-то умное придумывать было лень

использовать ее можно примерно так:

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

char array1[6], array2[6], array3[6];

my_func(123, array1);
my_func(456,array2);
my_func(789,array3);