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

ps1x

Свой
  • Постов

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

  • Посещение

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


  1. Правильно. В CVAVR стояла галка программировать фузы, а сами фузы все стояли по нулям. То же проходили. Подключите кварц или генератор к XTAL 1.
  2. Но ведь вроде T0 и T1 асинхронные, и считают независимо от исполнения других комманд? Сейчас автогенератор работает в режиме перевозбуждения (что не есть гуд и приводит к нелинейности), вообще планируется выходной сигнал через прецезионный выпрямитель пустить на АЦП и таким образом завести ООС, чтобы датчик был с линейной характеристикой. Поскольку частоты не велики, нет ну правда, всего-то два сигнала 10кГц каждый, думается можно вполне все успевать. Т.е. все таки без двух захватов не обойтись? А если программно отключать входы? Мне сверх высокая точность не нужна, достаточно двух знаков после запятой, дальше все равно уже шумы, вибрации, и т.п.
  3. Мне тут умные люди подсказали что при измерении двух струн собственно измерения должны проводиться одновременно. В таком случае может использовать T0 и T1 входы таймеров а подключать их программно через транзистор? без ICP... А на входе поставить внешний компаратор, например lm339n. ps. А вот и GM! :)
  4. Пожалуй, подниму тему из глубин форума. Встала задача измерять 2 сигнала 2-10кГц. Судя по всему нужно подключать датчики и считать по очереди. Достаточно ли для этого транзистора на каждый вход, базой соединенных с выводами МК, которые и будут определять подключенный вход?
  5. пульт ДУ

    Все очень просто. Есть записи почти всех пультов вот здесь http://winlirc.sourceforge.net/. Вам лишь осталось придумать как их впихнуть в МК и распознать. Предлагаю впихивать только те пульты и кнопки которые нужно. Есть еще вариант. Грубо говоря, мы нажимаем кнопку пульта и записываем длительности высокого и низкого уровня. Можно их так и хранить и сравнивать, а можно на их основе вычислять что то типа CRC что и будет "кодом" кнопки. С высоким уровнем вероятности он будет уникальный.
  6. Ванна я с туалетом совмещены, стены верхние 3/4 белые, низ черный. Освещения хватает. Как раз космосовская перегорела очень быстро. Может быть потому что ее трогали руками. Я вот и понимаю что мигание вообще не гут. Попробую заменить плавный пуск.
  7. Dog Pawlowa Ясно, спасибо. Потолок натяжной, уже все сделано, как говорится, поздняк метаться.
  8. Делаю ремонт в доме, в ванную комнату поставил 6 галогенок 220 В 35 Вт. Итого 210 Вт. Для защиты ламп при включении купил прибор защиты - маленькая коробочка с двумя проводами, включается в разрыв цепи выключатель - лампы. Прибор расчитан на нагрузку 300 Вт. Проблема в том, что практически каждый раз при влючении, сначала мигает (иногда слабо, иногда сильно) а потом уже плавно включается с 0. Пробовал прибор обернуть фольгой и подключить к земле (прибор находится за выключателем). Пробовал поставить прибор другой фирмы на 1000Вт. Не помогло. Хотя 1000Вт мигал меньше. Вопрос как это можно вылечить? п.с. Пробовал подключать и к 0 проводу и к фазному.
  9. Наверное ошибся. +/-0.0001 Гц было точно при частоте ~1018 гц Завтра попробую.
  10. Работает прекрасно :) +/- 0.0001 мкС Большущее спасибо!
  11. Да, вместо использования компаратора я сделал усилитель на 2 транзисторах. Изготовил плату и спаял :) А вот по программе пока не продвигался :)
  12. Ваш пост из того топика.
  13. Автогенератор в институте, и схемы от него нет, даже боюсь его развинчивать, но постараюсь что нибудь добыть когда там буду. Может быть запретить прерывания перед считыванием ICR1? :) up: выбросы бывают и в меньшую сторону, около 1013 Гц.
  14. Появилась стабильность :) Значения 1018.8184 - 1018.8183 около того. Наверное, можно списать на погрешность кварца генератора и частотомера, хотя один из вариантов прошлого (:)) периодически показывал значения очень близкие к расчетному +0.00030 или около того. Однако периодически происходят выбросы 1024.125... К сожалению перешел на другое рабочее место, где самодельный переходник USB-USART не определяется, посему не могу предоставить никакой отладочной информации, сам считываю с дисплейчика.
  15. А DDR соответствующих ножек влияет? Подтяжка? Сейчас вывод тини26 подключен напрямую к T0 меге и все. Надо добавить соединение с ICP? (пока что делаю на т.н. Breadboard пластиковая макетка с дырочками).
  16. Входной меандр подключен к Т0. ICP висит в воздухе...
  17. reset aN1=65536 M1=98 ntick1=0 ntick2=1 N2=12582912 M2=1158 ntick1=0 ntick2=192 F=1016.187438Hz N1=0 M1=205 ntick1=0 ntick2=0 N2=12451840 M2=1262 ntick1=0 ntick2=190 F=1018.644653Hz N1=0 M1=52 ntick1=0 ntick2=0 N2=12451840 M2=1109 ntick1=0 ntick2=190 F=1018.644653Hz N1=0 M1=155 ntick1=0 ntick2=0 N2=12517376 M2=1213 ntick1=0 ntick2=191 F=1014.270141Hz N1=0 M1=3 ntick1=0 ntick2=0 N2=12451840 M2=1058 ntick1=0 ntick2=190 F=1016.717163Hz N1=0 M1=105 ntick1=0 ntick2=0 N2=12517376 M2=1162 ntick1=0 ntick2=191 F=1013.311462Hz N1=0 M1=208 ntick1=0 ntick2=0 N2=12451840 M2=1266 ntick1=0 ntick2=190 F=1019.608398Hz N1=0 M1=56 ntick1=0 ntick2=0 N2=12451840 M2=1113 ntick1=0 ntick2=190 F=1018.644653Hz N1=0 M1=159 ntick1=0 ntick2=0 N2=12451840 M2=1216 ntick1=0 ntick2=190 F=1018.644653Hz Действительно, только %li :)
  18. Входная частота 1019.02173 Гц. Расчетная. По осцилографу тоже очень похоже (С117 с метками). reset N1=0 M1=97 N2=0 M2=1130 cF=1016.924499Hz N1=0 M1=1168 N2=0 M2=2204 cF=1014.423889Hz N1=0 M1=2242 N2=0 M2=3277 cF=1018.893310Hz N1=0 M1=3315 N2=0 M2=4350 cF=1018.893310Hz N1=0 M1=4388 N2=0 M2=5423 cF=1018.893310Hz N1=0 M1=5461 N2=0 M2=6496 cF=1018.893310Hz N1=0 M1=6534 N2=0 M2=7569 cF=1018.893310Hz N1=0 M1=7607 N2=0 M2=8642 cF=1018.893310Hz N1=0 M1=8680 N2=0 M2=9715 cF=1013.444702Hz N1=0 M1=9753 N2=0 M2=10788 cF=1018.893310Hz N1=0 M1=10827 N2=0 M2=11863 cF=1014.423889Hz N1=0 M1=11902 N2=0 M2=12939 cF=1020.862243Hz N1=0 M1=12978 N2=0 M2=14014 cF=1019.877746Hz N1=0 M1=14053 N2=0 M2=15089 cF=1019.877746Hz N1=0 M1=15128 N2=0 M2=16164 cF=1014.423889Hz N1=0 M1=16203 N2=0 M2=17240 cF=1020.862243Hz Такое ощущение, что нужно обнулять nover и mover. Но что то еще не так. Смущает так же, что N1 и N2 = 0. Если обнулять nover и mover то измерения такие: reset N1=0 M1=98 N2=0 M2=1131 F=1016.924499Hz N1=0 M1=144 N2=0 M2=1178 F=1017.908935Hz N1=0 M1=191 N2=0 M2=1225 F=1017.908935Hz N1=0 M1=238 N2=0 M2=1272 F=1017.908935Hz N1=0 M1=29 N2=0 M2=1062 F=1022.421386Hz N1=0 M1=75 N2=0 M2=1108 F=1016.924499Hz N1=0 M1=121 N2=0 M2=1155 F=1017.908935Hz N1=0 M1=168 N2=0 M2=1202 F=1017.908935Hz N1=0 M1=215 N2=0 M2=1249 F=1017.908935Hz N1=0 M1=6 N2=0 M2=1038 F=1021.431579Hz N1=0 M1=51 N2=0 M2=1084 F=1016.924499Hz N1=0 M1=97 N2=0 M2=1130 F=1016.924499Hz N1=0 M1=143 N2=0 M2=1177 F=1023.411132Hz N1=0 M1=190 N2=0 M2=1224 F=1017.908935Hz N1=0 M1=237 N2=0 M2=1272 F=1024.400878Hz N1=0 M1=29 N2=0 M2=1062 F=1016.924499Hz N1=0 M1=75 N2=0 M2=1108 F=1016.924499Hz N1=0 M1=121 N2=0 M2=1155 F=1017.908935Hz N1=0 M1=168 N2=0 M2=1202 F=1017.908935Hz N1=0 M1=215 N2=0 M2=1249 F=1017.908935Hz N1=0 M1=6 N2=0 M2=1038 F=1015.940002Hz N1=0 M1=51 N2=0 M2=1084 F=1016.924499Hz N1=0 M1=97 N2=0 M2=1130 F=1022.421386Hz N1=0 M1=143 N2=0 M2=1177 F=1017.908935Hz N1=0 M1=190 N2=0 M2=1224 F=1017.908935Hz А вот и сам код: while (1){//Бесконечный цикл TIFR=(1<<ICF1); //сбросим флаг захвата while((TIFR&0x20)==0x20); //ждём начала измерения ntick1=ICR1; //запомним ICR1 и TCNT0 mtick1=TCNT0; //в начале измерения ntick2=nover; mtick2=mover&0x00FF; N1=((long)(ntick2)<<16)+(long) ntick1; //системные тики M1=((long)(mtick2)<<8) +(long) mtick1; //входные тики sprintf(lcd_buffer, "N1=%i M1=%i\r", N1,M1); puts(lcd_buffer); delay_ms(1000); //задержка на 1 с TIFR=(1<<ICF1); //сбросим флаг захвата while((TIFR&0x20)==0x20); //ждём конца измерения ntick1=ICR1; //запомним ICR1 и TCNT0 mtick1=TCNT0; //в конце измерения ntick2=nover; mtick2=mover&0x00FF; N2=((long)(ntick2)<<16)+(long) ntick1; //системные тики M2=((long)(mtick2)<<8) +(long) mtick1; //входные тики sprintf(lcd_buffer, "N2=%i M2=%i\r", N2,M2); puts(lcd_buffer); N=N2-N1; //системные тики за время измерения M=M2-M1; //входные тики за время измерения Fx=12000000.0*(float)M/(float)N; //вычисление частоты входного сигнала sprintf(lcd_buffer, "F=%0.6fHz", Fx); lcd_clear(); lcd_puts(lcd_buffer); puts(lcd_buffer); putchar(13); nover=0; mover=0; } }
  19. #include <mega8.h> //Подключение #include <stdio.h> // внешнх #include <stdlib.h> #include <delay.h> // библиотек #include <16x2.h>// #define TOIE0 0 #define TOIE1 2 #define ICF1 5 //Объвление переменных static float volatile Fx; unsigned long volatile N,N1,N2,M,M1,M2; unsigned int volatile mtick1,mtick2,mover=0; unsigned int volatile ntick1,ntick2,nover=0; //Прерывание по переполнению Timer/Counter 0 interrupt [TIM0_OVF] void timer0_ovf_isr(void){ mover++; } //Прерывание по переполнению Timer/Counter 1 interrupt [TIM1_OVF] void timer1_ovf_isr(void){ nover++; } //Тело основной программы void main(void){ unsigned char lcd_buffer[46];//Обявление локальной строковой переменной PORTC=0x00; DDRC=0xFF; //Инициализация Timer/Counter 0 TCCR0=0x07; //Инициализация Timer/Counter 1 TCCR1B=0x01; UCSRA=0x00; UCSRB=0x08; UCSRC=0x86; UBRRH=0x00; UBRRL=0x4D; putsf("reset\r"); lcd_init();//Инициализация LCD HD44780 #asm("sei") TIMSK=(1<<TOIE1)|(1<<TOIE0); //разрешим TOV1 и TOV0 putchar('a'); while (1){//Бесконечный цикл TIFR=(1<<ICF1); //сбросим флаг захвата putchar('b'); while((TIFR&0x20)==0x20); //ждём начала измерения putchar('c'); ntick1=ICR1; //запомним ICR1 и TCNT0 mtick1=TCNT0; //в начале измерения ntick2=nover; mtick2=mover&0x00FF; N1=((long)(ntick2)<<16)+(long) ntick1; //системные тики M1=((long)(mtick2)<<8) +(long) mtick1; //входные тики putchar('d'); delay_ms(1000); //задержка на 1 с TIFR=(1<<ICF1); //сбросим флаг захвата while((TIFR&0x20)==0x20); //ждём конца измерения ntick1=ICR1; //запомним ICR1 и TCNT0 mtick1=TCNT0; //в конце измерения ntick2=nover; mtick2=mover&0x00FF; N2=((long)(ntick2)<<16)+(long) ntick1; //системные тики M2=((long)(mtick2)<<8) +(long) mtick1; //входные тики N=N2-N1; //системные тики за время измерения M=M2-M1; //входные тики за время измерения Fx=12000000.0*(float)M/(float)N; //вычисление частоты входного сигнала putchar('c'); sprintf(lcd_buffer, "F=%0.6fHz", Fx); lcd_clear(); lcd_puts(lcd_buffer); puts(lcd_buffer); putchar(13); } } Это код который я гружу в контроллер. bcdcF=1016.036315Hz bcdcF=1017.031433Hz bcdcF=1016.036315Hz bcdcF=1021.588439Hz bcdcF=1021.588439Hz bcdcF=1021.588439Hz bcdcF=1021.588439Hz bcdcF=1016.036315Hz bcdcF=1017.031433Hz bcdcF=1016.036315Hz bcdcF=1021.588439Hz bcdcF=1021.588439Hz bcdcF=1021.588439Hz bcdcF=1021.588439Hz bcdcF=1016.036315Hz bcdcF=1017.031433Hz bcdcF=1016.036315Hz bcdcF=1016.036315Hz bcdcF=1021.588439Hz bcdcF=1021.588439Hz bcdcF=1021.588439Hz bcdcF=1016.036315Hz bcdcF=1017.031433Hz bcdcF=1016.036315Hz bcdcF=1016.036315Hz bcdcF=1021.588439Hz bcdcF=1022.588989Hz bcdcF=1021.588439Hz bcdcF=1016.036315Hz bcdcF=1016.036315Hz bcdcF=1016.036315Hz bcdcF=1016.036315Hz А это то что на выходе в терминале. :smile3046:
  20. Но офсет ведь не влияет? Мы же начинаем измерение фронтом и заканчиваем, и теоретически, задержка прихода фронта не должна влиять. Естественно если она одна и та же для начала и окончания. Спасибо за пример, единственно, надо будет разобраться с регистрами всяких настроек таймеров, прерываний и т.п. В CVAVR таких удобных обращений нет :) p.s. Правильны ли эти дефайны: #define TOIE0 0x01 #define TOIE1 0x04 #define ICF1 0x20 Судя по всему нет, ибо МК перезагружается на первой же строчке: TIMSK=(1<<TOIE1)|(1<<TOIE0);
  21. Для этого используется автогенератор. На выходе его 300 мВ 2 -10 кГц прямоугольные импульсы. Но вообще эти старые железки хочется переделать и встроить в свое устройство. Кстати говоря, вы своим вопросом породили во мне другой вопрос: можно ли использовать в Вашем алгоритме компаратор встроенный в мегу8 для захвата и будет ли его достаточно для детектирования столь низкого по амплитуде сигнала?
  22. Да, программа такова, ибо сначала я пытался измерять методом ворот, но удачи не достиг :) Вот код моего варианта: float result; char buff[16], tim, numizm=2, state=0; // Timer 1 overflow interrupt service routine interrupt [TIM1_OVF] void timer1_ovf_isr(void) { tim++; // увеличиваем счетчик переполнений. } // Timer 1 input capture interrupt service routine interrupt [TIM1_CAPT] void timer1_capt_isr(void) { if (state==0){ // первый фронт сигнала tim=0; // обнуляем переменные и таймер TCNT1=0; } state++; // прибавляем счетчик if (state == numizm){ // если счетчик и кол-во измерений равны, то вычисляем частоту result = 12000000 / ((float)tim*65535+ICR1); // вычисляем "частоту" result *= (int)numizm; // и умножаем на кол-во измерений, получая действительную частоту numizm = 255; //выставляем число измерений if (numizm < result){ // если оно меньше полученной частоты то ставим ее равной частоте ( т.о. измерение будет длиться меньше секунды) numizm = result; } sprintf(buff,"F = %0.3f Гц",result); // выводим на экран и в UART puts(buff); putchar(13); lcd_clear(); lcd_puts(buff); state = 0; // Обнуляем состояние } } На мой взгляд совершенно логичный, но не работающий. Потом мне объяснили что таким способом, разрешающая способность будет не велика. Поэтому я решил пойти по пути Вашего метода. Ну и взял 2 варианта кода и их объединил :) Ну а частоты которые мне нужно измерять - 2 кГц -- 10 кГц. Насколько я понимаю, Вашим методом можно достичь очень хорошей точности, что для струнного датчика (линейный размер -> частота) было бы очень неплохо :) МК Atmega8 частота не принципиальна, но вот сейчас под рукой кварц на 12 мГц.
  23. Таким образом пишем gate=0; после while ((TIFR&0x20)==0x20){}? а здесь пишем count_T0=(int)TCNT0; с приведением типа. (хотя компилятор сам это делает, не делает а пишет варнинги если написать char*2, например, то он ругнется на переполнение чара.) В общем результат тот же. :( И число N1 то меньше на 65536 то ровно столько сколько надо. От чего это зависит не понимаю. 3 измерения так - 3 так.
  24. а как же N0=(((unsigned long int)(Perepol_Timer1_real))<<16)+count_T1; вроде учитываю сount_T1...
×
×
  • Создать...