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

Если ваш вопрос не влез ни в одну из вышеперечисленных тем, вам сюда.
Аватара пользователя
МитяРа
Модератор
Сообщения: 11492
Зарегистрирован: Чт дек 11, 2008 14:52:26
Откуда: град Нижний

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

Сообщение МитяРа »

Забавно.. Щас копался в примерах дальше и нашёл такую-же конструкцию на АСМе:

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

mov   ADC0CF, #((SYSCLK / 7500) SHL 3)

Надо будет её попробовать своему асеммблеру "скормить"...

P.S. Скормил.. он понял и посчитал правильно.. ура..
[img]http://radiokot.ru/forum/download/file.php?id=93376[/img][i][color=#000080][size=85]Между людьми возникает напряжение, если у них разный потенциал...[/size][/color][/i]
Аватара пользователя
Hispanus
Грызет канифоль
Сообщения: 262
Зарегистрирован: Сб мар 26, 2011 14:17:14
Откуда: Оренбург

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

Сообщение Hispanus »

Можно ли силами компилятора для МК организовать открытие и чтение данных из внешнего файла, не загружая их в его память (функция fopen, fwrite в полноценных с-шных компиляторах)?
У радио нет будущего. Летательные аппараты тяжелее воздуха невозможны. Скоро выяснится, что рентгеновские лучи - мистификация.

[i]Лорд Кельвин, физик, 1899 г.[/i]
Мастер Ломастер
Поставщик валерьянки для Кота
Сообщения: 1995
Зарегистрирован: Ср май 11, 2011 21:37:45
Откуда: Цветочный город
Контактная информация:

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

Сообщение Мастер Ломастер »

Hispanus писал(а):Можно ли силами компилятора для МК организовать открытие и чтение данных из внешнего файла, не загружая их в его память (функция fopen, fwrite в полноценных с-шных компиляторах)?
вас совсем не смущает тот факт, что в МК не существует никаких "накопителей" и мест хранения "файлов"? если не смущает, то все необходимые стандартные функции компилятор WinAVR отлично поддерживает. кроме этого существуют варианты "файловых систем" для МК - но это уже "нестандартные" решения.
битва с дураками проиграна, победители торжествуют. слава победителям!
Аватара пользователя
demonchik
Встал на лапы
Сообщения: 94
Зарегистрирован: Вт апр 07, 2009 13:39:13
Откуда: одесса
Контактная информация:

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

Сообщение demonchik »

привет всем котам!!
не попортятся ли у меня данные в file_1.buf после этой операции?

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

uint32_t data=(((file_1.buf[0])<<15)|((file_1.buf[1])<<7)|((file_1.buf[2])<<0));
радиоэлектроника - жизнь моя...
Аватара пользователя
DX168B
Друг Кота
Сообщения: 4468
Зарегистрирован: Вс янв 24, 2010 19:19:52
Откуда: Главный Улей России (Moscow)
Контактная информация:

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

Сообщение DX168B »

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

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

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

Или есть более рациональное решение? Высокая точность задержки не нужна.
I am DX168B and this is my favourite forum on internet!
Мастер Ломастер
Поставщик валерьянки для Кота
Сообщения: 1995
Зарегистрирован: Ср май 11, 2011 21:37:45
Откуда: Цветочный город
Контактная информация:

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

Сообщение Мастер Ломастер »

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

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

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

Или есть более рациональное решение? Высокая точность задержки не нужна.
пойдет и так
битва с дураками проиграна, победители торжествуют. слава победителям!
Аватара пользователя
DX168B
Друг Кота
Сообщения: 4468
Зарегистрирован: Вс янв 24, 2010 19:19:52
Откуда: Главный Улей России (Moscow)
Контактная информация:

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

Сообщение DX168B »

ОК. Думаю, что так будет даже лучше. То есть, объявить беззнаковую переменную и в цикле.

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

void delay_s(unsigned int delay)
{
   for(unsigned int i=0; i<delay; i++){_delay_ms(1000);}
}
I am DX168B and this is my favourite forum on internet!
Аватара пользователя
IfoR
Поставщик валерьянки для Кота
Сообщения: 2029
Зарегистрирован: Сб ноя 15, 2008 10:09:56
Откуда: г. Тула
Контактная информация:

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

Сообщение IfoR »

demonchik, нет.
Изображение
/dev/urandom - гигабайты информации.

OS: openSUSE 13.2 (x86_64)
Мастер Ломастер
Поставщик валерьянки для Кота
Сообщения: 1995
Зарегистрирован: Ср май 11, 2011 21:37:45
Откуда: Цветочный город
Контактная информация:

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

Сообщение Мастер Ломастер »

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

void delay_s(unsigned int delay)
{
   for(; delay; delay--){_delay_ms(1000);}
}
вот так будет еще лучше :)))
битва с дураками проиграна, победители торжествуют. слава победителям!
Аватара пользователя
IfoR
Поставщик валерьянки для Кота
Сообщения: 2029
Зарегистрирован: Сб ноя 15, 2008 10:09:56
Откуда: г. Тула
Контактная информация:

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

Сообщение IfoR »

Тогда уж так:

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

void delay_s(unsigned int delay)
{ while (
delay--) _delay_ms(1000); } 
Изображение
/dev/urandom - гигабайты информации.

OS: openSUSE 13.2 (x86_64)
Аватара пользователя
Atmega8
Родился
Сообщения: 12
Зарегистрирован: Пт сен 10, 2010 19:23:22

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

Сообщение 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, но вывода не выставляет.
Вложения
Test I2C.c
(2.03 КБ) 300 скачиваний
Аватара пользователя
DX168B
Друг Кота
Сообщения: 4468
Зарегистрирован: Вс янв 24, 2010 19:19:52
Откуда: Главный Улей России (Moscow)
Контактная информация:

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

Сообщение DX168B »

IfoR писал(а):Тогда уж так:

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

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

О... Точно. :) А я и забыл уже, что с while можно сделать именно таким макаром. :)
То есть и как действие и как условие.
I am DX168B and this is my favourite forum on internet!
Аватара пользователя
romazan
Потрогал лапой паяльник
Сообщения: 335
Зарегистрирован: Чт май 21, 2009 13:54:07
Откуда: Москва
Контактная информация:

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

Сообщение 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;
}
Вложения
encoder.rar
(3.98 КБ) 128 скачиваний
Последний раз редактировалось romazan Ср авг 17, 2011 14:24:01, всего редактировалось 1 раз.
Аватара пользователя
IfoR
Поставщик валерьянки для Кота
Сообщения: 2029
Зарегистрирован: Сб ноя 15, 2008 10:09:56
Откуда: г. Тула
Контактная информация:

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

Сообщение IfoR »

А переменная out чему будет равна, если ни одно из условий не выполнится? :))

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

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

static uchar newZ;
static uchar oldZ;

внести в начало функции, а ещё лучше:

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

uchar newZ;
static uchar oldZ;
Изображение
/dev/urandom - гигабайты информации.

OS: openSUSE 13.2 (x86_64)
Аватара пользователя
Gudd-Head
Друг Кота
Сообщения: 20092
Зарегистрирован: Чт сен 18, 2008 12:27:21
Откуда: Столица Мира Санкт-Петербург

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

Сообщение Gudd-Head »

romazan писал(а):Пртвет всем хвостатым.

Пртвет. Дребезг победили?
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
Аватара пользователя
romazan
Потрогал лапой паяльник
Сообщения: 335
Зарегистрирован: Чт май 21, 2009 13:54:07
Откуда: Москва
Контактная информация:

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

Сообщение romazan »

IfoR писал(а):А переменная out чему будет равна, если ни одно из условий не выполнится? :))

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

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

static uchar newZ;
static uchar oldZ;

внести в начало функции, а ещё лучше:

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

uchar newZ;
static uchar oldZ;

Переместил объявление переменной, назначил uchar out = 0; вроде работать начало, но что-то при прокручивании ручки вправо(или влево) получается так, что ручка сначала крутится вправо а потом влево. Буду глядеть.
Аватара пользователя
IfoR
Поставщик валерьянки для Кота
Сообщения: 2029
Зарегистрирован: Сб ноя 15, 2008 10:09:56
Откуда: г. Тула
Контактная информация:

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

Сообщение 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. Ан-не. Проверил. Вроде работает.
Изображение
/dev/urandom - гигабайты информации.

OS: openSUSE 13.2 (x86_64)
Аватара пользователя
romazan
Потрогал лапой паяльник
Сообщения: 335
Зарегистрирован: Чт май 21, 2009 13:54:07
Откуда: Москва
Контактная информация:

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

Сообщение romazan »

попробовал код, таже хинея, кручу ручку в одну сторону, МК считывает, что попеременно в разные
Аватара пользователя
IfoR
Поставщик валерьянки для Кота
Сообщения: 2029
Зарегистрирован: Сб ноя 15, 2008 10:09:56
Откуда: г. Тула
Контактная информация:

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

Сообщение IfoR »

У вас эта строчка правильно написана (порядок значений правильный)?

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

const uchar greyRight[] = {1302}; 
Изображение
/dev/urandom - гигабайты информации.

OS: openSUSE 13.2 (x86_64)
Аватара пользователя
urry
Сверлит текстолит когтями
Сообщения: 1262
Зарегистрирован: Пн дек 08, 2008 10:58:48
Откуда: Винница
Контактная информация:

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

Сообщение 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;
}
Ответить

Вернуться в «Разные вопросы по МК»