Перейти к содержанию
    

deus97

Участник
  • Постов

    20
  • Зарегистрирован

  • Посещение

Репутация

0 Обычный

Информация о deus97

  • Звание
    Участник
    Участник
  • День рождения 21.04.1986

Контакты

  • Сайт
    Array
  • ICQ
    Array

Информация

  • Город
    Array
  1. Чтоб не создавать новую тему, спрошу здесь. Необходимо преобразовать синхронный RS232C в ethernet, а на приёмной стороне ethernet в асинхронный RS232, так вот если с приёмной стороной всё понятно (есть куча готовых конвертеров), то с передатчиком проблема. Может ткнёте в готовый конвертер синхронный RS232 -> ethernet?
  2. Всем спасибо отловил место зависания весьма нехитрым способом: наставил в коде несколько меток, которые устанавливались при выполнении конкретной части кода, при зависании WDT давал прерывание, в обработчике которого значения меток сливались в eeprom, далее происходит ресет по WDT и слив полученных меток в сеть при старте программы. Соответственно, последняя активированная метка перед не активированной и показала место зависания.
  3. UART не предусмотрен, поэтому хотелось бы использовать имеющийся ethernet интерфейс, возможно ли, например по прерыванию от вотчдога, сохранить в еепром какую-то информацию о месте где была программа в момент этого прерывания, чтоб после перезагрузки передать её по сети? Например значение программного счётчика? Как в CVAVR обратиться к этому счётчику? Просто давно это уже было и сейчас приходится заново вникать:(
  4. В общем, где-то год назад было сделано устройство на ATmega168, которое нормально работает, но вот обнаружилось, что оно периодически (до 5 раз в день) программно зависает и перезагружается по сторожевому таймеру. Как определить где именно зависает? Устройство имеет светодиод, но им отлаживать, учитывая частоту зависания, не хочется. Есть выход в локальную сеть для передачи UDP-пакетов, в режиме прерывания по watchdog всё вполне работоспособно, как узнать в каком месте зависает? Программа написана на CVAVR. Заранее спасибо.
  5. Недавно закончил работу над подобным устройством, но элементная база другая - ATmega168 и ENC28j60. Вкратце - в силовом шкафу устанавливается плата, устройство измеряет напряжение по 3-м фазам и контролирует до 11-ти точек в электрической схеме, затем информация передаётся через интернет, либо локальную сеть на сервер, где графически отображается сменному инженеру предприятия. Сейчас работает уже 6 таких плат 5 в локальной сети и одна через интернет. На такой же элементной базе могу сделать устройство под ваши нужды.
  6. Нашёл вот такой вот БП http://step-el.com.ua/e-store/power/elemen...ELEMENT_ID=5221, вроде то же, что и зарядник, но гарантия 2 года. Насчёт рассеиваемой на стабилизаторе мощности знаю, с тем учётом и выбрал питание 5В, т.к. с учётом типового падения на стабилизаторе 1,5В, как раз и получается 4,8В, минимальный нагрев будет.
  7. Необходимо питать устройство стабильным напряжением 3.3В, ток макс 300мА , 150-200мА продолжительно. Пилотный образец уже готов и в процессе отладки работал ежедневно по 8 часов с питанием от мобильного зарядника (5.5В, 500мА), через стабилизатор 3.3В (LD33V). Теперь необходимо определится с постоянной схемой питания, думаю оставить как есть, но зарядник разобрать и его плату прикрепить к плате устройства. Работа предполагается круглосуточная, непрерывная в течении многих и многих лет:) Есть какие-либо противопоказания такому решению? Может посоветуете что-либо более дешевое/надёжное/простое? Предполагается создание 5-ти аналогичных устройств. И ещё, напишите кто какие знает стабилизаторы напряжения 3.3В на ток более 300мА (их точную маркировку), а то LD33V не могу больше найти, а других в ассортименте инет магазинов не попадается. Заранее спасибо!
  8. Работает уже сутки без сбоев, всем большое спасибо за помощь!
  9. Объявил массив в месте его использования, функции передаю указатель. Сегодня утром прошился, уже 1,5 часа полёт нормальный, надо ещё погонять, потом отпишусь.
  10. Goodefine, попробую, но определено, что проблема не возникает, если перед самым return'ом из get_adc_data(), сбросить TCNT2, т.е. чтобы прерывание точно не попало на кусок с указателями. Из while(1), если TOV1 не установлен... никак не выходит... признаю свою вину. "А стек увеличивать пробовали?.." - нет, а как?:) _Pasha, можно и так, а что это даст, если я правильно понимаю, то просто добавится ещё один прыжок, а время обработки прерывания останется тем же? Sergey Reva, очень логично, сделаю, спасибо.
  11. 1) pointer точно не используется в прерывании. i объявлена в начале main(), да и не на i подозрения т.к. сегодня отловил, что та же проблема, но реже, возникает если вырубать прерывания только на кусок с циклом for. Т.е. портится указатель даже на строке pointer=get_adc_data(); 2) нет, размер service_msg не превышаю. Привожу код get_adc_data(): unsigned int* get_adc_data(void) { unsigned char i; unsigned int adc_data=0; unsigned int analog_vals_arr[6]={0,0,0,0,0,0}; // ADC Clock frequency: 130,156 kHz ADCSRA=0x86;// ADC enable; ADC int.disable; prescaler=64 TCCR1B=0x00; TCNT1H=0x00; TCNT1L=0x00; TCCR1B=0x03;// clk/64 do{ for (i=0; i<6; i++) { ADMUX&=0b11110000; ADMUX|=i; ADCSRA|=0x40; while(!(ADCSRA & (1<<ADIF))); ADCSRA|=(1<<ADIF); adc_data=ADCW; check(adc_data, i); }; // check timer1 overflow flag if (TIFR &= (1<<TOV1)) { TCCR1B=0x00; TCNT1H=0x00; TCNT1L=0x00; TIFR |= (1<<TOV1); timer1(analog_vals_arr); break; }; } while(1); ADCSRA clrb(ADEN);//stop ADC return (analog_vals_arr); } функция timer1 получает указатель analog_vals_arr и заполняет массив необходимыми значениями
  12. Написал вот такой код: interrupt [TIM2_OVF] void timer2_ovf_isr(void) { // Stop timer TCCR2=0x00; if(get_incoming_pkt()==3){ switch (check_command(myip)) { case 0: strcpyf(service_msg, "Micro_device#0:not_a_command"); service_msg[13]=device_id; send_to_server(service_msg, service_msg_len); break; case 1: init_ip_arp_udp(mymac,myip); strcpyf(service_msg, "Micro_device#0:IP_changed"); service_msg[13]=device_id; send_to_server(service_msg, service_msg_len); break; case 2: strcpyf(service_msg, "Micro_device#0:comm_2_done"); service_msg[13]=device_id; send_to_server(service_msg, service_msg_len); break; default: strcpyf(service_msg, "Micro_device#0:command_Error"); service_msg[13]=device_id; send_to_server(service_msg, service_msg_len); }; }; // Start timer TCCR2=0x07; TCNT2=0x00; } // end of interrupt void main(void) .... unsigned int* pointer; ...... pointer=get_adc_data(); for(i=0;i<6;i++){ data_msg[16+2*i]=(*(pointer+i))>>8; //MSB data_msg[16+2*i+1]=(*(pointer+i)) & 0xff; //LSB }; ...... Проблема следующая: при возникновении прерывания во время работы с указателем, значения записываемые в data_msg[], искажаются. При запрете прерываний на этот кусок кода, всё работает нормально.
  13. ADC+MUX

    Вот мой кусок кода на С, работает как надо: for (i=0; i<6; i++) { ADMUX&=0b11110000; ADMUX|=i; ADCSRA|=0x40; while(!(ADCSRA & (1<<ADIF))); ADCSRA|=(1<<ADIF); adc_data=ADCW; ..... };
  14. Извините, но вы говорите о том, в чём абсолютно не разбираетесь. Гражданские радиолокаторы используют как вторичную (пассивную), так и первичную (активную) радиолокацию, и если вы готовы об этом спорить, значит вы просто "не в теме". По поводу финансирования проектов Аэротехники и их коммерческой ценности вы снова не правы, с госбюджетом у них связь весьма далёкая, поэтому не пишите того, о чём не знаете.
×
×
  • Создать...