Регистрация | Вход

[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 5 из 5
  • «
  • 1
  • 2
  • 3
  • 4
  • 5
Форум Picbasic.ru » Скорая помощь начинающим » Помощь в вопросах программирования » алгоритм
алгоритм
доцент2 Дата: Пт, 20.07.2012, 13:28  |                                                                                                                Сообщение # 61
Группа: Проверенные
Ранг:  Помогаю всем
Сообщений: 287
Репутация: 10   ±
Замечания:   ±
На сайте с 13.09.2011

Статус: Offline

Результат на уровне десятков и единиц колеблется (значительные скачки пропали с вводом выборки по входящим импульсам).
Результат в железе одинаковый при частотах 4, 8 и 20МГц.
Выкинул из программы стробоскоп для простоты.
Прикрепленный проект с кварцем на 8МГц, видео файл - результат с кварцем 20МГц.
Прикрепления: IMGP5883.rar (621.3 Kb) · 1908921.rar (65.7 Kb)

Сообщение отредактировал доцент2 - Пт, 20.07.2012, 13:32
ЯНДЕКС Дата: 20.07.2012
доцент2 Дата: Вт, 04.07.2017, 14:36  |                                                                                                                Сообщение # 62
Группа: Проверенные
Ранг:  Помогаю всем
Сообщений: 287
Репутация: 10   ±
Замечания:   ±
На сайте с 13.09.2011

Статус: Offline

срочно нужна помощь!
С 2012 года, когда обсуждалась эта тема из памяти вылетело многое.
Сейчас хотел накидать програмку, по представленным здесь примерам, для измерения частоты. На частотах свыше 1МГц работало нормально.
Но вот беда пробежал кот по клавиатуре и что-то в тексте программы стерлось. И теперь ни каких измерений не происходит.
Всю голову сломал, ни как понять не могу, что произошло.
Помогите!
Прикрепления: 0974926.rar (35.9 Kb)
ivan_fd Дата: Вт, 04.07.2017, 17:00  |                                                                                                                Сообщение # 63
Группа: Модераторы
Ранг:  Специалист
Сообщений: 894
Репутация: 124   ±
Замечания:   ±
На сайте с 12.01.2009

Статус: Offline

Измерения происходят. Зачем Вы написали DEC1???
доцент2 Дата: Вт, 04.07.2017, 17:36  |                                                                                                                Сообщение # 64
Группа: Проверенные
Ранг:  Помогаю всем
Сообщений: 287
Репутация: 10   ±
Замечания:   ±
На сайте с 13.09.2011

Статус: Offline

Пока текст восстанавливал погорячился немного с Dec1. Спасибо.
ivan_fd, Вы мне уже подсказывали по поводу данного метода измерения, это было в 2012 году, Сделал стробоскоп для машины и забыл все нафиг, к сожалению. Если не сложно можете объяснить как происходит измерение. Пока подобрал длительность задержки в железе измеряет примерно от 4МГц до 53МГц (есть несколько кварцевых генераторов на 25,175; 28,322; 32,514; 44,000 и 53,2034МГц).
Смотрел старые посты, но понять не могу как делать расчет. Не могу померить, например 32кГц - выводит нули.
Хотелось бы захватить диапазон 0....60МГц, +SAB6456. И выводить все это на дисплей nokia-1616.
ivan_fd Дата: Ср, 05.07.2017, 13:20  |                                                                                                                Сообщение # 65
Группа: Модераторы
Ранг:  Специалист
Сообщений: 894
Репутация: 124   ±
Замечания:   ±
На сайте с 12.01.2009

Статус: Offline

Честно говоря я и сам не помню уже. Но если подумать.
Мы меряем таймером 1. Который у нас имеет 2 байта. То есть от 0 до 65535.
В ваше программе при измерении Вы ставите задержку 4 мс. Хотя,что то ее там нету.
Не разбирался почему.
Из этого у нас получается, что, при данных настройках, мы можем измерить минимум -
1/4мс*4*2 - и то с большой неточностью.  Чтобы увеличить точность нужно измерять не 4мс, а больше.
И чем точнее будет задержка, тем точнее будут показания.
В общем алгоритм приблизительно такой может быть. Ставим паузу, например 1с, меряем, смотрим флаг прерывания, если установлен, то ставим паузу 100мс, меряем и если флага прерывания нету, то относительно этой паузы расчитываем частоту. И так далее.
доцент2 Дата: Ср, 05.07.2017, 15:35  |                                                                                                                Сообщение # 66
Группа: Проверенные
Ранг:  Помогаю всем
Сообщений: 287
Репутация: 10   ±
Замечания:   ±
На сайте с 13.09.2011

Статус: Offline

Цитата ivan_fd ()
В ваше программе при измерении Вы ставите задержку 4 мс. Хотя,что то ее там нету.
Как бы вот она:
'; Задержка 20 000 машинных циклов
'; Длительность задержки 4 миллисекунд
'; Частота задающего генератора 20 МГц
'            Movlw       .239
'            Movwf       Reg_1
'            Movlw       .26
'            Movwf       Reg_2
'delay       Decfsz      Reg_1,F
'            GoTo        delay
'            Decfsz      Reg_2,F
'            GoTo        delay
'            Nop

Цитата ivan_fd ()
Из этого у нас получается, что, при данных настройках, мы можем измерить минимум -1/4мс*4*2 - и то с большой неточностью.
Опять эти расчеты я понять не могу:
1/0,004сек * 4*2=2000 - это Гц? Что здесь 4*2?
При задержке 4мс у меня меряет МГц с точностью до тысячной (до кГц) 25,175; 28,322; 32,514; 44,000 и 53,2034МГц.
Если я правильно понимаю, что в случае увеличения задержки до 100мс надо вводить обработку прерывания по переполнению таймера:
Int_Label:
Context Save
If TMR1IF=1 Then     ' если произошло прерывание по переполнению таймера TMR1, то
TMR1IF=0              ' сброс Флага прерывания по переполнению таймера TMR1
Inc TMR1perep      ' приращение количества переполнений TMR1
EndIf
Context Restore ' Возврат из обработчика прерывания
Естественно на этом теряется время и надо корректировать задержку, у меня получилось 99,850мс ориентировался по генератору на 28,322МГц.
; Задержка 499 250 машинных циклов
; Длительность задержки 99850 микросекунд
; Частота задающего генератора 20 МГц

            movlw       .92
            movwf       Reg_1
            movlw       .137
            movwf       Reg_2
            movlw       .3
            movwf       Reg_3
delay       decfsz      Reg_1,F
            goto        delay
            decfsz      Reg_2,F
            goto        delay
            decfsz      Reg_3,F
            goto        delay
            nop
При этом точность тоже падает: при 20МГц показывает 19,999МГц; при 25,175МГц показывает 25,174МГЦ; при 28,322МГц - 28,322МГц; при 32,514 - 32,516МГц; при 53,2034 - 53,2172МГц.
Может без прерывания по переполнению можно обойтись? К сожалению нет под рукой генератора с низкими частотами.

Сообщение отредактировал доцент2 - Ср, 05.07.2017, 15:36
ivan_fd Дата: Чт, 06.07.2017, 10:44  |                                                                                                                Сообщение # 67
Группа: Модераторы
Ранг:  Специалист
Сообщений: 894
Репутация: 124   ±
Замечания:   ±
На сайте с 12.01.2009

Статус: Offline

Цитата доцент2 ()
Как бы вот она:

Я вижу где она. В протеусе там задержка не 4мс, а больше 5-ти. Хотя должно бить точно 4.

Цитата доцент2 ()
Опять эти расчеты я понять не могу:1/0,004сек * 4*2=2000 - это Гц? Что здесь 4*2?

1/4мс = 250 Гц, но у нас есть делитель на 4 поэтому умножаем на 4, а на два, потому, что 1000Гц это в таймере будет 1, или 0. Короче будет не точность. Ну это я написал о минимальной частоте при времени измерения 4мс.
Цитата доцент2 ()
Если я правильно понимаю, что в случае увеличения задержки до 100мс надо вводить обработку прерывания по переполнению таймера:

Я Вам выше написал приблизительный алгоритм. Обработчика прерывания нам не нужно.
Пишу по шагам. Или лучше нарисую алгоритм.
Прикрепления: 7522897.jpg (94.3 Kb)
доцент2 Дата: Чт, 06.07.2017, 20:29  |                                                                                                                Сообщение # 68
Группа: Проверенные
Ранг:  Помогаю всем
Сообщений: 287
Репутация: 10   ±
Замечания:   ±
На сайте с 13.09.2011

Статус: Offline

Цитата ivan_fd ()
В протеусе там задержка не 4мс, а больше 5-ти. Хотя должно бить точно 4.
Я сначала сделал 4мс, но при измерении где-то набегает "лишнее". Для сравнения частоту снимаю с кварцевых генераторов.
Сейчас сделал задержку 100мс. И опять в железе пришлось корректировать, иначе отклонения получаются в несколько килогерц.
При 100мс расчет делаю так: j = ((TIMER1 + 65535 * TMR1perep) * 1000)/25
Расчет взял с потолка. При кварце на МК 20МГц. На фото Верхняя строка при паузе 100мс, нижняя при 1с.
По поводу расчета: допустим кварц МК 20МГц, пред делитель таймера 1:4, задержка 100мс. В процессе измерения таймер насчитал 30000 тиков, как должен выглядеть расчет? (1/0,1сек *4*2=80???)
Спасибо за алгоритм. Переварю - отпишусь.
Прикрепления: 0075354.jpg (81.6 Kb)

Сообщение отредактировал доцент2 - Чт, 06.07.2017, 20:46
ivan_fd Дата: Чт, 06.07.2017, 21:05  |                                                                                                                Сообщение # 69
Группа: Модераторы
Ранг:  Специалист
Сообщений: 894
Репутация: 124   ±
Замечания:   ±
На сайте с 12.01.2009

Статус: Offline

Цитата доцент2 ()
По поводу расчета: допустим кварц МК 20МГц, пред делитель таймера 1:4, задержка 100мс. В процессе измерения таймер насчитал 30000 тиков, как должен выглядеть расчет? (1/0,1сек *4*2=80???)

Кварц при данном методе измерения в расчетах не участвует. Он влияет только на точность задержки = 100мс.
Расчет такой: 30000(то что натикало) * 4(предделитель таймера) / 0.1(время задержки в секундах) = 1200000 Гц
доцент2 Дата: Чт, 06.07.2017, 21:29  |                                                                                                                Сообщение # 70
Группа: Проверенные
Ранг:  Помогаю всем
Сообщений: 287
Репутация: 10   ±
Замечания:   ±
На сайте с 13.09.2011

Статус: Offline

Спасибо за формулу, завтра попробую. А как посмотреть в протеусе время задержки?
ivan_fd Дата: Чт, 06.07.2017, 23:15  |                                                                                                                Сообщение # 71
Группа: Модераторы
Ранг:  Специалист
Сообщений: 894
Репутация: 124   ±
Замечания:   ±
На сайте с 12.01.2009

Статус: Offline

Ассемблерные вставки к сожалению не симулируются пошагово. Но посмотреть можно. Ставим точку останова перед входом в задержку и сразу после нее. И видим длительность паузы.
Сообщение отредактировал ivan_fd - Чт, 06.07.2017, 23:16
ЯНДЕКС Дата: 06.07.2017
ivan_fd Дата: Пт, 07.07.2017, 11:05  |                                                                                                                Сообщение # 72
Группа: Модераторы
Ранг:  Специалист
Сообщений: 894
Репутация: 124   ±
Замечания:   ±
На сайте с 12.01.2009

Статус: Offline

Видеоинструкция -

доцент2 Дата: Сб, 08.07.2017, 21:55  |                                                                                                                Сообщение # 73
Группа: Проверенные
Ранг:  Помогаю всем
Сообщений: 287
Репутация: 10   ±
Замечания:   ±
На сайте с 13.09.2011

Статус: Offline

ivan_fd, Спасибо за алгоритм. Заработало.
Только при задержке в 1мсек немного врет. При 28МГц - 32МГц завышает примерно на 2кГц, на частоте 53МГц на 4кГц. Это около 0.08%. Думаю это нормально.
Сейчас пытаюсь погасить не значащие нули и точки.Пока получилось слишком громоздко.
If j>=10000000 Then Print At 1, 1, " ",Dec j7,Dec j6,".",Dec j5,Dec j4,Dec j3,".",Dec j2,Dec j1,Dec j0," Hz"
If j<10000000 Then Print At 1, 1, " ", " ", Dec j6,".", Dec j5, Dec j4, Dec j3,".", Dec j2, Dec j1, Dec j0," Hz"
If j<1000000 Then Print At 1, 1, " ", " ", " ", " ", Dec j5, Dec j4, Dec j3,".", Dec j2, Dec j1, Dec j0," Hz"
If j<100000 Then Print At 1, 1, " ", " ", " ", " ", " ", Dec j4, Dec j3,".", Dec j2, Dec j1, Dec j0," Hz"
If j<10000 Then Print At 1, 1, " ", " ", " ", " ", " ", " ",Dec j3,".", Dec j2, Dec j1, Dec j0," Hz"
If j<1000 Then Print At 1, 1, " ", " ", " ", " ", " ", " ", " ", " ", Dec j2, Dec j1, Dec j0," Hz"
If j<100 Then Print At 1, 1, " ", " ", " ", " ", " ", " ", " ", " ", " ", Dec j1, Dec j0," Hz"
If j<10 Then Print At 1, 1, " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", Dec j0," Hz"
Можно это уменьшить по объему?
Подскажите, а как измерить длительность импульса и паузы, что бы посчитать скважность?
Наверное тут потребуются прерывания?
T = t + tau (t - длительн. импульса tau - длит. "паузы")
S = T / t (S - скважность)

Сообщение отредактировал доцент2 - Вс, 09.07.2017, 18:26
Boroda Дата: Сб, 09.09.2017, 18:01  |                                                                                                                Сообщение # 74
Группа: Проверенные
Ранг:  Новенький
Сообщений: 7
Репутация: 0   ±
Замечания:   ±
На сайте с 29.01.2009

Статус: Offline

доцент2,

Код
IF j_old <> j THEN  ' если значение поменялось
    PRINT AT 1,1, REP " "\15
    PRINT AT 1, 11, DEC j0," Hz"
    IF j>=10       THEN PRINT AT 1, 10, DEC j1
    IF j>=100      THEN PRINT AT 1, 9,  DEC j2
    IF j>=1000     THEN PRINT AT 1, 7,  DEC j3,"."
    IF j>=10000    THEN PRINT AT 1, 6,  DEC j4
    IF j>=100000   THEN PRINT AT 1, 5,  DEC j5
    IF j>=1000000  THEN PRINT AT 1, 3,  DEC j6,"."
    IF j>=10000000 THEN PRINT AT 1, 2,  DEC j7
END_IF
j_old = j ; запоминаем старое значение

Сообщение отредактировал Boroda - Сб, 09.09.2017, 18:06
Форум Picbasic.ru » Скорая помощь начинающим » Помощь в вопросах программирования » алгоритм
  • Страница 5 из 5
  • «
  • 1
  • 2
  • 3
  • 4
  • 5
Поиск: