⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 tinybld16f873.asm

📁 PIC全系列单片机的bootloader程序
💻 ASM
字号:
	; modifications made by Allan King		radix DEC	LIST      P=16F873, F=INHX8M	; change also: Configure->SelectDevice from Mplab xtal EQU 20000000		; you may also want to change: _HS_OSC _XT_OSCbaud EQU 115200			; standard TinyBld baud rates: 115200 or 19200	; The above 3 lines can be changed and buid a bootloader for the desired frequency and PIC type	;********************************************************************	;Modifications made after:	;	Tiny Bootloader		16Fxxx series		Size=100words	;	claudiu.chiculita@ugal.ro	;This should work for 16F873	;		;Now working for 16F873	;Default write must be :	bsf		EECON1,EEPGD	;Program is high, commenting out other lines made it always write to	;Data EEPROM not Program.  This logic should be reversed for all similar	;PICs, then the two lines for Data EE can be taken out if unused for any.	;	;Data EE could be brought back in, there are 2 unused words at end.	;	;Config is changed for 873 vs 873A.	;	;CB is check bank, for bank selects and the high variables.  16F873/4	;have no common high variables.  Ended up being the EEPGD, but leaving	;the CB etc in for reference.	;********************************************************************	#include "../icdpictypes.inc"	;takes care of: #include "p16fxxx.inc",  max_flash, IdTypePIC	#include "../spbrgselect.inc"	#include "../bankswitch.inc"	#define prima_adresa max_flash-100 ; 100 word in size	__CONFIG _CP_OFF & _WDT_OFF & _BODEN_ON & _PWRTE_ON & _HS_OSC & _WRT_ENABLE_ON & _LVP_OFF & _CPD_OFF	errorlevel 1, -305			; suppress warning msg that takes f as default		cblock 0x20	buffer:80	endc		cblock 0x78	crc	contor	i	cnt1	cnt2	cnt3	flag		endc	SendL macro car	movlw	car	movwf	TXREG	endm;0000000000000000000000000 RESET 00000000000000000000000000		ORG     0x0000		PAGESEL IntrareBootloader		GOTO    IntrareBootloader;&&&&&&&&&&&&&&&&&&&&&&&   START     &&&&&&&&&&&&&&&&&;----------------------  Bootloader  ----------------------;               ;PC_flash:	C1h			AddrH  AddrL  nr  ...(DataLo DataHi)...  crc;PIC_response:		id   K								K		ORG prima_adresa	nop	nop	nop	nop	org prima_adresa+4IntrareBootloader			;init serial port	clrf	STATUS					;bank0	bsf		STATUS,RP0			;BANK1_	movlw	b'00100100'	movwf	TXSTA	movlw	spbrg_value	movwf	SPBRG	BANK0_	movlw	b'10010000'	movwf	RCSTA			;wait for computer	call	Receive				sublw	0xC1				;Expect C1	skpz	goto	way_to_exit	SendL IdTypePIC				;PIC type	;SendL IdSoftVer			;firmware ver xMainLoop	clrf	STATUS				;bank0	SendL 'K'mainl	clrf	crc				;CB	call	Receive				;H		bsf STATUS,RP1			;bank2	movwf	EEADRH	movwf	flag			;CB	;used to detect if is eeprom	bsf	STATUS,RP0		;BANK1	; added for 16F873/4	movwf	flag			;CB	call	Receive		;bank0	;L		bsf STATUS,RP1			;bank2  	movwf	EEADR	call	Receive			;bank0	;count	movwf	contor			;CB	movwf	i				;CB	incf	i				;CB	movlw	buffer-1	movwf	FSRrcvoct	call	Receive			;bank0	incf	FSR	movwf	INDF	decfsz	i				;CB	goto	rcvoct		movf	crc,f			;CB	;check crc	skpz	goto	ziieroare				;write		bsf STATUS,RP1		;bank2	;bank switch 0->2	movlw	buffer	movwf	FSRwriteloop						; write 2 bytes = 1 instruction	clrwdt	movf	INDF,w	movwf	EEDATA	incf	FSR	movf	INDF,w	movwf	EEDATH	incf	FSR			BANK3_				;bank3	;bank  2->3	bsf		EECON1,EEPGD			;********set is program, should be default**	;btfss	flag,6			;CB		;only FLASH write (no more eeprom write)	;bcf		EECON1,EEPGD	bsf		EECON1,WREN	movlw	0x55	movwf	EECON2	movlw	0xaa	movwf	EECON2		bsf		EECON1,WR	nop	nopwaitwre		btfsc	EECON1,WR			;for eeprom writes (wait to finish write)	goto	waitwre	bcf		EECON1,WREN		BANK2_					;bank2	incf	EEADR				;does not cross zones	btfss	flag,6				; if writing to EEPROM, skip first counter dec.	;CB	decf	contor			;CB	decfsz	contor			;CB	goto	writeloop		goto	MainLoopziieroare	SendL 'N'	goto	mainl	  Receive	clrf	STATUS			;CB bank0	movlw	xtal/2000000+1		; for 20MHz => 11 => 1second	movwf	cnt1			;CBrpt2							clrf	cnt2			;CBrpt3	clrf	cnt3			;CBrptc		btfss PIR1,RCIF			;test RX		goto $+4		movf RCREG,w			;return in W		addwf crc,f			;CB	;compute crc		return	clrwdt	decfsz	cnt3			;CB	goto	rptc	decfsz	cnt2			;CB	goto	rpt3	decfsz	cnt1			;CB	goto	rpt2				;timeout:way_to_exit			;exit in all other cases; must be BANK0/1	;BANK0_	bcf	RCSTA,	SPEN	; deactivate UART	goto	prima_adresa;*************************************************************; After reset; Do not expect the memory to be zero,; Do not expect registers to be initialised like in catalog.            END

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -