Вопросы по С/С++ (СИ)
Re: Вопросы по С/С++ (СИ)
После такой подсказки остается только Уральских пельменей процитировать: "Ну теперь вообще все понятно".
Советую почитать про наследование классов и обратить внимание при этом на конструкторы. Ошибка лежит на поверхности.
Советую почитать про наследование классов и обратить внимание при этом на конструкторы. Ошибка лежит на поверхности.
- vitalik_1984
- Поставщик валерьянки для Кота
- Сообщения: 2482
- Зарегистрирован: Пт авг 27, 2010 05:57:06
- Откуда: Тюмень
- Контактная информация:
Re: Вопросы по С/С++ (СИ)
почитал немного, подумал, что мне не нравится, что имя класса зачем то совпадает с именем функции внутри класса.больше пока не смог осилить.
а конструкция с несколькими точками возможна?
а конструкция с несколькими точками возможна?
В поисках истины человек развивается.
Re: Вопросы по С/С++ (СИ)
Здравствуйте, нужна помощь в вопрове, по битовых масках. Я непонимаю как ее реализовать в примере моего кода. Писал уже на изиелектроникс, но мне уже немного стидно туда писать.
Вапрос, как организовать маску на конструкцыю switch case, где в case стоит константа 0хС0 и 0хС1. Мне нужно поменять несколько бит в главном цыкле инита ацп, но в кейсе стоит целый байт, который мешает мне поменять те биты, которые мне надо. Нужно сделать так чтоб, я мог менять инит в главном цыкле когда захочу и не смотреть, что там в кейсе.
Код: Выделить всё
#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: Вопросы по С/С++ (СИ)
Если я вас правильно понял, то
Код: Выделить всё
switch(ADMUX & 0xXX), где 0xXX - необходимая вам маскаRe: Вопросы по С/С++ (СИ)
Совесть писал(а):Если я вас правильно понял, тоКод: Выделить всё
switch(ADMUX & 0xXX), где 0xXX - необходимая вам маска
Да правильно, так я уже пробовал, програма глохнет на етой маске. Мне нужно 5 старшых бит отрезать для изминения. Но что тогда писать в кейсе?
Re: Вопросы по С/С++ (СИ)
Совесть писал(а):0x07
Тоесть ето маска на ADMUX&0x07, что равно 0b0000 0111, правильно? Тоесть еденицы я теперь могу изменять как захочу , не пугаясь их изменения, они стают как бы невидимеми? Так как оформить правильно кейс?
Re: Вопросы по С/С++ (СИ)
А вот так можно писать код или это через *опу,просто за неимением 2б таймера приходится)
interrupt [TIM2_COMP] void timer2_comp_isr(void)
{
counter++;
TCNT2=0x00;
if(counter==50)
{
counter=0;
RPM=imps*60;
imps=0;
}
}
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: Вопросы по С/С++ (СИ)
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 скачивания
В поисках истины человек развивается.
Re: Вопросы по С/С++ (СИ)
vitalik_1984 писал(а):
А можна обяснить код немного, а то я Си взялся учить гдето месяца 2 назад. Я так понят что тут поочерьодно снимаются показания из всех восьми каналов ацп , правильно ? Вообще то меня больше интересует как оформить кейс в том коде который привел я. Тут мне не хватило смекалки сообразить, как ето замутить. При ввидении маски в switch(ADMUX&0x07), прога глохнет. В кейсе мне нужно ввести условие- константу, при которой будет выполнятся етот кейс. Переменную в кейс вводить нельзя. Как тогда правильно оформлять етот кейс?
Тут находится архив моего проекта:
http://forum.easyelectronics.ru/download/file.php?id=11164
Re: Вопросы по С/С++ (СИ)
ADMUX & 0x07 - результатом этого может быть число от 0 до 7. Соответственно в case вы и должны поместить число от 0 до 7.
Re: Вопросы по С/С++ (СИ)
Совесть писал(а):ADMUX & 0x07 - результатом этого может быть число от 0 до 7. Соответственно в case вы и должны поместить число от 0 до 7.
Вот теперь картина проясняется, вечерком опробую.
Еще вопросик, когда я устанавливаю ету маску ADMUX&0х07 в свитч, то они затирают биты иницыализацыи в главном цыкле? Тоесть до прихода прерывания в ADMUX стоят биты 0b01100000, после преривания биты не станут 0b00000111?
И еще одно, в безконечный цикл whail(1) я установил цыкл мигания светодиода, но светик не мигает, значит нету функцыи выхода из преривания, как заставить работать безконечный чыкл? Пожалуста ответте на все вопросы.
- vitalik_1984
- Поставщик валерьянки для Кота
- Сообщения: 2482
- Зарегистрирован: Пт авг 27, 2010 05:57:06
- Откуда: Тюмень
- Контактная информация:
Re: Вопросы по С/С++ (СИ)
Конкретно для вашей задачи свитч не нужен, это лишние очистки регистров по маске, сравнение с несколькими константами каждый цикл.
А в приведенных примерах получается что число то известно заранее и мы просто его подставляем куда нужно.
Можно сделать если уж сильно хочется свитч( i )
А в приведенных примерах получается что число то известно заранее и мы просто его подставляем куда нужно.
Можно сделать если уж сильно хочется свитч( i )
В поисках истины человек развивается.
Re: Вопросы по С/С++ (СИ)
Совесть писал(а):
vitalik_1984 писал(а):
Спасибо большое за помощь, все вышло, так как я задумывал!
-
demiurg301
- Опытный кот
- Сообщения: 812
- Зарегистрирован: Ср мар 18, 2009 21:14:33
Re: Вопросы по С/С++ (СИ)
товарищи коты , есть вопрос по С.
Понадобилась функция с неопределённым кол-вом аргументов. Сделал по образу и подобию через 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 байта? Это стандарт? Или это условно?
Понадобилась функция с неопределённым кол-вом аргументов. Сделал по образу и подобию через 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: Вопросы по С/С++ (СИ)
Это зависит от конкретного микропроцессора, как он работает со стеком, так оно в stdarg и будет.
А этот кусок ещё и от какого-то компилятора, ещё не поддерживающего long long / int64_t, такие аоргументы оне не разберёт.
А этот кусок ещё и от какого-то компилятора, ещё не поддерживающего long long / int64_t, такие аоргументы оне не разберёт.
Лень в виде мании величия: «ты гений, зачем стараться?». В виде комплекса: «всё равно не выйдет, зачем упираться?». Как логика: «если достаточно, зачем знать и уметь больше?». Цель одна: остановить. Не любит тепло работающих мышц и шум работающего мозга.
-
demiurg301
- Опытный кот
- Сообщения: 812
- Зарегистрирован: Ср мар 18, 2009 21:14:33
Re: Вопросы по С/С++ (СИ)
AVRка.
Среда CVAVR.
Да и double тоже не пройдёт я так понимаю
Хотя сам double присутствует, но такие числа вообще редко нужны...
Среда CVAVR.
Да и double тоже не пройдёт я так понимаю
- eess9
- Вымогатель припоя
- Сообщения: 672
- Зарегистрирован: Ср фев 29, 2012 01:58:32
- Откуда: Харьков, Украина
Re: Вопросы по С/С++ (СИ)
Доброго времени суток всем котам!
Объясните пожалуйста как избавиться от warning в.
Сначала я объявляю переменную EEPROM
Затем на команды записи или считывания из этого самого EEPROM
компилятор ругается вот такой вещью
Все что удалось выгуглить: это несогласованность типов данных в команде. Но как их согласовать?
Объясните пожалуйста как избавиться от 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: Вопросы по С/С++ (СИ)
Скорее всего, компил ругается на несовпадение типов. Переменная имеет тип int, а в ф-ию, скорее всего, нужно передавать указатель на char. Попробуйте так:
Код: Выделить всё
eeprom_write_byte( (char*)&eeprom_TimT0, TimT0 );
TimT0=eeprom_read_byte( (char*)&eeprom_TimT0 );
- avreal
- Опытный кот
- Сообщения: 842
- Зарегистрирован: Чт дек 31, 2009 19:27:45
- Откуда: Бровари, Україна
- Контактная информация:
Re: Вопросы по С/С++ (СИ)
Так ругаться перестанет, но правильно работать не начнёт.
Нужен eeprom_read_wotd для чтения двухбайтового объекта.
Нужен eeprom_read_wotd для чтения двухбайтового объекта.
Лень в виде мании величия: «ты гений, зачем стараться?». В виде комплекса: «всё равно не выйдет, зачем упираться?». Как логика: «если достаточно, зачем знать и уметь больше?». Цель одна: остановить. Не любит тепло работающих мышц и шум работающего мозга.