[an error occurred while processing this directive] [an error occurred while processing this directive]
Еще совет : переменные ( ОЗУ ) лучше назови как нибудь. Так удобнее чем с номерами. И могу дать пример проги(+)
(«Телесистемы»: Конференция «Микроконтроллеры и их применение»)
[an error occurred while processing this directive] [an error occurred while processing this directive] [an error occurred while processing this directive]

Отправлено Хрыч 16 декабря 2001 г. 13:11
В ответ на: Подпрограммы надо располагать в верхних 255 байтах каждой страницы памяти(+) отправлено Хрыч 16 декабря 2001 г. 12:49

;**********************************************************************
; 2generat.asm Тестовая программа для формирования звукового *
; сигнала частотой 1 кГц и с изменяющейся по примерно синусоидальному *
; закону амплитудой. Сигнал выдается короткими пачками длит-ю по 0.5с *
; Для формир-я вых. напряжения используется ЦАП на резисторах. *
;**********************************************************************
list p=12c508a
#include
__CONFIG _CP_OFF & _WDT_ON & _MCLRE_OFF & _IntRC_OSC
;Регистры специальных;------------------------------------------------;
; функций ; АЛГОРИТМ РАБОТЫ ;
INDF EQU 00H ; ;
TMR0 EQU 01H ; ;
PCL EQU 02H ; ;
STATUS EQU 03H ; PIC12C508a ;
FSR EQU 04H ; ----__---¬ ;
OSCCAL EQU 05H ; ВЫХ VCC --+1 8+-- VSS ;
PORTB EQU 06H ; ¦ ¦ ¦ ;
;Регистры ОЗУ ; +-------+----+--+2 7+-+----+------¬ ;
COUNT1 EQU 07H ; -+¬ ¦ ¦ -+¬ ;
COUNT2 EQU 08H ; ¦ ¦ ---+----+--+3 6+-+----+-¬ ¦ ¦ ;
COUNT3 EQU 09H ; LT- ¦ ¦ ¦ ¦ LT- ;
COUNT4 EQU 0AH ; ¦ ¦ --+4 5+-- ¦ ¦ ;
COUNT5 EQU 0BH ; ¦ ¦ L--------- ¦ ¦ ;
COUNT6 EQU 0CH ; ¦ ¦ ¦ ¦ ;
OUTBYTE EQU 0DH ; L----+----------+----+------------+----- ;
BUFF_PB EQU 0EH ; ;
MASK_PB EQU 0FH ; Все резисторы 5к1 ;
; ; ;
;Биты спец. регистров; ;
C EQU 0 ; ;
Z EQU 2 ; ;
PD EQU 3 ; ;
PA0 EQU 5 ; ;
GPWUF EQU 7 ;------------------------------------------------;
;
ORG 00H
MOVWF OSCCAL
GOTO START
;*********************************************************************;
; Формирование таблицы символов для заголовка в HEX файле. ;
;---------------------------------------------------------------------;
ORG 08H
LINES addwf PCL,F
dt 'G','e','n','e','r','a','t','.'
dt '.','A','.','L','.','.','.','.'
dt '.','2','0','0','1','.','.','.'
;*********************************************************************;
;=====================================================================;
; ПОДПРОГРАММЫ ;
;*********************************************************************;
ORG 30H
;
WAIT CLRWDT ;-----------------------------------------;
MOVLW 60H ; Ожидание примерно 500 мкс ( при 4МГц ) ;
MOVWF COUNT1 ; Используется рег-р COUNT1 ;
WAIT10 NOP ; ;
DECFSZ COUNT1,F ; ;
GOTO WAIT10 ;-----------------------------------------;
RETLW 0
;*********************************************************************;
; SET_PORTB ;
;---------------------------------------------------------------------;
SET_PORTB ;-----------------------------------------;
BCF PORTB,0 ; В зависимости от значения битов в ;
BTFSC OUTBYTE,0 ; OUTBYTE установить или сбросить соотв. ;
BSF PORTB,0 ; биты PORTB ;
; ; ;
BCF PORTB,1 ; В PORTB использ-ся биты 0, 1, 4, 5 ;
BTFSC OUTBYTE,1 ; ;
BSF PORTB,1 ; ;
; ; ;
BCF PORTB,4 ; ;
BTFSC OUTBYTE,2 ; ;
BSF PORTB,4 ; ;
; ; ;
BCF PORTB,5 ; ;
BTFSC OUTBYTE,3 ; ;
BSF PORTB,5 ;-----------------------------------------;
;
RETLW 0
;*********************************************************************;
; Инициализация ;
;*********************************************************************;
START MOVLW B'00001100' ;-----------------------------------------;
TRIS PORTB ;PORTB<0> - PORTB<5> - входы ;
MOVLW B'01001011' ;Входы не подвеш-ся к U пит. ;
OPTION ;Предварит-й делитель на входе WDT - 1:32 ;
CLRF MASK_PB ;-----------------------------------------;
CLRF COUNT3
;*********************************************************************;
;=====================================================================;
; ГЛАВНАЯ ПРОГРАММА ;
;=====================================================================;
;*********************************************************************;
LOOP CLRF BUFF_PB ;-----------------------------------------;
MOVF BUFF_PB,W ; Для формирования используется следующий ;
MOVWF OUTBYTE ;алгоритм: байт BUFF_PB инвертируется с ча;
CALL SET_PORTB ;стотой 1 кГц. Его биты умножаются на мас ;
; ;ку MASK_PB - байт который увеличивается ;
CALL WAIT ;на 1 каждый такт. Причем если его бит 4 ;
; ;равен 1 то этот байт тоже инвертируется ;
BTFSC COUNT3,7 ;COMF. Таким образом на ЦАП получаем ампли;
GOTO LOOP301 ;туду нарастающую 10 тактов а затем умень ;
; ;шающуюся 16 тактов. При зтом сигнал на ;
BTFSS MASK_PB,4 ;выходе модулируется по примерно синусоида;
GOTO LOOP201 ;льному закону. Закон определяется соотно ;
; ;шением резисторов ЦАП ;
COMF BUFF_PB,W ; ;
ANDWF MASK_PB,W ; ;
MOVWF OUTBYTE ; ;
BSF OUTBYTE,0 ;
CALL SET_PORTB ; ;
GOTO LOOP301 ; ;
; ; ;
LOOP201 COMF BUFF_PB,F ; ;
COMF MASK_PB,W ; ;
ANDWF BUFF_PB,W ; ;
MOVWF OUTBYTE ; ;
BSF OUTBYTE,0 ;
CALL SET_PORTB ; ;
; ; ;
LOOP301 ; ;
INCF MASK_PB,F ; ;
BTFSS MASK_PB,7 ;
INCF COUNT3,F ; ;
; ; ;
CALL WAIT ; ;
; ; ;
GOTO LOOP ; ;
; ;-----------------------------------------;
END



Составить ответ  |||  Конференция  |||  Архив

Ответы



Перейти к списку ответов  |||  Конференция  |||  Архив  |||  Главная страница  |||  Содержание  |||  Без кадра

E-mail: info@telesys.ru