Страница 34 из 386
Re: Вопросы по С/С++ (СИ)
Добавлено: Ср авг 10, 2011 16:31:48
МитяРа
Забавно.. Щас копался в примерах дальше и нашёл такую-же конструкцию на АСМе:
Надо будет её попробовать своему асеммблеру "скормить"...
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, выход: ручка повёрнута
Третий цикл АБ = 0, выход: ручка повёрнута
...
Что с этим делать ума не приложу.
Код: Выделить всё
#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 чему будет равна, если ни одно из условий не выполнится?
Ну и если придираться, то я не понял смысл глобальных
статических переменных (если они глобальны, то ведь по определению статичны).
Предлагаю это
внести в начало функции, а ещё лучше:
Re: Вопросы по С/С++ (СИ)
Добавлено: Ср авг 17, 2011 13:42:00
Gudd-Head
romazan писал(а):Пртвет всем хвостатым.
Пртвет. Дребезг победили?
Re: Вопросы по С/С++ (СИ)
Добавлено: Ср авг 17, 2011 14:32:11
romazan
IfoR писал(а):А переменная out чему будет равна, если ни одно из условий не выполнится?
Ну и если придираться, то я не понял смысл глобальных
статических переменных (если они глобальны, то ведь по определению статичны).
Предлагаю это
внести в начало функции, а ещё лучше:
Переместил объявление переменной, назначил uchar out = 0; вроде работать начало, но что-то при прокручивании ручки вправо(или влево) получается так, что ручка сначала крутится вправо а потом влево. Буду глядеть.
Re: Вопросы по С/С++ (СИ)
Добавлено: Ср авг 17, 2011 14:38:53
IfoR
В этой строчке
вы поставили
логическое И (newZ будет равно либо 0, либо 1), а вам, так понимаю, нужно побитовое:
Ну и саму функцию можно написать попроще:
Код: Выделить всё
#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
У вас эта строчка правильно написана (порядок значений правильный)?
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;
}