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

straighter

Участник
  • Публикаций

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

  • Посещение

Репутация

0 Обычный

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

  • Звание
    Участник
  1. Помогите перепрограммировать Serial EEPROM

    Еще раз спасибо. Это намного облегчает задачу! Цитата(jcxz @ Jul 31 2017, 13:47) ... на тот МК подайте RESET - он на это время переведёт свои ноги в 3-е состояние ... Я недавно начал заниматься PICами. Сейчас еще раз пересмотрел даташит на PIC32MX, но такой информации не нашел (может плохо искал). Хотя на форумах об этом пишут. Не приведете ли фразу из даташита про то, что RESET (MCLR) переводит ноги в 3-е состояние, буду Вам очень благодарен.
  2. Помогите перепрограммировать Serial EEPROM

    Спасибо за ответ. Буду думать. Очень не хочется резать дорожки, но наверное придется ...
  3. Помогите перепрограммировать Serial EEPROM

    Добрый день, уважаемые форумчане! Помогите разобраться с проблемой. Имеется устройство, в котором микроконтроллер PIC32MX работает совместно с м-схемой serial EEPROM 25LC040A. Все выводы этой микросхемы подключены к микроконтроллеру. На плате имеется разъем (как я понял, он предназначен для программирования этой м-схемы), к которому подключены все выводы 25LC040A, кроме CS (выбор чипа). Кроме того, на плате имеется разъем для программирования микроконтроллера. Вопрос: как прочитать и перепрограммировать м-сх 25LC040A через разъем без цепи CS и не будут ли при этом оказывать влияние выводы микроконтроллера? Даташиты читал, но ответа не нашел. Спасибо.
  4. Вопрос по режиму захвата таймера Т1

    Большое спасибо, получилось!
  5. Вопрос по режиму захвата таймера Т1

    Сделал так и почему-то исчезли импульсы на PORTC.2 (d = 256). Но идею насчет "атомарной" операции понял. Буду думать...
  6. Вопрос по режиму захвата таймера Т1

    Спасибо за ответ. Только я не совсем понял, в какое место моей программы вставить приведенный фрагмент кода: Код     #asm("cli")         unsigned int f_test=f;     #asm("sei")      if(f_test<(d+1)) break;
  7. Вопрос по режиму захвата таймера Т1

    Попробую сделать без delay_us, например так: PORTC.1=1; PORTC.1=0;
  8. Вопрос по режиму захвата таймера Т1

    Уважаемые форумчане, помогите разобраться... ATmega8 работает с кварцем 8 Мгц. На вход встроенного компаратора подаю синусоиду 20 кГц от стабильного генератора. По положительному перепаду на выходе компаратора происходит захват значения в Timer/Counter1. Возникает прерывание, значение f увеличивается на 1. Когда f достигает значения d, то PORTC.2 устанавливается в 1 на время 10мкс, а затем снова устанавливается в 0. После этого в основном цикле программы PORTC.3 устанавливается в 1 на время 10мкс, а затем снова устанавливается в 0. Когда я задаю значение d меньше или равное 255, то все работает нормально, после каждого импульса на выходе PORTC.2 возникает импульс выходе PORTC.3, как и должно быть. Но если я задаю значение d больше или равное 256, то импульсы на выходе PORTC.3 так и продолжают идти, но не каждому из них предшествует импульс на выходе PORTC.2. Пробовал разные частоты синусоиды - то же самое. В чем причина? Фрагмент кода: CODE unsigned int d=255; // Заданное кол-во НЧ-периодов счета (кол-во сработок компаратора) unsigned int f; // Текущее кол-во НЧ-периодов счета (кол-во сработок компаратора) // Timer1 input capture interrupt service routine interrupt [TIM1_CAPT] void timer1_capt_isr(void) { // Place your code here PORTC.0=1; delay_us(10); PORTC.0=0; if (f==1) { PORTC.1=1; delay_us(10); PORTC.1=0; }; if (f==(d)) { PORTC.2=1; delay_us(10); PORTC.2=0; }; f=f+1; } void main(void) { f=0; // Global enable interrupts #asm("sei") while (1) { // Place your code here while (f<(d+1)); #asm("cli") PORTC.3=1; delay_us(10); PORTC.3=0; delay_us(100); PORTC.4=1; delay_us(10); PORTC.4=0; f=0; #asm("sei") }; } Осциллограммы : d=255; синий цвет - вых. РС2; желт. цвет - вых. РС3; Здесь все правильно и понятно: [attachment=99737:61.jpg] d=256; синий цвет - вых. РС2; желт. цвет - вых. РС3; Видно, что нет импульса на РС2, а соответствующий импульс на РС3 есть: [attachment=99738:64.jpg] Желт. цвет - сигнал на входе компаратора; синий цвет - на вых. РС0 (смотри код программы): [attachment=99739:75.jpg]
  9. Да, вроде бы понял. Попробую так и написать.
  10. Попробую так написать, поставить строб после бита.
  11. Цитата(controller_m30 @ Mar 5 2016, 23:53) ... Этот код, как мне кажется, выводит импульс синхронизации с опережением на один бит по отношению к битам данных. Почему с опережением на целый бит? У нас длительность бита примерно 10мкс, а время выполнения команд "PORTC.3=1; PORTC.3=0;" примерно 0,5мкс. Цитата(controller_m30 @ Mar 5 2016, 23:53) Это можно проверить, если вывести таким способом заранее известную константу (например 0х8001), и посмотреть расположение битов данных относительно синхроимпульсов. Да, это можно будет проверить.
  12. Цитата(zombi @ Mar 5 2016, 21:37) Судя по осциллограммам на формирование одного бита уходит в среднем 10 мкс = 80 тактов процессора. Что-то много, не? Не знаю, как посчитать, сколько тактов процессора требуется? Полный фрагмент кода цикла for (вместе с вспомогательными импульсами на порте PORTC.3) такой: Кодfor(i=0; i < 16; i++) {         PORTC.3=1;   PORTC.3=0; if(0x0001 & (e>>(15-i)))         PORTC.1=1;//если бит-единица, то и выставляем единицу         else PORTC.1=0;//иначе - выставляем ноль               } Я измерил длительность импульса "1" на PORTC.3 - получилось 250нс. Т.к. команда PORTC.3=1 (на ассемблере ей соответствует SBI 0x15,3) выполняется за два такта, то значит один такт равен 125нс, что соответствует частоте 8 Мгц. Вроде бы все правильно?
  13. Цитата(zombi @ Mar 5 2016, 16:52) А почему интервалы между "вспомогательные импульсы" разные? Эти вспомогательные импульсы формируются тоже в цикле "for(i=0; i < 16; i++)", просто в моем первом посте я для упрощения кода их не показал. А интервалы между ними разные потому что эти интервалы зависят от количества сдвигаемых разрядов в данный момент цикла, т.е. от 15 до 0. Цитата(controller_m30 @ Mar 5 2016, 16:52) Приведите ещё настройки всех регистров компаратора и Таймера_1. Настройки регистров были произведены с помощью CodeVizardAVR: CODE // Timer/Counter 1 initialization // Clock source: System Clock // Clock value: 8000,000 kHz // Mode: Normal top=FFFFh // OC1A output: Discon. // OC1B output: Discon. // Noise Canceler: Off // Input Capture on Rising Edge // Timer1 Overflow Interrupt: Off // Input Capture Interrupt: On // Compare A Match Interrupt: Off // Compare B Match Interrupt: Off TCCR1A=0x00; TCCR1B=0x41; TCNT1H=0x00; TCNT1L=0x00; ICR1H=0x00; ICR1L=0x00; OCR1AH=0x00; OCR1AL=0x00; OCR1BH=0x00; OCR1BL=0x00; // Timer(s)/Counter(s) Interrupt(s) initialization TIMSK=0x20; // Analog Comparator initialization // Analog Comparator: On // Analog Comparator Input Capture by Timer/Counter 1: On ACSR=0x04; SFIOR=0x00; Цитата(controller_m30 @ Mar 5 2016, 16:52) А ещё, если так можно, пусть программа прерывания TC1, выводит каждый раз не вычисленную разность, а просто текущее значение ICR1, которое там зафиксировалось. Желательно, чтоб на скрине поместилось два подряд идущих числа - чтоб можно было самим оценивать и их разность, и при этом видеть абсолютное значение каждого числа. Может это что-то подскажет... Можно будет так попробовать. Но только уже после выходных...
  14. Цитата(zombi @ Mar 5 2016, 14:24) А если в прерывании просто инвертировать PORTC.1 какая частота на нём будет? Это я тоже пробовал раньше. Тогда частота синусоиды была 25 кГц (период 40 мкс). А частота сигнала на выходе порта, который я инвертировал, была в два раза ниже, как и должно быть: [attachment=99188:1_PD0.jpg] А вот осциллограмма моего последнего эксперимента, о котором я писал в первом посте. Частота синусоиды 4 кГц. На осциллограмме показаны кодовая последовательность на выходе PORTC.1 и вспомогательные импульсы для облегчения разделения битов в кодовой последовательности. Если перевести кодовые пакеты в десятичную систему, то получается 1000 и 999: [attachment=99189:36.jpg] Вот в растянутом виде: [attachment=99190:37.jpg]
  15. Уважаемые форумчане, помогите разобраться... ATmega8 работает с кварцем 8 Мгц. На вход встроенного компаратора подаю синусоиду 4 кГц от стабильного генератора. По положительному перепаду на выходе компаратора происходит захват значения в Timer/Counter1. Возникает прерывание, вычисляется разность между последним захваченным значением и предыдущим захваченным значением. По идее, эта разность должна быть равна 2000, т.к. 8МГц/4кГц=2000. Но на самом деле получается 1000. Почему? Это значение (1000) я могу наблюдать в виде последовательного кода на выходе PORTC.1 с помощью осциллографа. Фрагмент программы, прерывание по захвату Таймера1: iКодnterrupt [TIM1_CAPT] void timer1_capt_isr(void) { b=ICR1; if (b>a) { e=b-a; }; a=b; for(i=0; i < 16; i++) {       if(0x0001 & (e>>(15-i)))         PORTC.1=1;                      //если бит-единица, то и выставляем единицу         else PORTC.1=0;       //иначе - выставляем ноль              } PORTC.1=0; }