;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ;@ Отправляет данные с АЦП на RS232 по требованию компьютера. @ ;@ Для PIC16F873. Copyright (C) 2000 by Кауфман Владимир Сергеевич. @ ;@ Email:qwerty@nara.ru @ ;@ Последнее обновление: 28 февраля 2000 г. @ ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ; Характеристики: ; Frequence = 4MHz. ;***************************************************************************** list p=16f873 ; list directive to define processor #include ; processor specific variable definitions __CONFIG _CP_OFF & _WDT_OFF & _BODEN_ON & _PWRTE_ON & _HS_OSC & _WRT_ENABLE_ON & _LVE_OFF ;& _CPD_OFF ;---------------------------- ;***************************************************************************** ; Порт A. PORTA_IO_MAP equ b'00000001'; (1 - вход, 0 - выход). ;#define PORTA,0 ; Аналоговый вход. ;#define PORTA,1 ;#define PORTA,2 ;#define PORTA,3 ;#define PORTA,4 #define RED_LED PORTA,5 ; Красный светодиод. ; Порт B. PORTB_IO_MAP equ b'00000001'; (1 - вход, 0 - выход). ;#define PORTB,0 ;#define PORTB,1 ;#define PORTB,2 ;#define PORTB,3 ;#define PORTB,4 ;#define PORTB,5 ;#define PORTB,6 ;#define PORTB,7 ; Порт C. PORTC_IO_MAP equ b'11100000'; (1 - вход, 0 - выход). ;#define PORTC,0 ;#define PORTC,1 ;#define PORTC,2 ;#define PORTC,3 ;#define PORTC,4 #define BUTTON PORTC,5 ;#define PORTC,6 ;#define PORTC,7 ;***************************************************************************** ;******************** РЕГИСТРЫ ********************** org 0x20 ; Адрес начала ОЗУ. fCOUNTER res 1 ; Счетчик только для локального пользования. fCOUNTER2 res 1 ; Счетчик2. fW_TEMP res 1 ; Для сохранения W при прерывании. status_temp res 1 ; Для сохранения STATUS при прерывании. ;**************************************************** ;============================================================================= ;============================================================================= ;============================================================================= ORG 0x000 ; processor reset vector clrf PCLATH ; ensure page bits are cleared goto start ; go to beginning of program ORG 0x004 ; interrupt vector location goto Interrupt ;============================================================================= ;----------------------------------------------------------------------------- ;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< ; О Б Р А Б О Т К А П Р Е Р Ы В А Н И Й ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Interrupt: movwf fW_TEMP ; save off current W register contents movf STATUS,w ; move status register into W register bcf STATUS,RP0 ; ensure file register bank set to 0 movwf status_temp ; save off contents of STATUS register btfsc INTCON,T0IF goto Timer0_Handler btfsc PIR1,TMR1IF goto Timer1_Handler ; Далее располагаются обработчики прерывания. ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; Прерывание от таймера 0. Timer0_Handler: goto Int_Exit ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; Прерывание от таймера 1. Timer1_Handler: bcf PIR1,TMR1IF goto Int_Exit ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Int_Exit: bcf STATUS,RP0 ; ensure file register bank set to 0 movf status_temp,w ; retrieve copy of STATUS register movwf STATUS ; restore pre-isr STATUS register contents swapf fW_TEMP,f swapf fW_TEMP,w ; restore pre-isr W register contents retfie ; return from interrupt ;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< ; Н А Ч А Л О П Р О Г Р А М М Ы ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> ;----------------------------------------------------------------------------- start: ;//////////////////// Б А Н К 1 //////////////////////////// bsf STATUS,RP0 ; Банк 1. ; Направляем порты на ввод/вывод. movlw PORTA_IO_MAP ; порт A. movwf TRISA movlw PORTB_IO_MAP ; порт B. movwf TRISB movlw PORTC_IO_MAP ; порт C. movwf TRISC ; Инициализируем таймер 0. movlw B'00000001' ; Активные нагрузки подключены (бит 7 = 0). movwf OPTION_REG bcf STATUS,RP0 ; Банк 0. ;//////////////////// Б А Н К 0 //////////////////////////// call USART_Init call AD_Init movlw 0 call Big_delay ; bsf INTCON,GIE ;----------------------------------------------------------------------------- ;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< ; -- -- ---- --- - - ; - --- - - - - -- - ; - - - - - - - - ; - - ------ - - - - ; - - - - --- - -- ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> MainLoop: ; Ждем, пока с компьютера не придет любой байт. ML_Wait_Read_CMD: bsf RED_LED btfss PIR1,RCIF goto ML_Wait_Read_CMD ; Приняли байт. movf RCREG,w ; Сбрасываем флаг приема. bcf RED_LED ; Запускаем аналого-цифровое преобразование. bsf ADCON0,GO ML_AD_Wait1: btfsc ADCON0,GO ; Ждем, когда закончится преобразование. goto ML_AD_Wait1 movf ADRESH,w ; Берем только старшие 8 бит результата. movwf TXREG ; Отправляем. movlw 10 call Big_delay goto MainLoop ;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< ; П Р О Ц Е Д У Р Ы ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> ;----------------------------------------------------------------------------- ; Большая задержка. Big_delay: ;=770*x+1 x=(delay-5)/770 Учитывая выполнение call и return. movwf fCOUNTER2 clrf fCOUNTER BD_Loop94: decfsz fCOUNTER,f goto BD_Loop94 decfsz fCOUNTER2,f goto BD_Loop94 return ;----------------------------------------------------------------------------- delay: movwf fCOUNTER D_Loop36: decfsz fCOUNTER,1 goto D_Loop36 return ;----------------------------------------------------------------------------- ;USART_Init: bsf STATUS,RP0 ; Go to Bank1 movlw B'00100100' ; 8-bit transmit, transmitter enabled, movwf TXSTA ; asynchronous mode, BRGH=1 (high speed mode) movlw d'25' ; Set Baud rate 9600 movwf SPBRG ; bsf PIE1,TXIE ; Enable transmit interrupts ; bsf PIE1,RCIE ; Enable receive interrupts bsf STATUS,RP0 ; Go to Bank 0 movlw B'10000000' ; ENABLE PORT FOR RX AND TX movwf RCSTA ; '' bsf RCSTA,CREN ; ENABLE CONTINIOUS RECEIVE return ;----------------------------------------------------------------------------- USART_Init: ; ; Скорость обмена. bsf STATUS,RP0 ; Банк 1. movlw d'25' movwf SPBRG ; Режим высоких скоростей. bsf TXSTA,BRGH ; Разрешаем асинхронный последовательный порт. bcf TXSTA,SYNC bcf STATUS,RP0 ; Банк 0. bsf RCSTA,SPEN ; ;---------------------Инициализируем передатчик------------------------------- ; bsf STATUS,RP0 ; Банк 1. ; Запрещаем прерывание по окончании передачи. bcf PIE1,TXIE ; Запрещаем передачу девятого бита. bcf TXSTA,TX9 ; Разрешаем передачу. bsf TXSTA,TXEN ; ;----------------------Инициализируем приемник-------------------------------- ; ; Разрешаем прерывание по окончании приема. ; bsf PIE1,RCIE bcf STATUS,RP0 ; Банк 0. ; Запрещаем прием девятого бита. bcf RCSTA,RX9 ; Запрещаем адресацию. bcf RCSTA,ADDEN ; Разрешаем прием. bsf RCSTA,CREN return ;----------------------------------------------------------------------------- AD_Init: bsf STATUS,RP0 ; Выбираем банк 1. movlw 0x0E ; Конфигурируем аналоговые входы movwf ADCON1 ; Результат "left justified". ; bsf PIE1,ADIE ; Разрешаем прерывания от АЦП-модуля. bcf STATUS,RP0 ; Выбираем банк 0. movlw 0xC1 ; Тактирование RC, АЦП включен, выбран канал 0. movwf ADCON0 ; bcf PIR1,ADIF ; Сбрасываем флаг прерывания АЦП. ; bsf INTCON,PEIE ; Разрешаем прерывания от периферийных модулей. return ; ; Необходимо, чтобы требуемое время сэмплирования для выбранного ; канала прошло. Только после этого можно запускать преобразование. ; ;bsf ADCON0,GO ; Запускаем аналого-цифровое преобразование. ; ; По завершении преобразования будет установлен ; флаг ADIF и сброшен бит GO/DONE. ;----------------------------------------------------------------------------- END ; directive 'end of program'