Jump to content

    

straighter

Участник
  • Content Count

    23
  • Joined

  • Last visited

Everything posted by straighter


  1. Еще раз спасибо. Это намного облегчает задачу! Я недавно начал заниматься PICами. Сейчас еще раз пересмотрел даташит на PIC32MX, но такой информации не нашел (может плохо искал). Хотя на форумах об этом пишут. Не приведете ли фразу из даташита про то, что RESET (MCLR) переводит ноги в 3-е состояние, буду Вам очень благодарен.
  2. Спасибо за ответ. Буду думать. Очень не хочется резать дорожки, но наверное придется ...
  3. Добрый день, уважаемые форумчане! Помогите разобраться с проблемой. Имеется устройство, в котором микроконтроллер PIC32MX работает совместно с м-схемой serial EEPROM 25LC040A. Все выводы этой микросхемы подключены к микроконтроллеру. На плате имеется разъем (как я понял, он предназначен для программирования этой м-схемы), к которому подключены все выводы 25LC040A, кроме CS (выбор чипа). Кроме того, на плате имеется разъем для программирования микроконтроллера. Вопрос: как прочитать и перепрограммировать м-сх 25LC040A через разъем без цепи CS и не будут ли при этом оказывать влияние выводы микроконтроллера? Даташиты читал, но ответа не нашел. Спасибо.
  4. Большое спасибо, получилось!
  5. Сделал так и почему-то исчезли импульсы на PORTC.2 (d = 256). Но идею насчет "атомарной" операции понял. Буду думать...
  6. Спасибо за ответ. Только я не совсем понял, в какое место моей программы вставить приведенный фрагмент кода: #asm("cli") unsigned int f_test=f; #asm("sei") if(f_test<(d+1)) break;
  7. Попробую сделать без delay_us, например так: PORTC.1=1; PORTC.1=0;
  8. Уважаемые форумчане, помогите разобраться... 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. Пробовал разные частоты синусоиды - то же самое. В чем причина? Фрагмент кода: 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; Здесь все правильно и понятно: d=256; синий цвет - вых. РС2; желт. цвет - вых. РС3; Видно, что нет импульса на РС2, а соответствующий импульс на РС3 есть: Желт. цвет - сигнал на входе компаратора; синий цвет - на вых. РС0 (смотри код программы):
  9. Да, вроде бы понял. Попробую так и написать.
  10. Попробую так написать, поставить строб после бита.
  11. Почему с опережением на целый бит? У нас длительность бита примерно 10мкс, а время выполнения команд "PORTC.3=1; PORTC.3=0;" примерно 0,5мкс. Да, это можно будет проверить.
  12. Не знаю, как посчитать, сколько тактов процессора требуется? Полный фрагмент кода цикла 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. Эти вспомогательные импульсы формируются тоже в цикле "for(i=0; i < 16; i++)", просто в моем первом посте я для упрощения кода их не показал. А интервалы между ними разные потому что эти интервалы зависят от количества сдвигаемых разрядов в данный момент цикла, т.е. от 15 до 0. Настройки регистров были произведены с помощью CodeVizardAVR: // 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; Можно будет так попробовать. Но только уже после выходных...
  14. Это я тоже пробовал раньше. Тогда частота синусоиды была 25 кГц (период 40 мкс). А частота сигнала на выходе порта, который я инвертировал, была в два раза ниже, как и должно быть: А вот осциллограмма моего последнего эксперимента, о котором я писал в первом посте. Частота синусоиды 4 кГц. На осциллограмме показаны кодовая последовательность на выходе PORTC.1 и вспомогательные импульсы для облегчения разделения битов в кодовой последовательности. Если перевести кодовые пакеты в десятичную систему, то получается 1000 и 999: Вот в растянутом виде:
  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; }
  16. Для моей задачи такой оффсет вполне допустим.
  17. Для меня важно, чтобы он был Rail-to-rail по входу, но в даташите я этого не нашел.
  18. Спасибо за ответ. Т.е. компаратор Rail-to-rail по входу? А в каком разделе даташита это сказано?
  19. Уважаемые форумчане, помогите разобраться. Не нашел в даташитах на ATtiny и ATmega информации по рабочему диапазону входных напряжений для встроенного компаратора. Может ли он корректно работать при любых уровнях на входе от 0V до напряжения питания? Буду благодарен за информацию.
  20. Это и мне показалось странным и непонятным. Но самое интересное, что контроллер можно было читать и программировать, а следовательно внутренний генератор был исправен. Короче, заменил я контроллер, и всё заработало.
  21. Добрый день, уважаемые форумчане, помогите разобраться. Из серии плат одна почему-то не заработала, хотя их всех программировал одинаково. Использовал ATtiny25, работающую от внутреннего генератора 8 МГц. Питание 5 В. Фьюз CKDIV8 запрограммирован. При включении питания такое впечатление, что не запускается внутренний генератор. Чтобы проверить это, я запрограммировал фьюз CKOUT (Clock output enabled) и посмотрел осциллограмму на выводе CLKO (System Clock Output). Этот вывод ничем не был нагружен. Ожидал увидеть цифровой сигнал амплитудой 5 В, но увидел вот что: Размах сигнала чуть больше 1 В, причем по уровню превышает напряжение питания 5 В. В чем может быть причина? Контроллер сдох?
  22. Функция CommandTheResistor передаёт резистору 2 байта - командный - где вручную расписана передача каждого бита и бит данных с числом которое отображает устанавливаемое сопротивление его передача записана в цикл. Поэтому всего - 16 клоков(ведь два байта). CommandTheResistor должна обеспечивать передачу клоков через PORTA.5 В первом байте передаются биты от которых зависит какой резистор будет использоватся(для спаренных моделей) и которые разрешают задать сопротивление (всё как описано в даташите) Для побитной выдачи число(сопротивление) постоянно дилится на 2 и остаток от деления(крайний бит) передаётся резистору. Выходит что число передаётся побитно задом на перед. Напишите пожалуйста что в программе реализовано неправильно или нерационально? Можно ли передать бит данных и командный бит более просто и не заморачиваясь с задержками и клоками?
  23. Здравствуйте! Не идёт программа для управления цифровым потенциометром mcp41010 от ATtiny261. В компиляции ошибок нет но резистор не управляется и никак не реагирует. Сопротивление mcp41010 должно менятся от минимального до максимального в цикле. PORTA.6 соединён с CS PORTA.5 соединён с SCK PORTA.4 соединён с SI Листинг программы на Си: /***************************************************** This program was produced by the CodeWizardAVR V2.04.5a Evaluation Automatic Program Generator © Copyright 1998-2009 Pavel Haiduc, HP InfoTech s.r.l. http://www.hpinfotech.com Project : Version : Date : 20.06.2012 Author : Freeware, for evaluation and non-commercial use only Company : Comments: Chip type : ATtiny261 AVR Core Clock frequency: 4,000000 MHz Memory model : Tiny External RAM size : 0 Data Stack size : 32 *****************************************************/ #include <tiny261.h> #include <delay.h> // Declare your global variables here int i; void CommandTheResistor (unsigned short R) { PORTA.5=1; delay_us(70); PORTA.6=0; delay_us(30); PORTA.5=0; //first clock delay_us(100); PORTA.5=1; delay_us(100); PORTA.5=0; //second clock PORTA.4=0; delay_us(100); PORTA.5=1; delay_us(30); PORTA.4=1; delay_us(70); PORTA.5=0; //third clock delay_us(100); PORTA.5=1; delay_us(30); PORTA.4=0; delay_us(70); PORTA.5=0; //fourth clock delay_us(100); PORTA.5=1; delay_us(100); PORTA.5=0; //fifth clock delay_us(100); PORTA.5=1; delay_us(100); PORTA.5=0; //sixth clock delay_us(100); PORTA.5=1; delay_us(30); PORTA.4=1; delay_us(70); PORTA.5=0; //seventh clock delay_us(100); PORTA.5=1; delay_us(30); PORTA.4=0; delay_us(70); PORTA.5=0; //eighth clock delay_us(100); for(i = 0; i<=7; i++) { PORTA.5=1; delay_us(30); PORTA.4 = R%2; R=R/2; delay_us(70); PORTA.5=0; delay_us(100); } PORTA.6 = 1; } void main(void) { // Declare your local variables here unsigned short RESISTANCE; // Crystal Oscillator division factor: 1 #pragma optsize- CLKPR=0x80; CLKPR=0x00; #ifdef _OPTIMIZE_SIZE_ #pragma optsize+ #endif // Input/Output Ports initialization // Port A initialization // Func7=In Func6=Out Func5=Out Func4=Out Func3=In Func2=In Func1=In Func0=In // State7=T State6=0 State5=0 State4=0 State3=T State2=T State1=T State0=T PORTA=0x00; DDRA=0x70; // Port B initialization // Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In // State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T PORTB=0x00; DDRB=0x00; // Timer/Counter 0 initialization // Clock source: System Clock // Clock value: Timer 0 Stopped // Mode: 8bit top=FFh TCCR0A=0x00; TCCR0B=0x00; TCNT0H=0x00; TCNT0L=0x00; OCR0A=0x00; OCR0B=0x00; // Timer/Counter 1 initialization // Clock source: System Clock // Clock value: Timer1 Stopped // Mode: Normal top=OCR1C // OC1A output: Discon. // OC1B output: Discon. // OC1C output: Discon. // Fault Protection Mode: Off // Fault Protection Noise Canceler: Off // Fault Protection triggered on Falling edge // Fault Protection triggered by the Analog Comparator: Off // Dead Time Rising Edge: 0.000 us // Dead Time Falling Edge: 0.000 us // Timer1 Overflow Interrupt: Off // Compare A Match Interrupt: Off // Compare B Match Interrupt: Off // Compare D Match Interrupt: Off // Fault Protection Interrupt: Off PLLCSR=0x00; TCCR1A=0x00; TCCR1B=0x00; TCCR1C=0x00; TCCR1D=0x00; TCCR1E=0x00; TC1H=0x00; TCNT1=0x00; TC1H=0x00; OCR1A=0x00; TC1H=0x00; OCR1B=0x00; TC1H=0x00; OCR1C=0x00; TC1H=0x00; OCR1D=0x00; DT1=0x00; // External Interrupt(s) initialization // INT0: Off // INT1: Off // Interrupt on any change on pins PCINT0-7, 12-15: Off // Interrupt on any change on pins PCINT8-11: Off MCUCR=0x00; GIMSK=0x00; // Timer(s)/Counter(s) Interrupt(s) initialization TIMSK=0x00; // Universal Serial Interface initialization // Mode: Disabled // Clock source: Register & Counter=no clk. // USI Counter Overflow Interrupt: Off USICR=0x00; // Analog Comparator initialization // Analog Comparator: Off ACSRA=0x80; // Hysterezis level: 0 mV ACSRB=0x00; while (1) { PORTA.5=0; PORTA.6=1; PORTA.4=0; for(RESISTANCE = 0; RESISTANCE<=253; RESISTANCE++) {CommandTheResistor(RESISTANCE); delay_us(10000);} }; }