Sida 2 av 2

Postat: 27 maj 2005, 20:31:44
av Boff
Skrev en interruptbaserad kodsnutt som jag tycker är lite smidigare än att använd en massa loopar. Håll till godo. :)

Kod: Markera allt

	#include <p16F84A.inc>         ; processor specific variable definitions

	cblock 0x10
		W_TEMP
		STATUS_TEMP
		LSByte
		MIDbyte
		MSByte	
	endc

		org	0x00
		goto	start

		org	0x04

		;interruprutin
PUSH 	MOVWF W_TEMP 		; Copy W to TEMP register,
		SWAPF STATUS, W 	; Swap status to be saved into W
		MOVWF STATUS_TEMP 	; Save status to STATUS_TEMP register

		;öka värde av 24bitreg med ett
		incfsz	LSByte,f	
		goto	POP			
		incfsz	MIDbyte,f	
		goto	POP
		incfsz	MSByte,f	
		goto	POP
		
		nop					;nu har det gått en minut				


		;60s = 60000000 instruktioner vid osc. 4mhz
		;interrupt var 256:e instruktion. 60000000/256 = 234375
		;234375 = hex 39387
		;FFFFFFh - 39387h =FC6C79h
		;värdet FC6C79h stoppas i ett 24bitarsregister bestående av LSByte,MIDbyte och MSByte
		movlw	0x79
		movwf	LSByte
		movlw	0x6c
		movwf	MIDbyte
		movlw	0xfc
		movwf	MSByte

POP 	SWAPF STATUS_TEMP,W 						
		MOVWF STATUS 						
		SWAPF W_TEMP,F 	
		bcf		INTCON,T0IF
		retfie	;återgå till huvudloop
		
start	movlw	0x79
		movwf	LSByte
		movlw	0x6c
		movwf	MIDbyte
		movlw	0xfc
		movwf	MSByte

		bsf		INTCON,GIE		;tillåt interrupt
		bsf		INTCON,T0IE 	;tillåt interrupt från timer0
		bsf		STATUS,RP0		;gå till BANK1
		movlw	b'00001000'
		movwf	OPTION_REG	 	;koppla prescalern till WDT
		bcf		STATUS,RP0		;återgå till BANK0
		;timer0 kommer nu att generera ett interrupt var 256:e instruktion
loop	goto	loop
	
		end