;********************************************************************** ; This file is a basic code template for assembly code generation * ; on the PICmicro PIC16F876A. This file contains the basic code * ; building blocks to build upon. * ; * ; If interrupts are not used all code presented between the ORG * ; 0x004 directive and the label main can be removed. In addition * ; the variable assignments for 'w_temp' and 'status_temp' can * ; be removed. * ; * ; Refer to the MPASM User's Guide for additional information on * ; features of the assembler (Document DS33014). * ; * ; Refer to the respective PICmicro data sheet for additional * ; information on the instruction set. * ; * ;********************************************************************** ; * ; Filename: xxx.asm * ; Date: * ; File Version: * ; * ; Author: * ; Company: * ; * ; * ;********************************************************************** ; * ; Files required: * ; * ; * ; * ;********************************************************************** ; * ; Notes: * ; * ; * ; * ; * ;********************************************************************** list p=16f876A ; list directive to define processor #include ; processor specific variable definitions __CONFIG _CP_OFF & _WDT_OFF & _BODEN_OFF & _PWRTE_ON & _HS_OSC & _WRT_OFF & _LVP_OFF & _CPD_OFF ; '__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. ;***** VARIABLE DEFINITIONS w_temp EQU 0x71 ; variable used for context saving status_temp EQU 0x72 ; variable used for context saving pclath_temp EQU 0x73 ; variable used for context saving indications EQU 0x74 ;********************************************************************** ORG 0x000 ; processor reset vector nop ; nop required for icd 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 movf PCLATH,w ; move pclath register into w register movwf pclath_temp ; save off contents of PCLATH register ; isr code can go here or be located as a call subroutine elsewhere movf pclath_temp,w ; retrieve copy of PCLATH register movwf PCLATH ; restore pre-isr PCLATH register contents 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 main ; remaining code goes here bcf STATUS, RP0 bcf STATUS, RP1 clrf PORTB clrf PORTA bsf STATUS,RP0 movlw 0x00 movwf TRISA movwf TRISB bcf STATUS,RP0 movlw 0xff movwf PORTB movwf PORTA call USART_initialize call USART_Baud_rate_adjust loop RS232in bcf STATUS,RP0 btfss PIR1, RCIF ; are data there? goto RS232in ; no, still no data there movfw RCREG ; RS232-Register select movwf indications ; and into the memory after 'indications' write movwf PORTB goto loop USART_initialize BSF STATUS, RP0 ; Bank1 MOVLW 0x24 ; Transmitter:RS232 , BRGH bit is set MOVWF TXSTA ; BCF STATUS, RP0 ; Bank 0 MOVLW 0x90 ; Enable serial port, 8bit reception , MOVWF RCSTA ; continuous receive RETURN USART_Baud_rate_adjust BSF STATUS, RP0 ; Bank1 MOVLW 0x81 ; Set Baud guesses 9,6 KB with Fosc=20MHz MOVWF SPBRG RETURN END ; directive 'end of program'