Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: pic16F877 генератор синуса и пилы
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > Все остальные микроконтроллеры > PIC
jin_jin
Уважаемые форумчане .. Помогите разобраться со следующей проблемой. Есть задание из которого смог сделать 2 пункта может у кого есть какие нибудь идеи как реализовать это по другому . Разработать ПО для м/к PIC 16F877, формирующее аналоговый сигнал двух видов с ручной регулировкой его параметров по следующему алгоритму: - при включении контроллера сигнал на выходе RC1 (канал В осциллогра-фа) равен 0 В; - однократное нажатие на клавишу «1» приводит к началу формирования на выходе RC1 сигнала синусоидальной формы с амплитудой пропорциональ-ными установленному углу поворота переменного резистора и средней частотой из указанного ниже диапазона; - однократное нажатие на клавишу «2» приводит к аналогичному началу формирования на выходе RC1 сигнала пилообразной формы; - вращение переменного резистора приводит к пропорциональной (от 0 до 2 В) регулировке амплитуде выходного сигнала, а при нажатой клавише «3» - к соответствующей регулировке частоты сигнала в диапазоне от 100 до 1000 Гц; - регулировка частоты сигнала в любом из режимов осуществляется путем нажатия и удержания одной из клавиш «3» или «+». При этом в течение всего времени нажатия этих клавиш пропорционально изменяется частота сигнала: при нажатии клавиши «3» - в сторону уменьшения, при нажатии клавиши «+» - в сторону увеличения. При отпускании этих клавиш частота остается на послед-нем установленном с их помощью уровне; Прилагаю написанный мною код и проект в протеусе

;////////////////////////////////////////////////////////////////////////
;// Функциональный генератор сигналов с ручным управлением
;//
;// email:jin_jin@mail.ru
;// icq 490479876


PROCESSOR PIC 16F877
#include<P16F877.inc>


errorlevel-302 ;установка протокола вывода сообщений об ошибках

;////////////////////////////////////////////////////////////////
;Fout equ 0x26 ; Частота на выходе ШИМ
;Fout equ .100 ; Частота на выходе ШИМ
Fclk equ .4000000 ; Тактовая частота Пика (Гц)
TblSise equ .128 ; Размер таблицы


fCOUNTER equ 0x20
fCOUNTER2 equ 0x21
BaseAddress equ 0x31
w_temp equ BaseAddress + 0x00 ;// Временный регистр для регистра W. ;// 'Прозрачно' отображается в вершине банков 1-3.
status_temp equ BaseAddress + 0x01 ;// Временный регистр для регистра STATUS
FSR_temp equ BaseAddress + 0x02 ;// Временный регистр для регистра FSR
psin equ BaseAddress + 0x03 ;// Указатель на таблицу sin

cnt0 equ 0x22 ; счетчики для программируемой задержки
cnt1 equ 0x23
cnt2 equ 0x24
cnt10 equ 0x25
H_byte equ 0x27 ;старший байт AD преобразования



;// PORTC
CCP2 equ .1
CCP1 equ .2

;// PORTA
RA1 equ 0X01
RA2 equ 0X02
RA3 equ 0X03
RA4 equ 0X04

;////////////////////////////////////////////////////////////////
;************ Макросы***************
BANK0 MACRO
BCF STATUS,RP1
BCF STATUS,RP0
ENDM
;
BANK1 MACRO
BCF STATUS,RP1
BSF STATUS,RP0
ENDM
;
BANK2 MACRO
BSF STATUS,RP1
BCF STATUS,RP0
ENDM
;
BANK3 MACRO
BSF STATUS,RP1
BSF STATUS,RP0
ENDM
;////////////////////////////////////////////////////////////////

org 0x00
clrf INTCON
clrf STATUS
goto main

org 0x04
movwf w_temp
movfw STATUS
clrf STATUS
movwf status_temp
movfw FSR
movwf FSR_temp

btfsc INTCON,T0IF
goto InterruptT0

goto InterruptERROR ; Ошибка в прерываниях!


;////////////////////////////////////////////////////////////////
;//
;// Обработчик прерываний таймера T0
;// T0 работает с частотой T0Clock (смотри main.h)
;//
InterruptT0:
movlw T0
addwf TMR0,f

call tblsin
movwf CCPR2L

incf psin,f
movlw TblSise
subwf psin,w
skpc
goto InterruptT0_10
clrf psin

InterruptT0_10:
bcf INTCON,T0IF

;////////////////////////////////////////////////////////////////
;//
;// Выход из обработчика прерываний
;//
Interrupt_exit:
clrwdt
movfw FSR_temp
movwf FSR
movfw status_temp
movwf STATUS
swapf w_temp,f
swapf w_temp,w
retfie

;////////////////////////////////////////////////////////////////
;//
;// Обработчик ошибок в прерываниях
;//
InterruptERROR:
goto Interrupt_exit

tblsin:
;// Размер 128 отсчётов
movfw psin
andlw 0x7f ; побитное И константы и W
addwf PCL,f ; сложить W и f
retlw .128 ; возврат из подпрограммы с загрузкой константы в W
retlw .134
retlw .140
retlw .146
retlw .152
retlw .158
retlw .165
retlw .170
retlw .176
retlw .182
retlw .188
retlw .193
retlw .198
retlw .203
retlw .208
retlw .213
retlw .218
retlw .222
retlw .226
retlw .230
retlw .234
retlw .237
retlw .240
retlw .243
retlw .245
retlw .248
retlw .250
retlw .251
retlw .253
retlw .254
retlw .254
retlw .255
retlw .255
retlw .255
retlw .254
retlw .254
retlw .253
retlw .251
retlw .250
retlw .248
retlw .245
retlw .243
retlw .240
retlw .237
retlw .234
retlw .230
retlw .226
retlw .222
retlw .218
retlw .213
retlw .208
retlw .203
retlw .198
retlw .193
retlw .188
retlw .182
retlw .176
retlw .170
retlw .165
retlw .158
retlw .152
retlw .146
retlw .140
retlw .134
retlw .128
retlw .121
retlw .115
retlw .109
retlw .103
retlw .97
retlw .90
retlw .85
retlw .79
retlw .73
retlw .67
retlw .62
retlw .57
retlw .52
retlw .47
retlw .42
retlw .37
retlw .33
retlw .29
retlw .25
retlw .21
retlw .18
retlw .15
retlw .12
retlw .10
retlw .7
retlw .5
retlw .4
retlw .2
retlw .1
retlw .1
retlw .0
retlw .0
retlw .0
retlw .1
retlw .1
retlw .2
retlw .4
retlw .5
retlw .7
retlw .10
retlw .12
retlw .15
retlw .18
retlw .21
retlw .25
retlw .29
retlw .33
retlw .37
retlw .42
retlw .47
retlw .52
retlw .57
retlw .62
retlw .67
retlw .73
retlw .79
retlw .85
retlw .90
retlw .97
retlw .103
retlw .109
retlw .115
retlw .121


;////////////////////////////////////////////////////////////////
; З А Д Е Р Ж К А !!!!!
delay
movwf cnt0
delay1 movlw .12
movwf cnt1
delay3 movlw .207
movwf cnt2
delay2
decfsz cnt2,f
goto delay2
decfsz cnt1,f
goto delay3
decfsz cnt0,f
goto delay1
return

;////////////////////////////////////////////////////////////////
CCP
Fout equ .20 ; Частота ШИМ
T0Clock equ Fout*TblSise ; Частота прерываний таймера T0 (Гц)
T0Prescaler equ .1 ; Предделитель таймера T0
T0 equ -Fclk/(.4*T0Prescaler*T0Clock)+.3 ; Константа для перезагрузки таймера T0

return
;////////////////////////////////////////////////////////////////
SIN
BANK0
movlw ((1<<CCP2M3)|(1<<CCP2M2)|(1<<CCP2X)|(1<<CCP2Y))
movwf CCP2CON
movlw (1<<GIE)|(1<<T0IE)
movwf INTCON
return
;////////////////////////////////////////////////////////////////
PILA
BANK0
movlw ((1<<CCP2M3)|(1<<CCP2M2)|(1<<CCP2X)|(1<<CCP2Y))
movwf CCP2CON
movlw (0<<GIE)|(0<<T0IE)
movwf INTCON

return
;////////////////////////////////////////////////////////////////
opros

bsf ADCON0,2 ;пуск A/D преобразования
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
movfw ADRESH ;получить результат преобразования
movwf H_byte

return
;////////////////////////////////////////////////////////////////
;//
;// Начало основной программы
;//

main


BANK1
movlw b'00001111'
movwf OPTION_REG ; МАКСИМАЛЬНОЕ ВРЕМЯ ДЛЯ wdt



BANK0
CLRF PORTD

BANK1
movlw 0x06 ; Конфигурируем все контакты как аналоговые входы выходы .0
movwf ADCON1

clrf PORTA
movlw 0xCF
movwf TRISA ; КООНФИГУРИРУЕМ PORTA КАК ВХОДЫ RA1(1) RA2(2) RA3(3) RA4(+) 1e
movlw 0x00
movwf TRISD

BANK0
movlw .249 ; включаем ацп
movwf ADCON0
nop
nop
bcf ADCON0,2
BANK1
movlw (1<<NOT_RBPU)|(0<<T0CS)|(1<<PSA)|(1<<PS2)|(1<<PS1) |(1<<PS0)
movwf OPTION_REG
movlw .255
movwf PR2
movlw ~((1<<CCP2)|(0<<CCP1))
movwf TRISC
BANK0

movlw (1<<TMR2ON)|(0<<T2CKPS1)|(0<<T2CKPS0)
movwf T2CON
clrf psin
CALL CCP
CLRFWDT
goto MainLoop

;////////////////////////////////////////////////////////////////

;//
;// Основной цикл
;//

MainLoop


call opros ; опрос АЦП
bcf ADCON0,2
movf H_byte,0


BTFSS PORTA,RA1
CALL KEY_RA1

BTFSS PORTA,RA2
CALL KEY_RA2

BTFSC PORTA,RA3
CALL KEY_RA3

BTFSS PORTA,RA4
CALL KEY_RA4

movwf PORTD

goto MainLoop

;////////////////////////////////////////////////////////////////

KEY_RA1 ; увеличиваем частоту
CALL SIN

RETURN

;////////////////////////////////////////////////////////////////

KEY_RA2 ; увеличиваем частоту
CALL PILA

RETURN

;////////////////////////////////////////////////////////////////
KEY_RA3 ; увеличиваем частоту


RETURN

;////////////////////////////////////////////////////////////////

KEY_RA4 ; уменьшаем частоту



RETURN

;////////////////////////////////////////////////////////////////

;////////////////////////////////////////////////////////////////
;////////////////////////////////////////////////////////////////
END


проект в протеусе

Скачать файл pic16f877.rar
jin_jin
форумачне выручайте может у кого есть кусочек когда на асме где реализовано регулирование ШИМ от кнопок
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.