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

Если ваш вопрос не влез ни в одну из вышеперечисленных тем, вам сюда.
Совесть
Встал на лапы
Сообщения: 106
Зарегистрирован: Пн мар 26, 2012 05:25:06

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

Сообщение Совесть »

После такой подсказки остается только Уральских пельменей процитировать: "Ну теперь вообще все понятно".
Советую почитать про наследование классов и обратить внимание при этом на конструкторы. Ошибка лежит на поверхности.
Аватара пользователя
vitalik_1984
Поставщик валерьянки для Кота
Сообщения: 2482
Зарегистрирован: Пт авг 27, 2010 05:57:06
Откуда: Тюмень
Контактная информация:

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

Сообщение vitalik_1984 »

почитал немного, подумал, что мне не нравится, что имя класса зачем то совпадает с именем функции внутри класса.больше пока не смог осилить.

а конструкция с несколькими точками возможна?
В поисках истины человек развивается.
Leon11t
Родился
Сообщения: 15
Зарегистрирован: Пт сен 17, 2010 00:57:50

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

Сообщение Leon11t »

Здравствуйте, нужна помощь в вопрове, по битовых масках. Я непонимаю как ее реализовать в примере моего кода. Писал уже на изиелектроникс, но мне уже немного стидно туда писать.

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

 
#include <avr/io.h>
#include <avr/interrupt.h>
#include "lcd.h"

int main(void)
 {
 LCDInit(LS_NONE); //Инит LCD
LCDClear();
LCDWriteStringXY(0,0,"ADC0:"); //Выводим шаблон строк названия LCDWriteStringXY(0,1,"ADC1:"); //порта который считываем

ADCSRA |= 3<<ADPS0; //Предделитель примерно на 8МГц
ADMUX |= 1<<ADLAR; //Выравнивание по левой границе
ADCSRA |= 1<<ADIE; //Включаем преривания
ADCSRA |= 1<<ADEN; //Включаем АЦП
ADMUX |= 1<<REFS0 | 1<<REFS1; //Внутренний источник опорного напряжения 2.56 В.

sei(); //Разрешаем глобально преривания.

ADCSRA |= 1<<ADSC; //Запускаем конвертирование первый раз вручную

while (1)
{
}
}
ISR(ADC_vect) //Вектор обработки преривания
{
uint8_t theLow = ADCL; //Переменная на младшый регистр АЦП
uint8_t theTenBitResult = ADCH; //Переменная на старшый регистр АЦП

switch (ADMUX) //Здесь зацыкленная конструкцыя для выбора
{ //из которого канала считывать показания
case 0xC0: //Здесь читаем ADC0
LCDWriteIntXY(6, 0, theTenBitResult, 4);
ADMUX = 0xC1; break;
case 0xC1: //ADC1
LCDWriteIntXY(6, 1, theTenBitResult, 4);
ADMUX = 0xC0;
break;
default: //Default code
break;
}
ADCSRA |= 1<<ADSC;
}


Вапрос, как организовать маску на конструкцыю switch case, где в case стоит константа 0хС0 и 0хС1. Мне нужно поменять несколько бит в главном цыкле инита ацп, но в кейсе стоит целый байт, который мешает мне поменять те биты, которые мне надо. Нужно сделать так чтоб, я мог менять инит в главном цыкле когда захочу и не смотреть, что там в кейсе.
Совесть
Встал на лапы
Сообщения: 106
Зарегистрирован: Пн мар 26, 2012 05:25:06

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

Сообщение Совесть »

Если я вас правильно понял, то

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

switch(ADMUX & 0xXX), где 0xXX - необходимая вам маска
Leon11t
Родился
Сообщения: 15
Зарегистрирован: Пт сен 17, 2010 00:57:50

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

Сообщение Leon11t »

Совесть писал(а):Если я вас правильно понял, то

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

switch(ADMUX & 0xXX), где 0xXX - необходимая вам маска

Да правильно, так я уже пробовал, програма глохнет на етой маске. Мне нужно 5 старшых бит отрезать для изминения. Но что тогда писать в кейсе?
Совесть
Встал на лапы
Сообщения: 106
Зарегистрирован: Пн мар 26, 2012 05:25:06

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

Сообщение Совесть »

0x07
Leon11t
Родился
Сообщения: 15
Зарегистрирован: Пт сен 17, 2010 00:57:50

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

Сообщение Leon11t »

Совесть писал(а):0x07

Тоесть ето маска на ADMUX&0x07, что равно 0b0000 0111, правильно? Тоесть еденицы я теперь могу изменять как захочу , не пугаясь их изменения, они стают как бы невидимеми? Так как оформить правильно кейс?
mich91
Встал на лапы
Сообщения: 95
Зарегистрирован: Ср ноя 02, 2011 15:11:49

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

Сообщение mich91 »

А вот так можно писать код или это через *опу,просто за неимением 2б таймера приходится)
interrupt [TIM2_COMP] void timer2_comp_isr(void)
{
counter++;
TCNT2=0x00;

if(counter==50)
{

counter=0;
RPM=imps*60;
imps=0;
}

}
Аватара пользователя
vitalik_1984
Поставщик валерьянки для Кота
Сообщения: 2482
Зарегистрирован: Пт авг 27, 2010 05:57:06
Откуда: Тюмень
Контактная информация:

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

Сообщение vitalik_1984 »

Leon11t писал(а): Так как оформить правильно кейс?

Никак не оформить
в кейсе можно только целые числа, либо такие вычисления, которые компилятор сможет посчитать при компиляции кода.
Совесть писал(а):0x07

Совесть вроде мудрый чувак, а такому учит...Где информативность кода?
Берем пример из того же Код вижна

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

#define FIRST_ADC_INPUT 1
#define LAST_ADC_INPUT 5
unsigned char adc_data[LAST_ADC_INPUT-FIRST_ADC_INPUT+1];
#define ADC_VREF_TYPE 0xE0

interrupt [ADC_INT] void adc_isr(void)
{
static unsigned char input_index=0;
// Read the 8 most significant bits
// of the AD conversion result
adc_data[input_index]=ADCH;
// Select next ADC input
if (++input_index > (LAST_ADC_INPUT-FIRST_ADC_INPUT))
   input_index=0;
ADMUX=(FIRST_ADC_INPUT | (ADC_VREF_TYPE & 0xff))+input_index;
// Delay needed for the stabilization of the ADC input voltage
delay_us(10);
// Start the AD conversion
ADCSRA|=0x40;
}
 

Дорабатываем и получаем вот:
правда вы не прикрепили вашу библиотеку LCD.h.
Вложения
ADC_LCD.rar
(5.78 КБ) 164 скачивания
В поисках истины человек развивается.
Leon11t
Родился
Сообщения: 15
Зарегистрирован: Пт сен 17, 2010 00:57:50

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

Сообщение Leon11t »

vitalik_1984 писал(а):

А можна обяснить код немного, а то я Си взялся учить гдето месяца 2 назад. Я так понят что тут поочерьодно снимаются показания из всех восьми каналов ацп , правильно ? Вообще то меня больше интересует как оформить кейс в том коде который привел я. Тут мне не хватило смекалки сообразить, как ето замутить. При ввидении маски в switch(ADMUX&0x07), прога глохнет. В кейсе мне нужно ввести условие- константу, при которой будет выполнятся етот кейс. Переменную в кейс вводить нельзя. Как тогда правильно оформлять етот кейс?

Тут находится архив моего проекта:
http://forum.easyelectronics.ru/download/file.php?id=11164
Совесть
Встал на лапы
Сообщения: 106
Зарегистрирован: Пн мар 26, 2012 05:25:06

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

Сообщение Совесть »

ADMUX & 0x07 - результатом этого может быть число от 0 до 7. Соответственно в case вы и должны поместить число от 0 до 7.
Leon11t
Родился
Сообщения: 15
Зарегистрирован: Пт сен 17, 2010 00:57:50

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

Сообщение Leon11t »

Совесть писал(а):ADMUX & 0x07 - результатом этого может быть число от 0 до 7. Соответственно в case вы и должны поместить число от 0 до 7.

Вот теперь картина проясняется, вечерком опробую.
Еще вопросик, когда я устанавливаю ету маску ADMUX&0х07 в свитч, то они затирают биты иницыализацыи в главном цыкле? Тоесть до прихода прерывания в ADMUX стоят биты 0b01100000, после преривания биты не станут 0b00000111?
И еще одно, в безконечный цикл whail(1) я установил цыкл мигания светодиода, но светик не мигает, значит нету функцыи выхода из преривания, как заставить работать безконечный чыкл? Пожалуста ответте на все вопросы.
Аватара пользователя
vitalik_1984
Поставщик валерьянки для Кота
Сообщения: 2482
Зарегистрирован: Пт авг 27, 2010 05:57:06
Откуда: Тюмень
Контактная информация:

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

Сообщение vitalik_1984 »

Конкретно для вашей задачи свитч не нужен, это лишние очистки регистров по маске, сравнение с несколькими константами каждый цикл.
А в приведенных примерах получается что число то известно заранее и мы просто его подставляем куда нужно.

Можно сделать если уж сильно хочется свитч( i )
В поисках истины человек развивается.
Leon11t
Родился
Сообщения: 15
Зарегистрирован: Пт сен 17, 2010 00:57:50

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

Сообщение Leon11t »

Совесть писал(а):
vitalik_1984 писал(а):


Спасибо большое за помощь, все вышло, так как я задумывал!
demiurg301
Опытный кот
Сообщения: 812
Зарегистрирован: Ср мар 18, 2009 21:14:33

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

Сообщение demiurg301 »

товарищи коты , есть вопрос по С.
Понадобилась функция с неопределённым кол-вом аргументов. Сделал по образу и подобию через stdarg.
Работает. Но это не по-котовски.
Я не понял сам код , частично, внутри stdarg

typedef char *va_list;

#define va_start(ap,v) ap=(va_list) &v-sizeof(long)
#define va_arg(ap,t) (ap-=sizeof(long), (t) ((long *) ap)[1])
#define va_end(ap)


Точнее почему мы работаем со стеком по 4 байта?
Почему адресация аргументов функции идёт по 4 байта? Это стандарт? Или это условно?
Аватара пользователя
avreal
Опытный кот
Сообщения: 842
Зарегистрирован: Чт дек 31, 2009 19:27:45
Откуда: Бровари, Україна
Контактная информация:

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

Сообщение avreal »

Это зависит от конкретного микропроцессора, как он работает со стеком, так оно в stdarg и будет.

А этот кусок ещё и от какого-то компилятора, ещё не поддерживающего long long / int64_t, такие аоргументы оне не разберёт.
Лень в виде мании величия: «ты гений, зачем стараться?». В виде комплекса: «всё равно не выйдет, зачем упираться?». Как логика: «если достаточно, зачем знать и уметь больше?». Цель одна: остановить. Не любит тепло работающих мышц и шум работающего мозга.
demiurg301
Опытный кот
Сообщения: 812
Зарегистрирован: Ср мар 18, 2009 21:14:33

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

Сообщение demiurg301 »

AVRка.
Среда CVAVR. :))
Да и double тоже не пройдёт я так понимаю :) Хотя сам double присутствует, но такие числа вообще редко нужны...
Аватара пользователя
eess9
Вымогатель припоя
Сообщения: 672
Зарегистрирован: Ср фев 29, 2012 01:58:32
Откуда: Харьков, Украина

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

Сообщение eess9 »

Доброго времени суток всем котам!
Объясните пожалуйста как избавиться от warning в.
Сначала я объявляю переменную EEPROM

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

volatile unsigned int eeprom_TimT0 EEMEM;

Затем на команды записи или считывания из этого самого EEPROM

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

eeprom_write_byte(&eeprom_TimT0,TimT0);

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

TimT0=eeprom_read_byte(&eeprom_TimT0);

компилятор ругается вот такой вещью
../Tiny25_for_back.c:37: warning: passing argument 1 of '__eewr_byte_tn25' from incompatible pointer type

Все что удалось выгуглить: это несогласованность типов данных в команде. Но как их согласовать?
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

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

Сообщение Аlex »

Скорее всего, компил ругается на несовпадение типов. Переменная имеет тип int, а в ф-ию, скорее всего, нужно передавать указатель на char. Попробуйте так:

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

eeprom_write_byte( (char*)&eeprom_TimT0, TimT0 );

TimT0=eeprom_read_byte( (char*)&eeprom_TimT0 );
Аватара пользователя
avreal
Опытный кот
Сообщения: 842
Зарегистрирован: Чт дек 31, 2009 19:27:45
Откуда: Бровари, Україна
Контактная информация:

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

Сообщение avreal »

Так ругаться перестанет, но правильно работать не начнёт.
Нужен eeprom_read_wotd для чтения двухбайтового объекта.
Лень в виде мании величия: «ты гений, зачем стараться?». В виде комплекса: «всё равно не выйдет, зачем упираться?». Как логика: «если достаточно, зачем знать и уметь больше?». Цель одна: остановить. Не любит тепло работающих мышц и шум работающего мозга.
Ответить

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