Свежие обсуждения
Микроконтроллеры

AVR начинающим - вопросы и ответы

1 41 68

Ну , я ,типа того, и делал
ptrMax = &(display.struc_dsp.u_scale.m_scale[4-NumByte]);

но так ему тип не нравится : Error[Pe513]: a value of type "unsigned char *" cannot be assigned to an entity of type "display *"

ptrMax = (display*)&(display.struc_dsp.u_scale.m_scale[4-NumByte]);

а так вообще все :Error[Pe029]: expected an expression

 

Дайте фрагмент полностью.

 

По частям он тут уже был
Присоединю их файлом.

213785.txt

 

У вас несколько ошибок наблюдается

1) union DSP не поименован, куда обращаться, на деревню дедушке ?
2) Нельзя использовать указатель на структуру для адресации элемента этой структуры
3) В референсе должны быть имена всех уровней
4) Не уверен, что вы хотите использовать 5 элементов scale, каждый из которых - структура
5) break используется в циклах, но не в операторе if

Вот портированный код, который работает на дсп Ф2808
struct DISP
{
union DSP
{
unsigned char screen[15];
struct ALL
{
struct MOD mode ;
unsigned char number[8] ;
union U_BAT battery ;
union U_SC u_scale ;
}struc_dsp;
}dsp;
};

void main()
{
struct DISP display;
struct DISP *ptrMax;
unsigned char *charptr;
int letter,NumByte=2;
int PressRes=3,MaxPress=2;
int *intptr=&PressRes;
int MaxUrov=0x13;
if(PressRes>MaxPress)
{
ptrMax=&display;
charptr=&display.dsp.struc_dsp.u_scale.m_scale[4-NumByte];
letter=display.dsp.screen[10]; //прямой референс
*charptr|=letter;
MaxUrov=0x03;
}
else
{
*intptr |= MaxUrov;
}
}

 

GM: else
{
*intptr |= MaxUrov;
}
}

Может вместо *intptr должно быть *charptr ?
Иначе, это совсем не то.

GM: 5) break используется в циклах,
Случайно(в панике) попал из switch

4) Не уверен, что вы хотите использовать 5 элементов scale, каждый из которых - структура
По началу хотел, но сейчас может уберу за ненадобностью.
1) union DSP не поименован, куда обращаться, на деревню дедушке ?
А по шаблону нельзя?

2) Нельзя использовать указатель на структуру для адресации элемента этой структуры
А вот это мне непонятно , по логике адрес он и в Африке... , а о размерах элементов видно по шаблону.
Спасибо, за участие.

А сделать надо всего лишь это:
display.dsp.struc_dsp.u_scale.m_scale[4-NumByte]=0x03;
if (PressRes>MaxPress){
MaxByte = (4-NumByte);
MaxUrov= 0x03;
}
else
display.dsp.struc_dsp.u_scale.m_scale[MaxByte] |= MaxUrov;
но хотелось с использованием указателей.

 

Alexey: но хотелось с использованием указателей

Внимательнее смотрим, в программе это есть:

*charptr |= letter;

 

GM: в программе это есть:

*charptr |= letter;
Не, мой моск не понимать .
Я , типа, начинающий.
Можно прокомментировать подробнее?
ptrMax=&display; - не понятно зачем вообще это
charptr=&display.dsp.struc_dsp.u_scale.m_scale[4-NumByte]; Ну, это получение адреса байта, что ,собственно у меня, и не катит.
letter=display.dsp.screen[10]; //прямой референс Здесь индекс , возможно , должен быть 12 , ну всеравно не понятно зачем мне это значение
*charptr|=letter; - еще боле не понятно ИЛИ одного и того же .
MaxUrov=0x03;
}
else
{
*intptr |= MaxUrov; - не понятно зачем вообще

Вообщем все заиграло :
unsigned char *ptrMax ;

if (PressRes>MaxPress){
ptrMax = &display.dsp.struc_dsp.u_scale.m_scale[4-NumByte];
MaxUrov= 0x03;
}
else
*ptrMax |= MaxUrov;
ИАР больше не ругается , причина его недовольства так мне и не понятна . Возможно , ПУТЬ был не верным .

 

Alexey: GM: в программе это есть: *charptr |= letter;
Не, мой моск не понимать. Я, типа, начинающий. Можно прокомментировать подробнее?

В примере я вам выделил необходимое, увы, кроме последнего оператора *charptr |= letter, который эквивалентен оператору *charptr = *charptr | letter. Всё остальное лишь пример применения.

Ну а *charptr в си означает значение переменной, на которую указывает charptr.

Если charptr = &display.dsp.struc_dsp.u_scale.m_scale[4-NumByte], то в/у оператор эквавалентен следующему

m_scale[4-NumByte] = m_scale[4-NumByte] | letter

Надеюсь, теперь стало понятнее?

 

GM: Надеюсь, теперь стало понятнее?

GM: *charptr |= letter, который эквивалентен оператору *charptr = *charptr | letter.

Ну а *charptr в си означает значение переменной, на которую указывает charptr.
Это все понятно, не понятно было letter, в моем случае должен быть MaxUrov.

GM: Всё остальное лишь пример применения.
А я искал тайный смысл.

 

Теперь проблема с АЦП.
Мне надо циклически мерять два напряжения. Реально меряется только одно -нулевого канала. По 1 каналу , результат тот же.
Если закоротить вход 1 кн. - ничего не меняется. Если включить на оба измерения 1 кан. - правильно показыает напряжение 1 кан.
Пробовал симулировать в Студии, все нормально.
PS Какая-то хрень , "проглатываются " значки сдвигов.
void ADC_Init (void){
DIDR0 = (1<<ADC2D | 1 <

ADCSRA = (1<};

unsigned char Filter ( struct data *ptr){
ptr->Sum -= ptr->tmp[ind];
ptr->tmp[ind]= ADCH;
ptr->Sum += ptr->tmp[ind];
return ((unsigned char)((ptr->Sum /8)));
};
void GetADC (unsigned char NumCh){
ADMUX= ((1ADLAR) | NumChMUX0);
__delay_cycles( 360 );
ADCSRA |= (1ADSC); // START
while (!ADIF);
ADCSRA |= (1ADIF);
};

void Measure (void){

GetADC (0);

// ADMUX = ((1ADLAR) | 0MUX0);
//__delay_cycles( 360 );
// ADCSRA |= (1ADSC); // START
// while (!ADIF);
// ADCSRA |= (1ADIF);
// ADMUX=0x21;

PressRes=Filter (&Press);
GetADC (1);

// ADMUX=0x21;// ((1ADLAR) | 1MUX0);
//__delay_cycles( 360 );
// ADCSRA |= (1ADSC); // START
// while (!ADIF);
// ADCSRA |= (1ADIF);
// ADMUX=0x20;

VoltRes=Filter (&Volt);
....................