|
|
|
|
Ну , я ,типа того, и делал 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); .................... |
|
|
|
|