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

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

Добавлено: Сб июн 30, 2012 20:02:50
Совесть
После такой подсказки остается только Уральских пельменей процитировать: "Ну теперь вообще все понятно".
Советую почитать про наследование классов и обратить внимание при этом на конструкторы. Ошибка лежит на поверхности.

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

Добавлено: Сб июн 30, 2012 23:14:19
vitalik_1984
почитал немного, подумал, что мне не нравится, что имя класса зачем то совпадает с именем функции внутри класса.больше пока не смог осилить.

а конструкция с несколькими точками возможна?

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

Добавлено: Ср июл 04, 2012 13:29:35
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. Мне нужно поменять несколько бит в главном цыкле инита ацп, но в кейсе стоит целый байт, который мешает мне поменять те биты, которые мне надо. Нужно сделать так чтоб, я мог менять инит в главном цыкле когда захочу и не смотреть, что там в кейсе.

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

Добавлено: Ср июл 04, 2012 13:49:27
Совесть
Если я вас правильно понял, то

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

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

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

Добавлено: Ср июл 04, 2012 14:10:49
Leon11t
Совесть писал(а):Если я вас правильно понял, то

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

switch(ADMUX & 0xXX), где 0xXX - необходимая вам маска
Да правильно, так я уже пробовал, програма глохнет на етой маске. Мне нужно 5 старшых бит отрезать для изминения. Но что тогда писать в кейсе?

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

Добавлено: Ср июл 04, 2012 14:12:25
Совесть
0x07

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

Добавлено: Ср июл 04, 2012 15:06:18
Leon11t
Совесть писал(а):0x07
Тоесть ето маска на ADMUX&0x07, что равно 0b0000 0111, правильно? Тоесть еденицы я теперь могу изменять как захочу , не пугаясь их изменения, они стают как бы невидимеми? Так как оформить правильно кейс?

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

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

if(counter==50)
{

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

}

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

Добавлено: Чт июл 05, 2012 21:11:19
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.

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

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

Тут находится архив моего проекта:
http://forum.easyelectronics.ru/downloa ... p?id=11164

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

Добавлено: Пт июл 06, 2012 13:22:17
Совесть
ADMUX & 0x07 - результатом этого может быть число от 0 до 7. Соответственно в case вы и должны поместить число от 0 до 7.

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

Добавлено: Пт июл 06, 2012 14:08:10
Leon11t
Совесть писал(а):ADMUX & 0x07 - результатом этого может быть число от 0 до 7. Соответственно в case вы и должны поместить число от 0 до 7.
Вот теперь картина проясняется, вечерком опробую.
Еще вопросик, когда я устанавливаю ету маску ADMUX&0х07 в свитч, то они затирают биты иницыализацыи в главном цыкле? Тоесть до прихода прерывания в ADMUX стоят биты 0b01100000, после преривания биты не станут 0b00000111?
И еще одно, в безконечный цикл whail(1) я установил цыкл мигания светодиода, но светик не мигает, значит нету функцыи выхода из преривания, как заставить работать безконечный чыкл? Пожалуста ответте на все вопросы.

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

Добавлено: Пт июл 06, 2012 21:26:09
vitalik_1984
Конкретно для вашей задачи свитч не нужен, это лишние очистки регистров по маске, сравнение с несколькими константами каждый цикл.
А в приведенных примерах получается что число то известно заранее и мы просто его подставляем куда нужно.

Можно сделать если уж сильно хочется свитч( i )

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

Добавлено: Сб июл 07, 2012 01:02:44
Leon11t
Совесть писал(а):
vitalik_1984 писал(а):
Спасибо большое за помощь, все вышло, так как я задумывал!

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

Добавлено: Пт июл 13, 2012 11:55:46
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 байта? Это стандарт? Или это условно?

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

Добавлено: Пт июл 13, 2012 12:00:24
avreal
Это зависит от конкретного микропроцессора, как он работает со стеком, так оно в stdarg и будет.

А этот кусок ещё и от какого-то компилятора, ещё не поддерживающего long long / int64_t, такие аоргументы оне не разберёт.

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

Добавлено: Пт июл 13, 2012 13:48:56
demiurg301
AVRка.
Среда CVAVR. :))
Да и double тоже не пройдёт я так понимаю :) Хотя сам double присутствует, но такие числа вообще редко нужны...

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

Добавлено: Вс июл 22, 2012 11:00:27
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
Все что удалось выгуглить: это несогласованность типов данных в команде. Но как их согласовать?

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

Добавлено: Вс июл 22, 2012 11:44:54
Аlex
Скорее всего, компил ругается на несовпадение типов. Переменная имеет тип int, а в ф-ию, скорее всего, нужно передавать указатель на char. Попробуйте так:

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

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

TimT0=eeprom_read_byte( (char*)&eeprom_TimT0 );

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

Добавлено: Вс июл 22, 2012 13:48:32
avreal
Так ругаться перестанет, но правильно работать не начнёт.
Нужен eeprom_read_wotd для чтения двухбайтового объекта.