Аlex писал(а):А что, я не прав ?HHIMERA писал(а):Очень смелое заявление...
ПисАли не дураки... а пользователи разные бывают... бывает по ошибке, бывает по недопониманию или незнанию...
Ограничения и нюансы то присутствуют...
Аlex писал(а):А что, я не прав ?HHIMERA писал(а):Очень смелое заявление...
Код: Выделить всё
union{
unsigned char Buffer[100];
struct{
unsigned char Addr;
unsigned char Command;
unsigned char *Data;//элемент переменный длинны
unsigned int *CRC16;
};
}PAKET;Если я правильно понял вопрос, Вас интересует структура вроде [заголовок пакета][тело пакета переменной длины][CRC]?phanis писал(а):Можно ли как нибудить сделать такой союз структуры и массива чтобы при фомировании ответа на запрос (например модбаса но не обязательно) от МК элемент Data был переменной длинны, но при этом элемент СRC был всегда в конце ответа,ну т.е. сам ответ тоже переменной длинны ?
"Гибкий" массив (т.е. массив, размер которого неизвестен во время компиляции) обязан быть последним членом структуры, добавить после него CRC не получится. Вам придется самостоятельно выудить значение CRC как 2 (или 4, или какую Вы там длину CRC используете) последних байта этого массива. Компилятор тут не помощник, он обязан знать смещение каждого члена структуры во время компиляции.As a special case, the last element of a structure with more than one named member may have an incomplete array type; this is called a flexible array member.
Код: Выделить всё
interrupt [2] void INT_0(void) //Обработка прерывания
{
delay_us(10);
ADCSRA = (1 << ADSC);
while ((ADCSRA&(1 << ADIF))== 0);
GET_ADC = (ADCL|ADCH << 8);
...
...операции над значением...
...
}

Код: Выделить всё
delay_us(10);vitalik_1984 писал(а):Для начала не нужно в прерывании ждать пока появится результат ацп, можно сделать запуск ацп, а потом в прерывании ацп считать значениеКод: Выделить всё
delay_us(10);
Код: Выделить всё
iinterrupt [EXT_INT0] void ext_int0_isr(void)
{
ADCSRA = (1 << ADSC);
}
Код: Выделить всё
unsigned int adc_data;
interrupt [ADC_INT] void adc_isr(void)
{
// Read the AD conversion result
adc_data=ADCW;
// Place your code here
}
void main(void)
{...........
..............
while(1){
if(adc_data){
//.........вычисления........
adc_data=0;
}
Код: Выделить всё
EMPTY_INTERRUPT(BADISR_vect)
#define Tmin 40
#define Tmax 68
#define TminK 22
#define TmaxK 34
uint8_t i = 0,j=0;
unsigned char sct_bit = 0;
unsigned char RC5_buffer;
uint8_t centre = 0;
uint8_t not_korr = 0;
unsigned char Timer = 0;
unsigned char command = 0;
void rc5_ti_stop(void)
{
GIMSK|=0x00;
TCCR0B = 0x00;
TCNT0 = 0;
sct_bit = 0;
}
ISR(INT0_vect)
{
Timer = TCNT0;
TCNT0 = 0;
not_korr = 1;
if(sct_bit==0)
{
//PORTD^=(1<<PD4);
TCCR0B = 0x04;
if ((PIND & (1 << PD2)) == 0)
RC5_buffer^=1<<sct_bit;
sct_bit++;
centre = 1;
}
else
{
if ((Timer>TminK)&&(Timer<TmaxK))
{
//PORTD^=(1<<PD5);
if (centre)
{
centre = 0;
not_korr = 0;
}
else
{
centre = 1;
if ((PIND & (1 << PD2)) == 0)
RC5_buffer^=1<<sct_bit;
sct_bit++;
not_korr=0;
}
}
if ((Timer>Tmin)&&(Timer<Tmax))
{
//PORTD^=(1<<PD6);
if ((PIND & (1 << PD2)) == 0)
RC5_buffer^=1<<sct_bit;
sct_bit++;
not_korr = 0;
}
if (not_korr == 1)
{
rc5_ti_stop();
RC5_buffer = 0;
}
if (sct_bit == 14)
{
//PORTD^=(1<<PD4);
command=0;
rc5_ti_stop();
j=0;
for (i=13;i>7;i--)
{
if(bit_is_set(RC5_buffer, i))
command^=1<<j;
j++;
}
RC5_buffer = 0;
EIFR=0x40;
}
}
}
ISR(TIMER0_OVF_vect)
{
rc5_ti_stop();
RC5_buffer = 0;
GIMSK|=0x40;
EIFR=0x40;
} 
eess9 писал(а):Может кто заметит ошибку? Буду признателен.
Код: Выделить всё
EMPTY_INTERRUPT(BADISR_vect)
#define Tmin 40
#define Tmax 68
#define TminK 22
#define TmaxK 34
uint8_t i = 0,j=0;
unsigned char sct_bit = 0;
unsigned char RC5_buffer;
uint8_t centre = 0;
uint8_t not_korr = 0;
unsigned char Timer = 0;
unsigned char command = 0;
void rc5_ti_stop(void)
{
GIMSK|=0x00;
TCCR0B = 0x00;
TCNT0 = 0;
sct_bit = 0;
} Код: Выделить всё
EIFR=0x40;
Код: Выделить всё
GIMSK|=0x00;
menzoda писал(а):Мне необходимо как-то опустить сигнал на свое место. Как можно это сделать?
Goldsmith писал(а):menzoda писал(а):Мне необходимо как-то опустить сигнал на свое место. Как можно это сделать?1. Определяем пиковые значения Umin, Umax.
2. Вычисляем размах сигнала Upp=Umax-Umin и среднее значение Umid=(Umax+Umin)/2.
3. Убираем постоянную составляющую, нормируем амплитуду: Uout=(Uin-Umid)*K/Upp
Хотя лично я предпочел бы убрать постоянную составляющую аппаратно, разделительным конденсатором или трансформатором.
Совершенно верно. Заводим кольцевой буфер на один-два периода, заносим в него разумное количество отсчетов (думаю, 8 или 16 должно хватить).menzoda писал(а):мне понадобится движущееся окно, в котором я буду измерять максимум и минимум.
В кольцевом буфере новое значение автоматически затрет самое старое. А если не делать буфер слишком большим, то и искать в нем не будет накладно. Нам ведь главное - не пропустить верхнюю и нижнюю горизонтальные площадки, несколько отсчетов за период вполне хватит.menzoda писал(а):В голову приходит только вариант с массивом значений (наше окно), добавлением очередного значения, выкидыванием старого, и расчетом новых мин. макс. на всем массиве. Сложновато...
Goldsmith писал(а):menzoda писал(а):Мне необходимо как-то опустить сигнал на свое место. Как можно это сделать?1. Определяем пиковые значения Umin, Umax.
2. Вычисляем размах сигнала Upp=Umax-Umin и среднее значение Umid=(Umax+Umin)/2.
3. Убираем постоянную составляющую, нормируем амплитуду: Uout=(Uin-Umid)*K/Upp
Хотя лично я предпочел бы убрать постоянную составляющую аппаратно, разделительным конденсатором или трансформатором.
В общем случае для произвольного сигнала - конечно, неверный, и придется интегрировать. Но в данном случае это продолжение разговора из другой темы про манчестерское кодирование (наверное, в ней и нужно было продолжать).КРАМ писал(а):алгоритм вычисления среднего неверный.
Для доказательства этого достаточно взять два сигнала, которые дадут по такому алгоритму одинаковый результат, но будут иметь очевидно разные средние значения. Например меандр и очень короткие импульсы той же амплитуды.