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

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

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

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

Сообщение vitalik_1984 »

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

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

Сообщение 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

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

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

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

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

Сообщение Leon11t »

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

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

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

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

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

Сообщение Leon11t »

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

Сообщение mich91 »

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

if(counter==50)
{

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

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

Сообщение 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 скачивания
В поисках истины человек развивается.
Контактная информация:
Родился
Сообщения: 15
Зарегистрирован: Пт сен 17, 2010 00:57:50

Сообщение Leon11t »

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

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

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

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

Сообщение Leon11t »

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

Сообщение vitalik_1984 »

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

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

Сообщение Leon11t »

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

Сообщение 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 байта? Это стандарт? Или это условно?
Опытный кот
Аватара пользователя
Сообщения: 842
Зарегистрирован: Чт дек 31, 2009 19:27:45
Откуда: Бровари, Україна

Сообщение avreal »

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

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

Сообщение demiurg301 »

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

Сообщение 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
Все что удалось выгуглить: это несогласованность типов данных в команде. Но как их согласовать?
Модератор
Аватара пользователя
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля

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

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

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

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

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

Сообщение avreal »

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

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