MicroCHIP.RU
Главная Документация Отладочные средства Справочник Поиск Ссылки
 Новости   Конференция   Контакты 
 

И снова о DTMF

 Нoвaя темa  |  Наверх  |  Перейти к теме  |  Поиск  |  Правила  |  Вход 

ВНИМАНИЕ!
Вы просматриваете архив форума.

Этот форум работает только в режиме просмотра и поиска.

Действующий форум переведен на новый движок и
находится по адресу www.microchip.su

 И снова о DTMF
Автор: Vit ()
Дата:   15/09/2004 16:35

Предварительно пройдя поиском по этому сайту и с помощью яндексов на других сайтах,
обнаружил отсутствие работающих программ - кодеров DTMF.
Обращаюсь к Вам с поклоном, помогите мне с программой, выдающей через ЦАП нужные
для тонального набора частоты.
Второй вопрос: имеет значение сколько разрядов отводится ЦАПу - шесть или восемь?
Мне, из-за недостатка выводов, удастся выделить под него только шесть разрядов.


Спасибо.




 
 Re: И снова о DTMF
Автор: Make_Pic ()
Дата:   15/09/2004 16:50

Разрядность Цапа - чем больше тем лучше! Если делать на соответствие ГОСТ 7153-85,
то и 8 разрядов мало. Если для себя и чтобы не шибко хорошо определялось АТС, то 6
разрядов потянет.


 
 Re: И снова о DTMF
Автор: next ()
Дата:   15/09/2004 18:39

Vit писал(а):

> Предварительно пройдя поиском по этому сайту и с помощью
> яндексов на других сайтах,
> обнаружил отсутствие работающих программ - кодеров DTMF.
> Обращаюсь к Вам с поклоном, помогите мне с программой, выдающей
> через ЦАП нужные
> для тонального набора частоты.

Для цапа у Майкрочипа в ANах вроде было.

> Второй вопрос: имеет значение сколько разрядов отводится ЦАПу -
> шесть или восемь?
> Мне, из-за недостатка выводов, удастся выделить под него только
> шесть разрядов.

Нет смысла делать лучше чем оно через E1 пролезает, хватит 6.
Ежели делать как ADPCM то совсем замечательно.


 
 Re: И снова о DTMF
Автор: layout ()
Дата:   16/09/2004 08:03

> Нет смысла делать лучше чем оно через E1 пролезает, хватит 6.

Нашел в AN655 описание и программу для вывода DTMF. ЦАП выполнен восьмиразрядным.
Скажите пожалуйста, для правильной работы шестиразрядного ЦАПа нужно будет
пересчитать таблицы в программе вида:
retlw 170
retlw 190
retlw 208
retlw 224
retlw 236
retlw 246
retlw 253
retlw 255
retlw 254
retlw 250
retlw 242
retlw 230
и т.д. ?
Правильно я понимаю, что нужно представить данные так, чтобы их максимум был не
1111 1111 (B'255), а 11 1111 (В'63) ?

Надеюсь на Вашу помощь...
Спасибо.


 
 :) Да. Просто нужно
Автор: Bill ()
Дата:   16/09/2004 08:13

поделить весятичное число на 4. Или в двоичном виде отбросить два младших (правых) разряда. Можно
таблицу переписать целиком. А можно (если исходный текст уже есть) выполнить сдвиг перед выводом
значения в ЦАП.


 
 Re: И снова о DTMF
Автор: IgorV ()
Дата:   16/09/2004 08:33

Делал сто лет назад. Работает до сих пор. Разбирайся сам чё тут лишнее. Кварец
3.579МГц
;**********************************************************************
;	Программа для ТВ100 с измерениями напряжения
;	и выдаче десятичного значения 000-190 через 
;	ИР8 на CONTROL
;
;
;
;  
;************************************************************************
;	(РАСПРЕДЕЛЕНИЕ УТОЧНЯЕТСЯ)"""""""""""""""""
;	запрос-> 8E +код кнопок (32=II on/off 10=I on/off)
;	запрос-> BE возврат Е +6 посылок 0-7
;	используются CCP2 вместе с TMR1, CCP1 вместе с TMR2 
;
;	A0-аналоговый установка числа при каллибровке
;	A1-вход мощметра 
;	A2-вход записи нового числа (`````\___)
;	А4-вход режима 0/1=каллибр/измерения
;	A5-светодиод обращения к данному устройству
;	
;	A3-вход    
; 	Порт B с подтягивающими резисторами
;       B0-B5 входы от 1109КТ21 с 10 по 15 выводы (это от лампочек)
;	B6 и B7 -'выкл' и 'сброс' 1109КТ22 выводы 5=4 и 3
;
;
;	C0 и С1 включение I и II комплекта 1109КТ22 выв.1 и 2
;
;	C2 выход ШИМ  
;
;	C4-C7 -заняты под 1008ВЖ18(декодер) порядок ножек обратный
;	для совместимости программ
;	C3-готовность 
данных                                                                 
;**********************************************************************


	list      p=16f873            ; list directive to define processor
	#include <p16f873.inc>        ; processor specific variable definitions
	
;;;;;;;	__CONFIG   _CP_OFF & _WDT_OFF & _BODEN_ON & _PWRTE_ON & _XT_OSC

; '__CONFIG' directive is used to embed configuration data within .asm file.
; The lables following the directive are located in the respective .inc file.
; See respective data sheet for additional information on configuration word.

;	errorlevel	-302 ;про регистр в другом банке
;	errorlevel	-224 ;про TRIS и OPTION

;	КОНСТАНТЫ
ON1	equ	0	; для PORTC
ON2	equ	1	; для PORTC
OFF	equ	6	; для PORTB
RESET	equ	7	; для PORTB
READY	equ	3	; для PORTC


;***** VARIABLE DEFINITIONS
	cblock	0x20
	
	w_temp        	; variable used for context saving 
	status_temp   	; variable used for context saving

	ADC0		; значение АЦП0 каллибровшик
	ADC1		;        =//= 1 мощметр
	FlagKall	; бит0=1была коррекция каллибровки
;###########   ИЗМЕРЕНИЯ АЦП ПРОИЗВОДЯТСЯ ПРИ ВЫДАЧЕ DTMF

	count		;счётчик числа посылок DTMF в пакете
	outsin		; для подготовки в ШИМ

	temp		;
	A_base		
	B_base		
	A_point		
	B_point		

	TXDh		;P от 0 до 1F данные для передачи
	TXDl		;00XXXXXX из PORTB в 6-и посылках
	endc


;**********************************************************************
		ORG     0x000             ; processor reset vector
		clrf    PCLATH            ; ensure page bits are claared
  		goto    main              ; go to beginning of program


		ORG     0x004             ; interrupt vector location
		movwf   w_temp            ; save off current W register contents
		movf	STATUS,w          ; move status register into W register
		movwf	status_temp       ; save off contents of STATUS register


; isr code can go here or be located as a call subroutine elsewhere
; ничего то тут не потребовалось

		movf    status_temp,w     ; retrieve copy of STATUS register
		movwf	STATUS            ; restore pre-isr STATUS register contents
		swapf   w_temp,f
		swapf   w_temp,w          ; restore pre-isr W register contents
		retfie                    ; return from interrupt

;*****************************************************************
;*****************************************************************
;
;	ОСНОВНАЯ ПРОГРАММА	@@@@@@@@@@@@
;
;	
;
;*****************************************************************
;*****************************************************************
	errorlevel	-302 ;про регистр в другом банке	
main		clrf	PORTA
		clrf	PORTB
		clrf	PORTC
		clrf	FlagKall	;сбросить флаг наличия калибровки.
		bsf	STATUS,RP0	;вкл банк 1
;	{1	
;PORTA
		clrf	OPTION_REG	; включить нагрузки, остальное поровну
		movlw	b'011111'	;установить ВСЕХ как входы
		movwf	TRISA		;A2,A4 цифровые входы
					;A5-выход на светодиод
		movlw	0x04		;выравнивание влево
		movwf	ADCON1		;A0,A1,A3 аналоговые входы
;----------------------------------------------------------------------
;PORTB
		movlw	b'00111111'	;В6,B7 выходы, остальные входы
		movwf	TRISB		; 
;----------------------------------------------------------------------
;PORTC	
		movlw	b'11111000'	; C7-C3 входы
		movwf	TRISC		; C1-C0 выходы 
					; C2 - ШИМ выход
		movlw	0x1F		;установить период ШИМ
		movwf	PR2		;
;	1}				;
		bcf	STATUS,RP0	;вкл банк 0
;----------------------------------------------------------------------

	errorlevel	+302 ;про регистр в другом банке

; ТАЙМЕР1 и CCP2 режим запуска АЦП
		movlw	b'110001'	; загрузить режим таймера 1
		movwf	T1CON		; 

		clrf	CCPR2L		; значение делителя 2000h  @@@@@@@
		movlw	0x18		; соответствует примерно 55mc
		movwf	CCPR2H		; для кварца 3.579545 МГц
		clrf	TMR1L		; ...но взята половина
		clrf	TMR1H		;
		movlw	b'1011'		; загрузить режим CCP2
		movwf	CCP2CON		;
;----------------------------------------------------------------------
;включить АЦП Fosc/8, chanel0 

		movlw	b'01000001'	;включить  АЦП
		movwf	ADCON0		;
;----------------------------------------------------------------------
;ТАЙМЕР2 и CCP1 режим	ШИМ	
		
		movlw	0x04		;вкючить TMR2 1:1 & 1:1
		movwf	T2CON		;
		movlw	0x0F		;Включить режим ШИМ
		movwf	CCP1CON		;
		clrf	CCPR1L		;установка нуля на вых ШИМ

;============================ОСНОВНОЙ ЦИКЛ===============================
;	ADCON0,CHS0 - адрес входа АЦП 1=Мощметр 0=каллибровщик 
mainloop	call	DRILL		;ПОЛУЧИТЬ ЗАПРОС

		xorlw	0xFF		;возврат по ошибке 
		btfsc	STATUS,Z	;или ином формате
		goto	mainloop	;

		btfsc	PORTA,4		;разделение режима на 
		goto	IZMER		;измерения и на
		goto	KALLIBR		;каллибровку

IZMER		btfsc	FlagKall,0	;если есть флаг каллибровки
		call	SETKallibr	;запомнить новую каллибровку
					;если нет -работать
		rrf	ADC1,W		;
		andlw	0x7F		;
		call	DEPRESS		;взять из таблицы!!! И
		movwf	TXDh		;положить значение мощности
		goto	commonMAIN	;общий кусок

KALLIBR		rrf	ADC0,W		;/2  получение изображения каллибровки
		movwf	temp		;
		rrf	temp,W		;/4
		andlw	0x3F		;ограничить 
		addwf	ADC0,F		;  *1,01 bin перенос в С возможен
	
		swapf	ADC0,W		;/16
		andlw	0x0f		;обнулить бит +16
		btfsc	STATUS,C	;если был перенос...
		iorlw	0x10		;поставить +16
		movwf	ADC0		;сохранено /256*20
		
		call	BCD		;перекодировать полученные bin->DEC
		movwf	TXDh		;запомнить изображение мощности для выдачи

		movf	ADC0,W
		addlw	0x60		;подготовить адрес изображения для записи Up
		bcf	STATUS,IRP	;
		movwf	FSR		; будет 60h-7Fh
		btfsc	PORTA,2		;разделение на запись нового изображения
		goto	commonMAIN	;
			

NEWIZMER	rrf	ADC1,W		;данные Up 0-7F
		andlw	0x7F		;
		movwf	INDF		;по адресу изображения
		bsf	FlagKall,0	;установить флаг наличия каллибровки
commonMAIN	swapf	PORTB,W		; и значения лампочек
		andlw	b'11110011'	; в регистры выдачи
		movwf	TXDl		;

		movlw	0x0E		;символ ответа	
		call	SEND		;
		call	TXD		;выдать данные
	
		goto	mainloop	;
;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
SETKallibr	bcf	FlagKall,0	;сброс флага новой каллибр.
		clrf	count		;это будут данные
		movlw	0x61		;это адрес чтения 
		movwf	FSR		;
		clrf	temp		;это адрес для EERAM
SETloop		call	PRESS		;1-й раз записать 0 в 0
		incf	temp,F		;увеличить адрес
		
		btfsc	temp,7		;выйти по окончанию
		return

		movf	temp,W		;
		xorwf	INDF,W		;
		btfss	STATUS,Z	;
		goto	SETold		;
		
		incf	FSR,F		; 60-7F
		incf	count,f		; 00-1F
SETold		goto	SETloop		;

		return			;
;**********************************************************
;	Подпрограмма приёма 4 бита через дтмф декодер
;	1008ВЖ18 =(BT8870)
;	C4-C7 DATA, C3=1 данные готовы
;	выход в РГ temp (bit 7 = готовность)
;**********************************************************
DECODER	clrf	temp		;очистить W

;	movlw	0x7F		;установить таймер на максимальное..... 
;	movwf	FLASH		;......время выдержки 0.5 сек

Ldec	btfss	PORTC,READY	;ждём готовность данных
	goto	Ldec		;

Ldec1	btfsc	PORTC,READY	;ищем конец посылки
	goto	Ldec1		;найден - на FOUND

FOUND	swapf	PORTC,W		;прочитать данные
	call	SOS		;
	movwf	temp		;бит temp,7 =1
	return			;..
;**********************************************************
;	Подпрограмма вылавливания из входного потока
;	посылок сочетания 'BE' как запроса
;	или '8E'
;	не выйдет пока не получит один из запросов 
;
;**********************************************************
DRILL	call	DECODER		;приём посылки (запроса)
	movlw	0x8B		;должна быть буква 'B'
	xorwf	temp,W		;
	btfss	STATUS,Z	;если нет, то обратно на начало
	goto	other		;если нет то пробуем другой
	
	call	DECODER		;получить новую посылку
	movlw	0x8E		;	и
	xorwf	temp,W		;сравнить её с буквой 'E'
	btfss	STATUS,Z	;если не она то
	goto	DRILL		;зациклиться на этом опросе

;0=ON1		equ	0	; для PORTC
;1=ON2		equ	1	; для PORTC
;2=OFF		equ	6	; для PORTB
;3=RESET	equ	7	; для PORTB
;READY	equ	3	; для PORTC
	
	
	bcf	PORTC,ON1	;  I on прекратить
	bcf	PORTC,ON2	; II on прекратить
	bcf	PORTB,RESET	; сброс прекратить
	bcf	PORTB,OFF	; выкл прекратить
	
	bcf	PIR1,ADIF	;сброс флага прерывания
	clrf	TMR1L		; ===ПАУЗА 73 мс. перед выходом
	clrf	TMR1H		;
	clrf	PIR1		;
	btfss	PIR1,ADIF	;висим, пока нет запроса на прерыв
	goto	$-1		;от АЦП
	retlw	0x00		;

other	movlw	0x88		;должна быть буква '8'
	xorwf	temp,W		;
	btfss	STATUS,Z	;если нет, то обратно на начало
	goto	DRILL		;если нет то пробуем другой
	
	call	DECODER		;получить новую посылку
	movlw	0x8E		;	и
	xorwf	temp,W		;сравнить её с буквой 'E'
	btfss	STATUS,Z	;если не она то
	goto	DRILL		;зациклиться на этом опросе

	call	DECODER		;прочитать код посылки
	bcf	PORTC,ON1	;  I on прекратить
	bcf	PORTC,ON2	; II on прекратить
	bcf	PORTB,RESET	; сброс прекратить
	bcf	PORTB,OFF	; выкл прекратить

	btfsc	temp,2		;
	bsf	PORTB,OFF	;включить 'выкл'

	btfsc	temp,3		;
	bsf	PORTB,RESET	;включить сброс

	btfsc	temp,0		;
	bsf	PORTC,ON1	;включить  I 
	btfsc	temp,1		;
	bsf	PORTC,ON2	;включить II



	retlw	0xFF		;имитация ошибки
;**********************************************************
;	Подпрограмма выдачи ответа удалённого терминала
;	формат: 6 посылок в виде 0xxx
;	посылаемые данные хранятся в TXDh и TXDl
;	
;**********************************************************
TXD	movlw	.6		;загрузить счётчик числом 
	movwf	count		;передаваемых посылок
Tloop	rlf	TXDl,F		;сдвинуть влево
	rlf	TXDh,F		;все данные для 
	rlf	temp,F		;подстановки в temp 2
	rlf	TXDl,F		;сдвинуть влево
	rlf	TXDh,F		;все данные для 
	rlf	temp,F		;подстановки в temp 1
	rlf	TXDl,F		;сдвинуть влево
	rlf	TXDh,F		;все данные для 
	rlf	temp,W		;подстановки в temp 0
	andlw	0x07		;убрать лишние биты
	call	SEND		;отправить очередную посылку
	decfsz	count,F		;посчитать число посылок
	goto	Tloop		;и по окончанию выйти
	return
;************************************************************
;
;  таблица преобразорвания с переворотом бит
;
;************************************************************
SOS	andlw	0x0F	;
	addwf	PCL,F	;
;		должно   было
	retlw	0x8F	;0
	retlw	0x88	;1
	retlw	0x84	;2
	retlw	0x8B	;3
	retlw	0x82	;4
	retlw	0x80	;5
	retlw	0x86	;6
	retlw	0x8D	;7
	retlw	0x81	;8
	retlw	0x89	;9
	retlw	0x85	;A
	retlw	0x8C	;B
	retlw	0x83	;C
	retlw	0x8A	;D
	retlw	0x87	;E
	retlw	0x8E	;F
;************************************************************
;
;  таблица преобразорвания 2->10
;
;************************************************************
BCD	andlw	0x1F	;
	addwf	PCL,F	;

	dt	0x00	;0
	dt	0x01	;1
	dt	0x02	;2
	dt	0x03	;3
	dt	0x04	;4
	dt	0x05	;5
	dt	0x06	;6
	dt	0x07	;7
	dt	0x08	;8
	dt	0x09	;9
	dt	0x10	;A
	dt	0x11	;B
	dt	0x12	;C
	dt	0x13	;D
	dt	0x14	;E
	dt	0x15	;F
	dt	0x16	;10
	dt	0x17	;11
	dt	0x18	;12
	dt	0x19	;13
	dt	0x19	;14
	dt	0x19	;15
	dt	0x19	;16
	dt	0x19	;17
	dt	0x19	;18
	dt	0x19	;19
	dt	0x19	;1A
	dt	0x19	;1B
	dt	0x19	;1C
	dt	0x19	;1D
	dt	0x19	;1E
	dt	0x19	;1F




		org	0xFF
;%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
;
;Таблица для получения ссылок на синус таблицу от КОДА 00h-0Fh
;должна быть в 0x0100h адресах
;
;%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%	
		
	
sinadres	addwf	PCL,F
keyoffset	
S0		dt 	row4-offs, col2-offs	; 0
S1		dt	row1-offs, col1-offs	; 1
S2		dt	row1-offs, col2-offs	; 2
S3		dt	row1-offs, col3-offs	; 3
S4		dt	row2-offs, col1-offs	; 4
S5		dt	row2-offs, col2-offs	; 5
S6		dt	row2-offs, col3-offs	; 6
S7		dt	row3-offs, col1-offs	; 7
S8		dt	row3-offs, col2-offs	; 8
S9		dt	row3-offs, col3-offs	; 9
SA		dt	row4-offs, col1-offs	; A
SB		dt	row4-offs, col3-offs	; B
SC		dt	row1-offs, col4-offs	; C
SD		dt	row2-offs, col4-offs	; D
SE		dt	row3-offs, col4-offs	; E
SF		dt	row4-offs, col4-offs	; F

;****************************************************************
;	Таблица sinus должна быть в 0x0100 адресах		|
;		       	формат данных:				|
;|   7	|   6	|   5	|   4	|   3	|   2	|   1	|   0	|
;+======+=======+===============================================|
;| END!	|   -	|   -	|   4	|   3	|   2	|   1	|   0	| 
;|	|	| 	| 	|	|	|	|	| 
;****************************************************************
		
SINUS		addwf	PCL,F	;
offs		;	частоты строк	
				;697  40
row1		dt	.8,.9,.10,.11,.12,.12,.13,.14,.14,.14,.14,.14
		dt	.14,.14,.13,.12,.12,.11,.10,.9,.8,.6,.5,.4,.3
		dt	.3,.2,.1,.1,.1,.1,.1,.1,.1,.2,.3,.3,.4,.5,.6+0x80

				;770  36
row2		dt	.8,.9,.10,.11,.12,.13,.14,.14,.14,.14,.14,.14
		dt	.14,.13,.12,.11,.10,.9,.8,.6,.5,.4,.3,.2,.1
		dt	.1,.1,.1,.1,.1,.1,.2,.3,.4,.5,.6+0x80
				;852  33
row3		dt	.8,.9,.10,.11,.12,.13,.14,.14,.14,.14,.14,.14
		dt	.13,.12,.11,.9,.8,.7,.6,.4,.3,.2,.1,.1,.1,.1
		dt	.1,.1,.2,.3,.4,.5,.6+0x80

				;941 30
row4		dt	.8,.9,.10,.12,.13,.14,.14,.14,.14,.14,.14,.13
		dt	.12,.10,.9,.8,.6,.5,.3,.2,.1,.1,.1,.1
		dt	.1,.1,.2,.3,.5,.6+0x80
;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
		; частоты столбцов
;1209  23
col1		dt	.9,.11,.13,.15,.16,.17,.17,.17,.15,.14,.12,.10
		dt	.7,.5,.3,.2,.0,.0,.0,.1,.2,.4,.6+0x40

;1336  21
col2		dt	.9,.11,.13,.15,.16,.17,.17,.16,.14,.12,.10,.7
		dt	.5,.3,.1,.0,.0,.1,.2,.4,.6+0x40

;1477  19
col3		dt	.9,.11,.14,.16,.17,.17,.16,.15,.13,.10,.7
		dt	.4,.2,.1,.0,.0,.1,.3,.6+0x40

;1633  17
col4		dt	.9,.12,.14,.16,.17,.17,.15,.13,.10,.7
		dt	.4,.2,.0,.0,.1,.3,.5+0x40

;*****************************************************************
;
;
;	подпрограмма получения значения мощности 
;	в зависимости от данных в АЦП (W)
;
;*****************************************************************
	errorlevel	-302
DEPRESS		bsf	STATUS,RP1	;нужен 2
		bcf	STATUS,RP0	;    банк
		movwf	EEADR		; записать адрес 
		bsf	STATUS,RP0	;    банк 3
		bcf	EECON1,EEPGD	;указать "это память данных"
		bsf	EECON1,RD	;запусить чтение
		bcf	STATUS,RP0	;банк 2
		movf	EEDATA,W	;получить данные
		bcf	STATUS,RP1	;банк 0
		return			;
;*****************************************************************
;
;
;	подпрограмма записи значения count 
;	в EEPROM по адресу temp
;
;*****************************************************************
PRESS		
	errorlevel	-302
		bsf	STATUS,RP1	;
		bsf	STATUS,RP0	;банк 3
		btfsc	EECON1,WR	;ждать пока допишет
		goto	$-1		;
		bcf	STATUS,RP0	;банк 2
		movf	temp,W		;установить адрес
		movwf	EEADR		;   записи
		movf	count,W		;     и данные
		call	BCD		;преобразовать в DEC
		movwf	EEDATA		;
		bsf	STATUS,RP0	;банк 3
		bcf	EECON1,EEPGD	;указать DATA mem
		bsf	EECON1,WREN	;разрешить запись
;		bcf	INTCON,GIE	;запрет прерываний
		movlw	0x55		;пуск
		movwf	EECON2		;программ.
		movlw	0xAA		;
		movwf	EECON2		;
		bsf	EECON1,WR	;начать прогр
		bcf	EECON1,WREN	;запретить запись
		bcf	STATUS,RP0	;
		bcf	STATUS,RP1	;банк 0
		return
	errorlevel	+302

;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
;
;	п/п ВЫДАЧИ В РЕГИСТР ШИМ ДВУТАНАЛЬНЫЙ СИГНАЛ 
;	входные данные W от 0 до 0x0F 
;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
PUT_DTMF	bsf	PCLATH,0	;для таблиц с адресом 01XX h
		movwf	temp		;
		addwf	temp,F		;
		movf	temp,W		;
		call	sinadres	;
		movwf	A_base		;
		movwf	A_point		;

		incf	temp,W		;
		call	sinadres	;
		movwf	B_base		;
		movwf	B_point		;
		clrf	TMR1L		;
		clrf	TMR1H		;
		clrf	PIR1		;
		clrf	TMR2		;
loopsin		movf	A_point,W	;
		call	SINUS		; 6 циклов
		movwf	outsin		;первая половина данных
		incf	A_point,W	;сформировать +1
		btfsc	outsin,7	;проверка на конец
		movf	A_base,W	;если конец взять начальный
		movwf	A_point		;установить новый указатель
	
		movf	B_point,W	;
		call	SINUS		; 6 циклов
		addwf	outsin,F	;вторая половина данных
		incf	B_point,W	;сформировать +1
		btfsc	outsin,6	;проверка на конец
		movf	B_base,W	;если конец взять начальный
		movwf	B_point		;установить новый указатель
		movf	outsin,W	;
		andlw	0x1F		;
		movwf	CCPR1L		;выдать готовый код на ШИМ
		nop
		nop
		btfss	PIR1,ADIF	;пока нет флага остановки...
		goto	loopsin		;...зациклиться
		bcf	PIR1,ADIF	;сброс флага остановки
		clrf	PCLATH		;сброс адреса для таблиц
		clrf	CCPR1L
		return			;

;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
;
;			!!!!!!! АЦП !!!!!!!!
;
;	п/п ВЫДАЧИ В РЕГИСТР ШИМ ДВУТАНАЛЬНЫЙ СИГНАЛ  
;	входные данные W от 0 до 0x0F 
;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
SEND	bcf	ADCON0,CHS0 	; адрес входа АЦП 0=каллибровщик 
		bsf	PORTA,5	;зажечь светодиод 
	call	PUT_DTMF	;выдача DTMF 

	movf	ADRESH,W	;данные АЦП
	movwf	ADC0		;   сохранить для каллибровщика
	bsf	ADCON0,CHS0 	; адрес входа АЦП 1=Мощметр  
		bcf	PORTA,5	;погасить светодиод 
	clrf	TMR1L		;
	clrf	TMR1H		;
	clrf	PIR1		;
sendlp	btfss	PIR1,ADIF	;висим, пока нет запроса на прерыв
	goto	sendlp		;от АЦП
	bcf	PIR1,ADIF	;сброс флага прерывания

	movf	ADRESH,W	;данные АЦП сохранить 
	movwf	ADC1		;       для мощметра
	return

	
		

		end




 
 Re: И снова о DTMF
Автор: MajorPAE ()
Дата:   16/09/2004 13:51

Есть такая фигня - PicBasic. Там есть команда DTMF. Формирует на выводе сигнал с
помощью программного ШИМ. Я делал для 16F628/628A, работает на "ура" и через линию,
и через мобильник...


 
 PicBasic
Автор: layout ()
Дата:   16/09/2004 14:57

Не затруднит ли Вас прислать данную программу мне на мыло.
По инету нашел лишь бесплатную урезанную версию.


 
 ну ты крут - полковник :-) ( - )
Автор: patton ()
Дата:   16/09/2004 15:02

-


 
 Re: ну ты крут - полковник :-) ( - )
Автор: MajorPAE ()
Дата:   16/09/2004 15:13

В чем круизна-то? Связать чтение клавы со встроенной командой и откомпилить?
Обижаешь... :-)))))


 
 сорри, это я про бейсик :-) ( - )
Автор: patton ()
Дата:   16/09/2004 15:16

;)
вот почему ты к нам не пришёл? у меня тут электронный дятел больше чем ты получает,
обидно...


 
 Re: сорри, это я про бейсик :-) ( - )
Автор: MajorPAE ()
Дата:   16/09/2004 15:43

:-))) Плохо звал... ;-)) Хотя не думаю, что твой "дятел" больше чем я сейчас
получает... ;-))


 
 Re: PicBasic
Автор: MajorPAE ()
Дата:   16/09/2004 15:50

См. мыло...


 
 ну ты крут ;)
Автор: patton ()
Дата:   16/09/2004 15:51

а я опять от тоски, что в абсолютных адресах пишут, щас чёто в 2 словах не
расскажешь


 
 Re: ну ты крут ;)
Автор: MajorPAE ()
Дата:   16/09/2004 15:53

:-)) Не грусти: "... и это пройдет!..." (с) Соломон.