Страница 34 из 386

Re: Вопросы по С/С++ (СИ)

Добавлено: Ср авг 10, 2011 16:31:48
МитяРа
Забавно.. Щас копался в примерах дальше и нашёл такую-же конструкцию на АСМе:

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

mov   ADC0CF, #((SYSCLK / 7500) SHL 3)
Надо будет её попробовать своему асеммблеру "скормить"...

P.S. Скормил.. он понял и посчитал правильно.. ура..

Re: Вопросы по С/С++ (СИ)

Добавлено: Ср авг 10, 2011 22:42:54
Hispanus
Можно ли силами компилятора для МК организовать открытие и чтение данных из внешнего файла, не загружая их в его память (функция fopen, fwrite в полноценных с-шных компиляторах)?

Re: Вопросы по С/С++ (СИ)

Добавлено: Чт авг 11, 2011 07:15:15
Мастер Ломастер
Hispanus писал(а):Можно ли силами компилятора для МК организовать открытие и чтение данных из внешнего файла, не загружая их в его память (функция fopen, fwrite в полноценных с-шных компиляторах)?
вас совсем не смущает тот факт, что в МК не существует никаких "накопителей" и мест хранения "файлов"? если не смущает, то все необходимые стандартные функции компилятор WinAVR отлично поддерживает. кроме этого существуют варианты "файловых систем" для МК - но это уже "нестандартные" решения.

Re: Вопросы по С/С++ (СИ)

Добавлено: Вс авг 14, 2011 14:33:50
demonchik
привет всем котам!!
не попортятся ли у меня данные в file_1.buf после этой операции?

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

uint32_t data=(((file_1.buf[0])<<15)|((file_1.buf[1])<<7)|((file_1.buf[2])<<0));

Re: Вопросы по С/С++ (СИ)

Добавлено: Вс авг 14, 2011 19:37:37
DX168B
И у меня вопрос.
Мне нужна задержка в секундах в AVR. Причём, функция должна принимать заначение не с константы, как в _delay_ms(); , а значение из переменной. (хранимая настройка в EEPROM, которую можно изменять в настройках будущего девайса)
Пойдёт ли такая конструкция?

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

void delay_s(unsigned int delay)
{
	for(int i=0; i<delay; i++){_delay_ms(1000);}
}
Или есть более рациональное решение? Высокая точность задержки не нужна.

Re: Вопросы по С/С++ (СИ)

Добавлено: Вс авг 14, 2011 19:40:07
Мастер Ломастер
DX168B писал(а):И у меня вопрос.
Мне нужна задержка в секундах в AVR. Причём, функция должна принимать заначение не с константы, как в _delay_ms(); , а значение из переменной. (хранимая настройка в EEPROM, которую можно изменять в настройках будущего девайса)
Пойдёт ли такая конструкция?

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

void delay_s(unsigned int delay)
{
	for(int i=0; i<delay; i++){_delay_ms(1000);}
}
Или есть более рациональное решение? Высокая точность задержки не нужна.
пойдет и так

Re: Вопросы по С/С++ (СИ)

Добавлено: Вс авг 14, 2011 19:44:10
DX168B
ОК. Думаю, что так будет даже лучше. То есть, объявить беззнаковую переменную и в цикле.

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

void delay_s(unsigned int delay)
{
   for(unsigned int i=0; i<delay; i++){_delay_ms(1000);}
}

Re: Вопросы по С/С++ (СИ)

Добавлено: Пн авг 15, 2011 00:46:03
IfoR
demonchik, нет.

Re: Вопросы по С/С++ (СИ)

Добавлено: Пн авг 15, 2011 07:14:16
Мастер Ломастер

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

void delay_s(unsigned int delay)
{
   for(; delay; delay--){_delay_ms(1000);}
}
вот так будет еще лучше :)))

Re: Вопросы по С/С++ (СИ)

Добавлено: Пн авг 15, 2011 12:37:23
IfoR
Тогда уж так:

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

void delay_s(unsigned int delay)
{ while (delay--) _delay_ms(1000); } 

Re: Вопросы по С/С++ (СИ)

Добавлено: Пн авг 15, 2011 17:18:59
Atmega8
Всем привет!
Пытаюсь разобраться с микросхемой PCA9554, но вот засада – не хотит работать, общается по I2C, можете подсказать где я ошибаюсь.
Среда - CodeVisionAVR
Datasheet - http://www.nxp.com/documents/data_sheet ... _9554A.pdf
I2C_INIT();
I2C_START();// Состояние СТАРТ
I2C_WRITE(0b01001110);// Адрес устройства (А1-А0 на плюс)
I2C_WRITE(0×03);// Command byte == 3, выбор конфигурационного регистра
I2C_WRITE(0×00);// Настраиваю порт на вывод
I2C_START();// Состояние ПОВСТАРТ
I2C_WRITE(0b01001110);// Адрес устройства
I2C_WRITE(0×01); // Command byte == 1, выбор регистра Output
I2C_WRITE(0b10101010);// Записываю в порт число 0b10101010
I2C_STOP();// Состояние СТОП

Микросхема всегда отвечает ACK, но вывода не выставляет.

Re: Вопросы по С/С++ (СИ)

Добавлено: Вт авг 16, 2011 02:54:54
DX168B
IfoR писал(а):Тогда уж так:

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

void delay_s(unsigned int delay)
{ while (delay--) _delay_ms(1000); } 
О... Точно. :) А я и забыл уже, что с while можно сделать именно таким макаром. :)
То есть и как действие и как условие.

Re: Вопросы по С/С++ (СИ)

Добавлено: Ср авг 17, 2011 13:28:32
romazan
Привет всем хвостатым. Тут такая проблема. Пишу подпрограмму обработки энкодера и вроде всё правильно, НО программа глючит по страшному.
Отступление: энкодер от автомобильной магнитолы, работает по такому принципу (состояние выводов А и Б, подчёркнутым показаны щелчки)
...-11-10-00-01-11-...
Ну так вот, написал я подпрограмму, начинаю отлаживать:
Первый цикл АБ = 0, выход: нет поворота ручки
Второй цикл АБ = 0, выход: ручка повёрнута :shock:
Третий цикл АБ = 0, выход: ручка повёрнута :shock:
...
Что с этим делать ума не приложу.

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

#define uchar unsigned char
static uchar newZ;
static uchar oldZ;

uchar encoder(void)
{
char	out;	
		newZ = PINB && 0x03;
		switch(oldZ)
		{
			case 0: if(newZ==1)	out = RIGHT;
					if(newZ==2) out = LEFT;
					break;
			case 1:	if(newZ==3)	out = RIGHT;
					if(newZ==0)	out = LEFT;
					break;
			case 2:	if(newZ==0)	out = RIGHT;
					if(newZ==3)	out = LEFT;
					break;
			case 3:	if(newZ==2) out = RIGHT;
					if(newZ==1)	out = LEFT;
					break;
		}
		oldZ=newZ;
		return out;
}

Re: Вопросы по С/С++ (СИ)

Добавлено: Ср авг 17, 2011 13:35:51
IfoR
А переменная out чему будет равна, если ни одно из условий не выполнится? :))

Ну и если придираться, то я не понял смысл глобальных статических переменных (если они глобальны, то ведь по определению статичны).
Предлагаю это

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

static uchar newZ;
static uchar oldZ;
внести в начало функции, а ещё лучше:

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

uchar newZ;
static uchar oldZ;

Re: Вопросы по С/С++ (СИ)

Добавлено: Ср авг 17, 2011 13:42:00
Gudd-Head
romazan писал(а):Пртвет всем хвостатым.
Пртвет. Дребезг победили?

Re: Вопросы по С/С++ (СИ)

Добавлено: Ср авг 17, 2011 14:32:11
romazan
IfoR писал(а):А переменная out чему будет равна, если ни одно из условий не выполнится? :))

Ну и если придираться, то я не понял смысл глобальных статических переменных (если они глобальны, то ведь по определению статичны).
Предлагаю это

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

static uchar newZ;
static uchar oldZ;
внести в начало функции, а ещё лучше:

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

uchar newZ;
static uchar oldZ;
Переместил объявление переменной, назначил uchar out = 0; вроде работать начало, но что-то при прокручивании ручки вправо(или влево) получается так, что ручка сначала крутится вправо а потом влево. Буду глядеть.

Re: Вопросы по С/С++ (СИ)

Добавлено: Ср авг 17, 2011 14:38:53
IfoR
В этой строчке

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

newZ = PINB && 0x03; 
вы поставили логическое И (newZ будет равно либо 0, либо 1), а вам, так понимаю, нужно побитовое:

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

newZ = PINB & 0x03; 
Ну и саму функцию можно написать попроще:

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

#define uchar unsigned char

uchar encoder(void)
{
      const uchar greyRight[] = {1, 3, 0, 2};
      static uchar oldZ;
      uchar newZ = PINB & 0x03;

      if (newZ == oldZ) return 0;
      if (greyRight[oldZ] == (oldZ = newZ)) return RIGHT; else return LEFT;
} 
Только я не проверял. Сейчас неначем. :)))
P.S. Ан-не. Проверил. Вроде работает.

Re: Вопросы по С/С++ (СИ)

Добавлено: Ср авг 17, 2011 15:48:41
romazan
попробовал код, таже хинея, кручу ручку в одну сторону, МК считывает, что попеременно в разные

Re: Вопросы по С/С++ (СИ)

Добавлено: Ср авг 17, 2011 16:38:46
IfoR
У вас эта строчка правильно написана (порядок значений правильный)?

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

const uchar greyRight[] = {1, 3, 0, 2}; 

Re: Вопросы по С/С++ (СИ)

Добавлено: Ср авг 17, 2011 16:42:02
urry
на мой вкус, ифов много. Вы на землю энкодером садите или на плюс ?

uchar encoder(void)
{
char out;
newZ = (~PINB & 0x03);
if(newZ != oldZ)
{
switch(newZ)
{
case 0: if(oldZ == 2){out = RIGHT;}
break;
case 1: if(oldZ==3){out = LEFT;}
break;
case 2: if(oldZ==0) {out = LEFT;}
break;
case 3: if(oldZ==1) {out = RIGHT;}
break;
}
oldZ=newZ;
}
return out;
}