Советую почитать про наследование классов и обратить внимание при этом на конструкторы. Ошибка лежит на поверхности.
Вопросы по С/С++ (СИ)
- Сообщения: 106
- Зарегистрирован: Пн мар 26, 2012 05:25:06
После такой подсказки остается только Уральских пельменей процитировать: "Ну теперь вообще все понятно".
Советую почитать про наследование классов и обратить внимание при этом на конструкторы. Ошибка лежит на поверхности.
Советую почитать про наследование классов и обратить внимание при этом на конструкторы. Ошибка лежит на поверхности.
- Реклама
почитал немного, подумал, что мне не нравится, что имя класса зачем то совпадает с именем функции внутри класса.больше пока не смог осилить.
а конструкция с несколькими точками возможна?
а конструкция с несколькими точками возможна?
В поисках истины человек развивается.
- Сообщения: 15
- Зарегистрирован: Пт сен 17, 2010 00:57:50
Здравствуйте, нужна помощь в вопрове, по битовых масках. Я непонимаю как ее реализовать в примере моего кода. Писал уже на изиелектроникс, но мне уже немного стидно туда писать.
Вапрос, как организовать маску на конструкцыю 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;
} - Сообщения: 106
- Зарегистрирован: Пн мар 26, 2012 05:25:06
Если я вас правильно понял, то
Код: Выделить всё
switch(ADMUX & 0xXX), где 0xXX - необходимая вам маска- Сообщения: 15
- Зарегистрирован: Пт сен 17, 2010 00:57:50
Да правильно, так я уже пробовал, програма глохнет на етой маске. Мне нужно 5 старшых бит отрезать для изминения. Но что тогда писать в кейсе?Совесть писал(а):Если я вас правильно понял, тоКод: Выделить всё
switch(ADMUX & 0xXX), где 0xXX - необходимая вам маска
- Реклама
- Сообщения: 106
- Зарегистрирован: Пн мар 26, 2012 05:25:06
- Сообщения: 15
- Зарегистрирован: Пт сен 17, 2010 00:57:50
Тоесть ето маска на ADMUX&0x07, что равно 0b0000 0111, правильно? Тоесть еденицы я теперь могу изменять как захочу , не пугаясь их изменения, они стают как бы невидимеми? Так как оформить правильно кейс?Совесть писал(а):0x07
- Сообщения: 95
- Зарегистрирован: Ср ноя 02, 2011 15:11:49
А вот так можно писать код или это через *опу,просто за неимением 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;
}
}
Никак не оформить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
А можна обяснить код немного, а то я Си взялся учить гдето месяца 2 назад. Я так понят что тут поочерьодно снимаются показания из всех восьми каналов ацп , правильно ? Вообще то меня больше интересует как оформить кейс в том коде который привел я. Тут мне не хватило смекалки сообразить, как ето замутить. При ввидении маски в switch(ADMUX&0x07), прога глохнет. В кейсе мне нужно ввести условие- константу, при которой будет выполнятся етот кейс. Переменную в кейс вводить нельзя. Как тогда правильно оформлять етот кейс?vitalik_1984 писал(а):
Тут находится архив моего проекта:
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
Вот теперь картина проясняется, вечерком опробую.Совесть писал(а):ADMUX & 0x07 - результатом этого может быть число от 0 до 7. Соответственно в case вы и должны поместить число от 0 до 7.
Еще вопросик, когда я устанавливаю ету маску ADMUX&0х07 в свитч, то они затирают биты иницыализацыи в главном цыкле? Тоесть до прихода прерывания в ADMUX стоят биты 0b01100000, после преривания биты не станут 0b00000111?
И еще одно, в безконечный цикл whail(1) я установил цыкл мигания светодиода, но светик не мигает, значит нету функцыи выхода из преривания, как заставить работать безконечный чыкл? Пожалуста ответте на все вопросы.
Конкретно для вашей задачи свитч не нужен, это лишние очистки регистров по маске, сравнение с несколькими константами каждый цикл.
А в приведенных примерах получается что число то известно заранее и мы просто его подставляем куда нужно.
Можно сделать если уж сильно хочется свитч( i )
А в приведенных примерах получается что число то известно заранее и мы просто его подставляем куда нужно.
Можно сделать если уж сильно хочется свитч( i )
В поисках истины человек развивается.
- Сообщения: 15
- Зарегистрирован: Пт сен 17, 2010 00:57:50
Совесть писал(а):
Спасибо большое за помощь, все вышло, так как я задумывал!vitalik_1984 писал(а):
- Сообщения: 812
- Зарегистрирован: Ср мар 18, 2009 21:14:33
товарищи коты , есть вопрос по С.
Понадобилась функция с неопределённым кол-вом аргументов. Сделал по образу и подобию через 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 байта? Это стандарт? Или это условно?
Это зависит от конкретного микропроцессора, как он работает со стеком, так оно в stdarg и будет.
А этот кусок ещё и от какого-то компилятора, ещё не поддерживающего long long / int64_t, такие аоргументы оне не разберёт.
А этот кусок ещё и от какого-то компилятора, ещё не поддерживающего long long / int64_t, такие аоргументы оне не разберёт.
Лень в виде мании величия: «ты гений, зачем стараться?». В виде комплекса: «всё равно не выйдет, зачем упираться?». Как логика: «если достаточно, зачем знать и уметь больше?». Цель одна: остановить. Не любит тепло работающих мышц и шум работающего мозга.
- Сообщения: 812
- Зарегистрирован: Ср мар 18, 2009 21:14:33
AVRка.
Среда CVAVR.
Да и double тоже не пройдёт я так понимаю
Хотя сам double присутствует, но такие числа вообще редко нужны...
Среда CVAVR.
Да и double тоже не пройдёт я так понимаю
Доброго времени суток всем котам!
Объясните пожалуйста как избавиться от warning в.
Сначала я объявляю переменную EEPROM
Затем на команды записи или считывания из этого самого EEPROM
компилятор ругается вот такой вещью
Объясните пожалуйста как избавиться от warning в.
Сначала я объявляю переменную EEPROM
Код: Выделить всё
volatile unsigned int eeprom_TimT0 EEMEM;Код: Выделить всё
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
Скорее всего, компил ругается на несовпадение типов. Переменная имеет тип int, а в ф-ию, скорее всего, нужно передавать указатель на char. Попробуйте так:
Код: Выделить всё
eeprom_write_byte( (char*)&eeprom_TimT0, TimT0 );
TimT0=eeprom_read_byte( (char*)&eeprom_TimT0 );
Так ругаться перестанет, но правильно работать не начнёт.
Нужен eeprom_read_wotd для чтения двухбайтового объекта.
Нужен eeprom_read_wotd для чтения двухбайтового объекта.
Лень в виде мании величия: «ты гений, зачем стараться?». В виде комплекса: «всё равно не выйдет, зачем упираться?». Как логика: «если достаточно, зачем знать и уметь больше?». Цель одна: остановить. Не любит тепло работающих мышц и шум работающего мозга.


