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

Paulina

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

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

  • Посещение

Весь контент Paulina


  1. А spi правильно настроен? полярность, фазировка клока sck? В начале перед отправкой cmd0 попробуйте пустой байт (0xff) отправить. Еще уберите put_ch('.') из внутреннего цикла (а лучше совсем). Опять же функции работы с spi неизвестно какие.
  2. Опорное напряжение определяет полярность выходного сигнала цап: Uвых=-Uref(код/4096). Поменяете полярность опорного напряжения (при неизменном модуле) - сигнал отобразится зеркально относительно нуля. Только не надо забывать, что Uref не должно превышать по модулю 15В. Все это, естественно, для случая двуполярного питания ОУ.
  3. 74hc244

    74LS07 - порог 1/2Uпит, открытый коллектор, без инверсии
  4. 1)если гасить светодиоды, то все, а у вас только порт D гасится: #define OFF_LEDS PORTD = 0b00000000 добавьте то же для других портов 2)смотрите, что у вас между 6-м и 4-м светодиодом стоит: if (Fx >= 40) { ON_LED6; } if (Fx >= 33.3) { OFF_LEDS; } while (Fx >= 26.7) { ON_LED4; я так понимаю, результат ctrl-c ctrl-v)) 3) на малых частотах входного сигнала (около 10 имп/с) ошибка будет составлять до 20% (т.к. подсчет ведется примерно за 500 мс). здесь лучше использовать измерение не количества импульсов, а их периода следования (скажем, померили период следования T в микросекундах и находите частоту по формуле N0*1000000/T, где N0 - количество оборотов на импульс, у вас это 30)
  5. Ariec, какова роль переключателей S7 и S8? За что отвечает каждое из 3х положений? В оригинальной схеме кнопка блокировки ведь только одна. S1-S6 это я так понимаю, 3 парных переключателя около водителя для контроля пассажирских подъемников? Еще, на этом рисунке: http://i004.radikal.ru/0907/2f/e89a8343c7b8.gif мне кажется сверху кнопки на пасажирской двери, а снизу на водительской, иначе смысл водителю блокировать свои же кнопки? В любом случае, по этой схеме контроллеру до лампочки обрыв массы, т.к. силовые провода заходят на него непосредственно с аккумулятора. Мне кажется, стоит оставить кнопку блокировки как есть, зачем еще дополнительное реле?
  6. одним концом на питание, другим на Reset
  7. как показывает практика, понимает. 3 вольта это как раз нижний предел для высокого логического уровня (0,6 Vcc). для полной уверенности ставьте преобразователь уровней
  8. контроллер в программаторе питается от 5 вольт, ток ограничивается резисторами на 100 или 220 ом, соответственно при питании таргета от 3 вольт ток через них будет где-то 8-15 мА. лично я поставила на выходе программатора микросхему 74LS07, так что могу выбирать уровень напряжения джампером
  9. USART-то хоть работает? попробуйте что-нибудь передать. А чтоб определить кварц виновник или нет, включите внутренний rc генератор на время
  10. Это не точность, а диапазон измерений. точность будет задаваться параметрами АЦП. для меги это 8 бит (10 бит минус различные ошибки), соответственно для диапазона 50 мА точность будет примерно 200 мкА. мне кажется тут можно использовать что-нибудь более дешевое
  11. в энергетике - в реле контроля напряжения 3-х фаз (tiny2313), в устройстве для испытаний релейных защит (mega16 вроде)
  12. в этом проекте не очень эффективное считывание данных - прочитал 1 байт (при этом раз в тридцать больше служебной информации), записал в регистр, подожал, снова считал 1 байт... проще организовать буфер в ОЗУ и сразу секторами туда
  13. Это может быть и не таймер, а реле времени (TiMe Relay). Если реле с задержкой на ВКЛЮЧЕНИЕ, то реле сработает через 10с после 2006, а отвалится одновременно с ним; если с задержкой на ОТКЛЮЧЕНИЕ, то сработает сразу, а отвалится через 10с после 2006. Уточните тип элемента. Возможно, это не счетчик а именно таймер (т.е. держит контакты определенное время, указанное ниже - 60 мин). Верхний вход - запуск, нижний сброс. Если это таймер, то он запустится и начнет отсчет времени. Информации маловато.
  14. Эти элементы могут быть и не механическими, а электронными. Видела подобные схемы на старых ПЛК Simatic от Siemens
  15. while (1) { while (PIND.0==1) {} // Проверка нажатия кнопки if (PINB.0==1) { PORTB.0=0; } // Зажигаем светодиод delay_ms (3000); // Задержка 3 сек. { PORTB.0=1; } // Тушим светодиод else { PORTB.0=0; } // Зажигаем светодиод delay_ms (3000); // Задержка 3 сек. { PORTB.0=1; } // Тушим светодиод while (PIND.0==0) {} }; } согласна с drovik, какой смысл в if-else если куски кода после них одинаковые? сделайте лучше так: while(1) { if(PIND.0==1) //если не нажата, { while(PIND.0==1); //ждем нажатия PORTB.0=0; delay_ms(3000); PORTB.0=1; } if(PIND.0==0) //если нажата, { while(PIND.0==0); //ждем отпускания PORTB.0=0; delay_ms(3000); PORTB.0=1; } } или используйте прерывания
  16. Измеритель U /I/ R

    еще и источник проверьте на предмет пульсаций на всякий случай, пол-ампера ток не такой уж и маленький
  17. Измеритель U /I/ R

    а вы вычитаете падение напряжения на шунте?
  18. Измеритель U /I/ R

    jin_jin , а как измеряется ток?
  19. не думаю что у меги будет меньше малым потреблением msp всегда славился
  20. tiny2313V например. менее 0,1 мкА в режиме power down, 20 мкА в активном режиме с кварцем 32k. до 16 линий в/в.
  21. эффективность тем больше чем больше блок данных. если данные будут только транслироваться, то зачем ограничивать блок размером сектора, который всего 512 байт?
  22. разумеется, нет, но в первом сообщении указывалось, что:
  23. Это так, но если данные идут непрерывно, без дефрагментации то можно просто установить размер блока данных, скажем 64 кБ и принимать их непрерывно, а потом уже делать проверки и прочая. мне лично больше 256кбит/с не было нужно, поэтому не пробовала. вот например часть кода из рабочей программы с функциями установки длины блока, считывания блока а также инициализацией карты, чтением FAT и т.д: unsigned char sec_per_clust, data[512]; unsigned int j, j2; unsigned long fat_base, cluster_base, addr; flash unsigned char cmd0[6] = {0x40, 0x00, 0x00, 0x00, 0x00, 0x95}, cmd1[6] = {0x41, 0x00, 0x00, 0x00, 0x00, 0x01}, blck_ln_200[6] = {0x50, 0x00, 0x00, 0x02, 0x00, 0x01}; //элементы 2-5 задают размер блока, в данном случае 512 байт ... void set_block_len(void) { spi(0xff); for(i=0; i<6; i++) spi(blck_ln_200[i]); while(spi(0xff)==0xff); spi(0xff); } ... void read_single_block(unsigned long daddr) { //k=255; //убрать комментарии если не хотите зависания при отсутствии карты do { spi(0xff); spi(0x51); spi(daddr>>24); spi(daddr>>16); spi(daddr>>8); spi(daddr); spi(0x01); while(spi(0xff)==0xff); //--k; } while((SPDR!=0x00));//&&(k>0)); while(spi(0xff)!=0xfe); for(j2=0; j2<512; j2++) data[j2]=spi(0xff); //разумеется, количество итераций зависит от размера считываемого блока spi(0xff); spi(0xff); spi(0xff); } ... //далее функция преобразования четырех байтов в одно 32-битное число (ну не нашла я готовых функций) void uchar_to_ulong(unsigned long *p, unsigned int offset, unsigned int count) { *p=0; for(; count>0; count--) { *p|=*(data+offset+count-1); if(count>1) *p<<=8; } } ... //=======инициализация карты=========== for (i=0; i<10; i++) spi(0xff); delay_ms(1); //========сброс карты=============== card_cs=0; do { spi(0xff); for(i=0; i<6; i++) spi(cmd0[i]); for(i=0; i<8; i++) if(spi(0xff)!=0xff) break; } while(SPDR!=0x01); //ждем ответа 0x01 - спящий режим //spi(0xff); //CS=1; //=======инициализация режима spi карты======= //CS=0; do { spi(0xff); for(i=0; i<6; i++) spi(cmd1[i]); for(i=0; i<8; i++) if(spi(0xff)!=0xff) break; } while(SPDR!=0x00); //spi(0xff); set_block_len();//0x100); read_single_block(0); //чтение master boot record card_cs=1; uchar_to_ulong(&addr, 0x1c6, 4); //позиция partition boot record в секторах card_cs=0; read_single_block(addr<<9); //чтение pbr card_cs=1; //================вычисление root base======================= uchar_to_ulong(&root_base, 0x0e , 2); //зарезервированных секторов root_base+=addr; //fat base в секторах fat_base=root_base<<9; //fat base в байтах uchar_to_ulong(&addr, 0x16, 2); //секторов на fat addr<<=1; //удвоение из-за того что 2 таблицы fat root_base+=addr; //root base в секторах root_base<<=9; //в байтах //================вычисление cluster base==================== sec_per_clust=data[0x0d]; //секторов на кластер addr=data[0x0d]; addr<<=10; //байтов на 2 фиктивных кластера cluster_base=root_base-addr; uchar_to_ulong(&addr, 0x11, 2); //число записей в корневом каталоге addr<<=5; //размер корневого каталога в байтах cluster_base+=addr; //cluster base в байтах card_cs=0; read_single_block(root_base); //чтение корневого каталога код читается плохо, согласна (написано полностью с нуля), но разобраться можно. спрашивайте, если что.
  24. CodeVision тоже так сделает, это просто для образовательных целей :)
  25. только этот момент подачи #CS надо хорошенько продумать. скорость spi будет равна половине скорости контроллера, а обновление портов происходит через 1 такт после записи в порт, можно и не успеть до прихода следующего фронта CLK. поиграйтесь с настройками CPOL, CPHA, авось получится. код для работы с FAT16 могу выложить, если надо.
×
×
  • Создать...