Как считать частоту

Вопросы настройки, программирования, прошивки микроконтроллеров и микросхем программируемой логики
kras
Опытный кот
Сообщения: 782
Зарегистрирован: Вт апр 26, 2011 18:37:06

Как считать частоту

Сообщение kras »

То ли это я не так понял, то ли просто с осциллографом в Proteus не умею работать. Смотрите код. В чем ошибка, почему частота не такая? Сейчас попробую еще сравнить звуковые частоты на слух, но мне надо по коду четко знать, сколько получается.

Код: Выделить всё

LIST        P=PIC16F84A				; условимся, что резонатор на 10МГц. Пренебрегаю пока командами, отнимающими мало времени на их выполнение
            __CONFIG    H'3FF2'
STATUS      EQU         H'0003'
TRISA       EQU         H'0005'
PORTA       EQU         H'0005'
TRISB       EQU         H'0006'
PORTB       EQU         H'0006'
A1		EQU			0Ch
A2		EQU			10H
            org         0           ; начало программы             
; подготовительные моменты
            bsf         STATUS,5    ; переход в Банк 1 
            movlw       b'00011111'
            movwf       TRISA
            clrf        TRISB
            bcf         STATUS,5    ; переход назад в Банк 0
            clrf        PORTB       ; очистка порта
; отслеживание нажатия кнопки
m1									; цикл меандра
	movlw       b'11111111'
    movwf       PORTB				;установил 1 и потратил 2 цикла на 2 операции
	movlw		b'1100100'			;потратил 4 цикла на 4 операции
	movwf		A1
	movlw		b'1100100'
	movwf		A2		
		m11							; подождал 100*100=10000 нопов + 10001 decfsz + 19998 goto. T тактовых = 0.1мкс. Итого '1' втечение 0.1мкс*40000=4000мкс
			m111
			nop
			decfsz		A2,1
			goto		m111
		decfsz		A1,1
		goto		m11
	clrf        PORTB				; 1 цикл
	movlw		b'1100100'			; 1 цикл
	movwf		A1					; 1 цикл
	movlw		b'1100100'			; 1 цикл
	movwf		A2					; 1 цикл
		m12							; подождал 10000 нопов + 10001 decfsz + 19998 goto. T тактовых = 0.1мкс. Итого '0' втечение 0.1мкс*40000=4000мкс
			m121
			nop
			decfsz		A2,1		
			goto		m121
		decfsz		A1,1
		goto		m12
	goto		m1					; 2 цикла
	end                     ; конец программы. Получаю меандр с F=1/8мс=0.125кГц. А на деле F=1/82мс=0.012кГц
Вложения
er1.jpg
(88.7 КБ) 287 скачиваний
На практике можно не успеть сделать того, что можно хорошо обосновать в теории. Но без практики теория может отдаляться от нее, и когда они встретятся снова - не узнает даже неприкосновенное шампанское профессора в лаборатории. Моя практика: robofeya.ru
Реклама
Аватара пользователя
Dmitry Dubrovenko
Поставщик валерьянки для Кота
Сообщения: 2360
Зарегистрирован: Вс янв 09, 2011 16:51:39
Откуда: Санкт-Ленинград
Контактная информация:

Re: Как считать частоту

Сообщение Dmitry Dubrovenko »

kras писал(а):условимся, что резонатор на 10МГц
Протеусу наплевать на резонатор. Частоту необходимо выставлять в свойствах МК.
ICQ нет, и, в ближайшее время, не будет.
Реклама
kras
Опытный кот
Сообщения: 782
Зарегистрирован: Вт апр 26, 2011 18:37:06

Re: Как считать частоту

Сообщение kras »

Так и делал. Но считаю примерно: нопов 10000, + 10100 циклов decfsz + 20100 циклов goto. Нопы четко, к decfsz не учел еще 101 цикл, а goto занимают на 101 цикл меньше. Разве не так? То есть у меандра расчетное Т = 40200мкс*2*0.1=8.04мс.
И я врубился. У меня регистр обнулился, но заново не заполняется, то есть количество циклов у меня получилось большим, чем надо.
На практике можно не успеть сделать того, что можно хорошо обосновать в теории. Но без практики теория может отдаляться от нее, и когда они встретятся снова - не узнает даже неприкосновенное шампанское профессора в лаборатории. Моя практика: robofeya.ru
kras
Опытный кот
Сообщения: 782
Зарегистрирован: Вт апр 26, 2011 18:37:06

Re: Как считать частоту

Сообщение kras »

Неа, все равно не выходит:( Вот новый код. Заметьте, что 1/2=0.5, может здесь где-то косяк?

Код: Выделить всё

LIST        P=PIC16F84A				; условимся, что резонатор на 10МГц. Пренебрегаю пока командами, отнимающими мало времени на их выполнение
            __CONFIG    H'3FF2'
STATUS      EQU         H'0003'
TRISA       EQU         H'0005'
PORTA       EQU         H'0005'
TRISB       EQU         H'0006'
PORTB       EQU         H'0006'
A1		EQU			0Ch
A2		EQU			10H
            org         0           ; начало программы             
; подготовительные моменты
            bsf         STATUS,5    ; переход в Банк 1 
            movlw       b'00011111'
            movwf       TRISA
            clrf        TRISB
            bcf         STATUS,5    ; переход назад в Банк 0
            clrf        PORTB       ; очистка порта
; отслеживание нажатия кнопки
m1									; цикл меандра
	movlw       b'11111111'
    movwf       PORTB
	movlw		b'10000000'
	movwf		A1		
		m11							; 127 раз выполняется 2+15+3=20команд, а последний 128 раз 19команд, итого 127*20+19=2559команд. T тактовых = 0.1мкс. Итого '1' втечение 0.1мкс*2559=0.25мс
		movlw		b'0100'
		movwf		A2				
			m111					; весь этот луп можно считать как 4*3+3=15циклов в теле m11
			nop
			decfsz		A2,1
			goto		m111
		decfsz		A1,1
		goto		m11
	clrf        PORTB				
	movlw		b'10000000'			
	movwf		A1					
		m12							; '0'
			movlw		b'0100'
			movwf		A2
			m121
			nop
			decfsz		A2,1		
			goto		m121
		decfsz		A1,1
		goto		m12
	goto		m1					; 2 цикла
	end                     ; конец программы. Получаю меандр с F=1/0.5мс=2кГц. А на деле F=500Гц (проверил программой и фортепиано, около ноты си первой октавы)
На практике можно не успеть сделать того, что можно хорошо обосновать в теории. Но без практики теория может отдаляться от нее, и когда они встретятся снова - не узнает даже неприкосновенное шампанское профессора в лаборатории. Моя практика: robofeya.ru
Реклама
Эиком - электронные компоненты и радиодетали
Аватара пользователя
Dmitry Dubrovenko
Поставщик валерьянки для Кота
Сообщения: 2360
Зарегистрирован: Вс янв 09, 2011 16:51:39
Откуда: Санкт-Ленинград
Контактная информация:

Re: Как считать частоту

Сообщение Dmitry Dubrovenko »

Такие огроменные задержки надо организовывать по прерываниям от таймеров. :wink:
ICQ нет, и, в ближайшее время, не будет.
Реклама
kras
Опытный кот
Сообщения: 782
Зарегистрирован: Вт апр 26, 2011 18:37:06

Re: Как считать частоту

Сообщение kras »

Точно. Но все-таки хочу понять, где косяк. А с таймером как будет код выглядеть примерно? А то я пока хз, как его вызывать:)
На практике можно не успеть сделать того, что можно хорошо обосновать в теории. Но без практики теория может отдаляться от нее, и когда они встретятся снова - не узнает даже неприкосновенное шампанское профессора в лаборатории. Моя практика: robofeya.ru
Реклама
kras
Опытный кот
Сообщения: 782
Зарегистрирован: Вт апр 26, 2011 18:37:06

Re: Как считать частоту

Сообщение kras »

Дайте хотя бы ссылку на статью какую-нибудь, что-то серьезно не могу найти что-нибудь с таймером на asm:(
На практике можно не успеть сделать того, что можно хорошо обосновать в теории. Но без практики теория может отдаляться от нее, и когда они встретятся снова - не узнает даже неприкосновенное шампанское профессора в лаборатории. Моя практика: robofeya.ru
kras
Опытный кот
Сообщения: 782
Зарегистрирован: Вт апр 26, 2011 18:37:06

Re: Как считать частоту

Сообщение kras »

Может быть с командами что не то? Больше циклов занимают или как? Я сейчас пробую поменять частоту, но это вообще никаким расчетам не поддается, причем эти расчеты оказываются верными на вид уже где-то 6 раз.
На практике можно не успеть сделать того, что можно хорошо обосновать в теории. Но без практики теория может отдаляться от нее, и когда они встретятся снова - не узнает даже неприкосновенное шампанское профессора в лаборатории. Моя практика: robofeya.ru
Аватара пользователя
uldemir
Друг Кота
Сообщения: 7360
Зарегистрирован: Пт авг 28, 2009 21:34:30
Откуда: 845-й км.

Re: Как считать частоту

Сообщение uldemir »

Лень вникать, но у пиков при 10МГц кварце одна команда выполняется 0.4мкс... (меня смутило, что везде вкомментариях присутствует 0.1)
А люди посмотрят и скажут: "Собаки летят. Вот и осень."
kras
Опытный кот
Сообщения: 782
Зарегистрирован: Вт апр 26, 2011 18:37:06

Re: Как считать частоту

Сообщение kras »

Так тогда все уже покрасивее выглядит. Только почему 0.4мкс? Написано же про команды, что выполняются за столько машинных циклов, а длительность машинного цикла я приравнивал к периоду ТИ. То есть тут это равенство не соблюдается? А можно подробнее, кстати? Зачем именно 4?
На практике можно не успеть сделать того, что можно хорошо обосновать в теории. Но без практики теория может отдаляться от нее, и когда они встретятся снова - не узнает даже неприкосновенное шампанское профессора в лаборатории. Моя практика: robofeya.ru
Аватара пользователя
uldemir
Друг Кота
Сообщения: 7360
Зарегистрирован: Пт авг 28, 2009 21:34:30
Откуда: 845-й км.

Re: Как считать частоту

Сообщение uldemir »

Вы, в натуре полагаете, что Вам тут будут даташит пересказывать?
А люди посмотрят и скажут: "Собаки летят. Вот и осень."
Аватара пользователя
Psych
Опытный кот
Сообщения: 848
Зарегистрирован: Ср мар 02, 2011 07:47:39
Откуда: Уфа

Re: Как считать частоту

Сообщение Psych »

1 машинный цикл не равен 1 машинному такту
Аватара пользователя
urry
Сверлит текстолит когтями
Сообщения: 1262
Зарегистрирован: Пн дек 08, 2008 10:58:48
Откуда: Винница
Контактная информация:

Re: Как считать частоту

Сообщение urry »

ну и где, говоря словами Станиславского, сверхзадача ?
На .. его считать, если можно включить в дебаге stopwath ?
Аватара пользователя
Dmitry Dubrovenko
Поставщик валерьянки для Кота
Сообщения: 2360
Зарегистрирован: Вс янв 09, 2011 16:51:39
Откуда: Санкт-Ленинград
Контактная информация:

Re: Как считать частоту

Сообщение Dmitry Dubrovenko »

kras писал(а):А с таймером как будет код выглядеть примерно?
Надо включить таймер, и организовать обработчик прерывания.
kras писал(а):Но все-таки хочу понять, где косяк.
Кстати, а у Вас точно прерывания все выключены?

kras писал(а):Дайте хотя бы ссылку на статью какую-нибудь, что-то серьезно не могу найти что-нибудь с таймером на asm
Даже не знаю. Могу свой проект предложить, но там про непосредственно прерывания в общем-то ничего не говорится. Можно только исходники глянуть.
Но лучше скачать документацию отсюда. Если хорошо английским владеете, то, разумеется, лучше отсюда.
ICQ нет, и, в ближайшее время, не будет.
Аватара пользователя
Dmitry Dubrovenko
Поставщик валерьянки для Кота
Сообщения: 2360
Зарегистрирован: Вс янв 09, 2011 16:51:39
Откуда: Санкт-Ленинград
Контактная информация:

Re: Как считать частоту

Сообщение Dmitry Dubrovenko »

urry писал(а):можно включить в дебаге stopwath
Кстати, да. Очень полезная штука.
Для тех, кто не в курсе, это - в МПЛАБ такая приблуда есть. Но, опять же, там надо, в настройках, правильно задать частоту.
ICQ нет, и, в ближайшее время, не будет.
kras
Опытный кот
Сообщения: 782
Зарегистрирован: Вт апр 26, 2011 18:37:06

Re: Как считать частоту

Сообщение kras »

Кстати, а у Вас точно прерывания все выключены?
Я не разбираюсь, как в микроконтроллере обрабатывать прерывания. Кстати, я только что нашел таймер в даташите (надо было поспать:D), сейчас почитаю.
На практике можно не успеть сделать того, что можно хорошо обосновать в теории. Но без практики теория может отдаляться от нее, и когда они встретятся снова - не узнает даже неприкосновенное шампанское профессора в лаборатории. Моя практика: robofeya.ru
kras
Опытный кот
Сообщения: 782
Зарегистрирован: Вт апр 26, 2011 18:37:06

Re: Как считать частоту

Сообщение kras »

Сверхзадача
Это даже не задача. Пару циклов то всего посчитать. Субтитры:)
stopwath
А я ее так и не нашел пока:(:)
Кстати, а у Вас точно прерывания все выключены?
Я не разбираюсь, как в микроконтроллере обрабатывать прерывания. Кстати, я только что нашел таймер в даташите (надо было поспать:D), сейчас почитаю.
С частотой-то все правильно, вроде, я это имел ввиду. Теперь надо использовать таймер, там, может, поменьше циклов будет, а то я эту штуку делаю именно для синтезатора звука, то есть не НЧ. А как лучше многоголосие сделать? Я просто идей в готовых проектах пока так и не понимаю:( Может кто объяснит что пооптимальнее?
На практике можно не успеть сделать того, что можно хорошо обосновать в теории. Но без практики теория может отдаляться от нее, и когда они встретятся снова - не узнает даже неприкосновенное шампанское профессора в лаборатории. Моя практика: robofeya.ru
Аватара пользователя
nictrace
Мучитель микросхем
Сообщения: 492
Зарегистрирован: Вс янв 11, 2009 09:29:08
Откуда: Ярославль
Контактная информация:

Re: Как считать частоту

Сообщение nictrace »

я делал частотомер в протеусе на АВР-ке.
Оказалось, что счетчик циклов разный при сквозном запуске процедуры и при запуске с точками останова! Сейчас найду проект, дам точный цыферь.
Мои верные друзья - АМD и AVR
LM317 - атцтой, LM2576ADJ - форева! :)
kras
Опытный кот
Сообщения: 782
Зарегистрирован: Вт апр 26, 2011 18:37:06

Re: Как считать частоту

Сообщение kras »

Ого)) А я уже тут получил все основные частоты для такого моего кода, но я просто по коду считал, по формуле:). А как несколько сигналов разной частоты одновременно генерировать - не знаю точно.
На практике можно не успеть сделать того, что можно хорошо обосновать в теории. Но без практики теория может отдаляться от нее, и когда они встретятся снова - не узнает даже неприкосновенное шампанское профессора в лаборатории. Моя практика: robofeya.ru
Аватара пользователя
nictrace
Мучитель микросхем
Сообщения: 492
Зарегистрирован: Вс янв 11, 2009 09:29:08
Откуда: Ярославль
Контактная информация:

Re: Как считать частоту

Сообщение nictrace »

вот моя статейка на эту тему, может сгодится?
http://ru-radio-electr.livejournal.com/552826.html
Мои верные друзья - АМD и AVR
LM317 - атцтой, LM2576ADJ - форева! :)
Закрыто

Вернуться в «Микроконтроллеры и ПЛИС»